Skip navigation

Ellenfelek elhelyezése

Zombik előkészítése

Az ellenfelek készítéséhez először el kell készítenünk egy darab Zombit. Ehhez a játékos készítéséhez hasonlóan kell eljárnunk. Keresni kell egy képet, ami az ellenfél alapját adja, és azt rá kell húznunk a színtér nézetre.

Ellenfél elkészítése 1

Ezek után pedig hosszá kell adni két komponens a Zombihoz, hogy hasson rá a fizika. Ezek a RigidBody2D ami a gravitációt és a lendületet kezeli, és a Box Collider 2D, ami ütközni "tanítja meg" a játékelemet.

Ellenfél fizikai komponensei

A vezérlő script

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.

További Beállítások

Azzal, hogy megvan a vezérlő script-ünk, sajnos még nem vagyunk készen a programmal. A Unity Editor-ban még meg kell tennünk néhány beállítást, mielőtt megfelelően működne a Zombi.

Zombi beállítása

Először is a zombi vezérlő kömponensán be kell állítanunk a megfelelő paramétereket.

Meg kell adnunk, hogy milyen messzire lát, és milyen sebességgel tud haladni az ellenfelünk.

Zombi paramétereinek beállítása

Ezen kívül ha visszaemlékszünk, akkor a zombi mozgásának az alapja, hogy azt a játékelemet követi, aminek "Player" cimkét (teg-et) állítottunk be. Így hát ezt a cimkét is be kell állítanunk a játékos GameObject-jén.

Játékos címkéjének beállítása

Ezek után már működnie is kell a zombinak.

További lehetőségek

A zombi mozgása ezen a ponton nem túl életszerű. Most még csak a talápán csúszik a talajon. Ha szeretnénk kicsit jobbá tenni, akkor adhatunk neki hasonló animációt, mint amit a játékos esetében tettünk.