Mivel az ellenfél mozgása is hasonlóan van megoldva, mint a játékos mozgatása ezért a vezérlő scriptje is hasonló.
Az első feladatunk viszont legyen az, hogy létrehozunk egy új scriptet hasonlóan ahhoz, ahogy a játékosnál tettük.
A Script maga az alábbi módon fog kinézni.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ZombieMove : MonoBehaviour
{
public float speed = 5.0f;
public float maxDistance = 5.0f;
public bool facingRight = true;
private Transform tr;
private Rigidbody2D rb;
private Transform player;
// Start is called before the first frame update
void Start()
{
tr = GetComponent<transform>();
rb = GetComponent<rigidbody2d>();
player = GameObject.FindGameObjectWithTag("Player").GetComponent();
}
// Update is called once per frame
void Update()
{
Vector2 start = (Vector2)tr.position;
Vector2 cel = (Vector2)player.position;
Vector2 irany = cel - start;
float tavolsag = Mathf.Sqrt(irany.x * irany.x + irany.y * irany.y);
if(tavolsag < maxDistance)
{
if(irany.x < 0)
{
rb.AddForce(new Vector2(-speed, 0.0f));
if(facingRight)
{
flip();
}
} else if(irany.y > 0)
{
rb.AddForce(new Vector2(speed, 0.0f));
if (!facingRight)
{
flip();
}
}
}
}
void flip()
{
Vector3 regiSkala = tr.localScale;
regiSkala.x *= -1;
tr.localScale = regiSkala;
facingRight = !facingRight;
}
}
Ha a script részeit nézzük, akkor most is a zombi paramétereinek megdásával kezdünk.
public float speed = 5.0f;
public float maxDistance = 5.0f;
public bool facingRight = true;
Ezek a változók fogják vezérelni az alábbiakat
- speed: Az ellenfél sebességét;
- maxDistance : Az ellenfél láttávolságát, vagyis hogy mekkora távolságból kezd el küvetni minket;
- facingRight : Azt, hogy az ellenfél jobbra néz-e.
Ezen kívül még lesz néhány segédváltozónk
private Transform tr; // A saját transform komponensünk (azon belül a pozíciónk)
private Rigidbody2D rb; // A saját RigidBody 2D komponensünk (ha meg akarnánk mozdulni)
private Transform player; // A játékos transform komponense (azon belül a pozíciója)
A program előkészítése a Start metódusban történik.
void Start()
{
tr = GetComponent<transform>();
rb = GetComponent<rigidbody2d>();
player = GameObject.FindGameObjectWithTag("Player").GetComponent();
}
Itt valójában csak le kell kérdeznünk a saját komponenseinket, hogy egyszerűbb legyen azokat elérni.
A másik feladat még a játékos megtalálása. A játékost ahogy korábban is tettük a "tag"-je vagy is címkéje alapján fogjuk megtalálni. Lekérjük a Unity-től azt a GameObject-et, aminek "Player" a tag-je, és lekérjük ennek az objektumnak a Transform komponensét. Ha ezzel megvagyunk, akkor már tudni fogjuk, hogy hol van a játékos, akit követni kell.
Végül jöhet az Update függvény, ahol maga a számítás van.
A számítás első lépése, hogy kiszámítjuk, hogy merre, és milyen messze van a játékos.
Vector2 start = (Vector2)tr.position;
Vector2 cel = (Vector2)player.position;
Vector2 irany = cel - start;
float tavolsag = Mathf.Sqrt(irany.x * irany.x + irany.y * irany.y);
Itt a start a mi jelenlegi pozíción, a cél pedig ahol a játékos áll. A pozíciókat Vector2 típusúvá kell alakítanunk, mert eredetileg 3D koordinátáink vannak, de nekünk ebből csak az X, és Y értékek kellenek.
Az irány, amerre a játékos van a két pozició különbségével kapott vektor. A vektor hosszát a pithagorasz tétel adja számunkra.
Ha megvan a távolság és az irány, akkor már csak a mozgás logikája kell.
if(tavolsag < maxDistance)
{
if(irany.x < 0)
{
rb.AddForce(new Vector2(-speed, 0.0f));
if(facingRight)
{
flip();
}
} else if(irany.y > 0)
{
rb.AddForce(new Vector2(speed, 0.0f));
if (!facingRight)
{
flip();
}
}
}
Ha "tavolsag < maxDistance" vagyis a játékos látótávon belül van, akkor pedönthetjük, hogy merre akarunk mozogni.
- Ha a "cel.x < start.x", akkor a játékos tőnük balra áll. Ebben az esetben balra kell elindulnunk.
- Ha a "cel.x > start.x", akkor a játékos tőnük jobbra áll tehát jobbra megyünk.
A programnak része még egy forgató függvény. A "flip()" függvényt akkor hívjuk meg, ha jobbra nézünk, de balra van a játékos, vagy fordítva. Ilyenkor megfordítjuk az ellenfél GameObject-jét, hogy a jó irányba nézzen. Ezt ugyanazzal a kóddal tesszük, mint ahogy a Játékos Mozgatásánál tettük.