Mi is az a NavMesh?

NavMesh alapok

A NavMesh a Unity navigációs rendszerének az alapja. A NavMesh a Navigation Mesh rövid formája, amely navigációs hálót jelent. Ez a háló tartalmazza a bejárható területet az AI-k számára. A területet magunk is elkészíthetjük, vagy a scene geometriájából generálhatjuk és bake-elhetjük. A navigációs rendszernek négy alapvető alkotóeleme van:

  • NavMesh: Ez maga a struktúra, amely bejárható. Ennek létrehozásával indul az egész NavMesh rendszer használata. A navigáció tulajdonképpen ez alapján történik.
  • NavMesh Agent: E komponens segít létrehozni azokat a karaktereket, amelyek egymást elkerülve haladnak a céljuk felé. A agent-ek a NavMesh-t használják arra, hogy “megértésék” a pályát.
  • Off-Mesh Link: Ez a komponens a gyalog nem átjárható területeket áthidalására szolgál. Két olyan pontot köthetünk vele össze, amelyeket csak ugrással, ajtónyitással vagy más, nem szokványos módon lehet elérni.
  • NavMesh Obstacle: Olyan elem, amelyet az agent megpróbál elkerülni, miközben áthalad a scene-en. Ilyen objektum lehet például egy hordó vagy láda. Ha az objektum mozog, az agent megpróbálja elkerülni, de ha már nem mozog az akadály, akkor a NavMesh-ből kivágja a saját statikus helyét.

Érdekel a játékfejlesztés? Gyere el látogass el bemutató napunkra!

NavMesh Agent létrehozása

Az agent feladata, hogy a játéktérben az egyik helyről eljusson a másikra. Ez a hely lehet egy térbeli pont, egy gameobject, de menet közben, dinamikusan is állíthatjuk.

Készítsünk egy új projektet és építsünk fel egy alap játékteret:

Alap scene

A scene-ben lévő gameobject-ek:

  • Ground (Plane): A sík, amelyen az összes többi gameobject-et elhelyezzük. Ez a sík tartalmazza a bejárható területet.
  • Obstacles: Ez egy üres gameobject. Ennek a gyerekei lesznek a tulajdonképpeni akadályok. Minden objektumhoz fog tartozni még egy Mesh Renderer komponens is.
  • Destination (sárga kocka): A célként szolgáló gameobject.
  • Player (zöld kocka): A játéktérben navigáló gameobject, amelynek el kell jutnia a Destination nevű objektumhoz.

Válasszuk ki a Player objektumot a Hierarchy nézetben. Az Inspector nézetben adjuk hozzá a Nav Mesh Agent komponenst:

Nav Mesh Agent hozzáadása

Nyissuk meg a navigációs panelt (Window / Navigation):

Ha nincs kiválasztva semmilyen gameobject, akkor a következőt kell látnunk:

Válasszuk ki a talajt és az összes akadályt és jelöljük meg őket statikus objektumoknak. Ezekhez a gameobject-ekhez Mesh Renderer komponensnek is tartoznia kell:

Statikus objektumok

Miután kiválasztottuk az összes akadályt (Obstacles összes gyereke), állítsuk őket Non Walkable-re. Alapbeállításban minden gameobject walkable, azaz bejárható:

Akadályok (Non Walkable)

A talajnak pedig járhatónak kell maradnia:

NavMesh Bake-elés

A navigáció panelen a Bake lapon a Bake gombra kattintva generálhatunk új NavMesh-t. Az alapbeállítások jelenleg nekünk jók, így ezeket nem kell átállítani.

  • Agent Radius: Meghatározza, hogy az agent középpontja milyen közel mehet a nem bejárható objektumokhoz.
  • Agent Height: Az agent magassága. Túl alacsony helyre nem próbál meg bemenni.
  • Max Slope: A legnagyobb emelkedő, amin még felmegy az agent.
  • Step Height: A legnagyobb magasság, amin még fel tud lépni a agent.

Miután rákattintottunk a Bake gombra, a Unity új NavMesh-t generál nekünk. A nem bejárható gameobject-ek kikerülnek a hálóból:

Elkészült NavMesh

Az útvonalakat a Scene mappában találjuk meg, mint NavMesh (Assets / Scene / Navmesh):

Mozgás szkriptelése

Készítsünk egy szkriptet, amelyet utána hozzáadunk a Player gameobject-hez:

using UnityEngine;
using UnityEngine.AI;

public class NavMeshDemo : MonoBehaviour {

GameObject destination;
NavMeshAgent navMeshAgent;

// Use this for initialization
void Start () {
    destination = GameObject.Find (“Destination”);
    navMeshAgent = GetComponent ();
   navMeshAgent.SetDestination(destination.transform.position);
}

// Update is called once per frame
void Update () {
}
}

Egy kis értelmezés a kódhoz:

  1. destination = GameObject.Find (“Destination”) : Megkeressük a Destination nevű gameobject-et és egy destination nevű változóba helyezzük.
  2. navMeshAgent = GetComponent () : A navMeshAgent változóban elhelyezzük a agent-ünket.
  3. navMeshAgent.SetDestination(destination.transform.position) : Az elhelyezett agent-ünk céljának beállítjuk a destination transform pozícióját.

Alternatív megoldás, ha a destination-t public-ká tesszük és abba a Unity szerkesztőjében behúzzuk a célként szolgáló objektumot, így azt már nem kell kódból beállítanunk.

Indítsuk el a programot! A Player gameobject-nek el kell tudni navigálni a Destination gameobject-hez a navigációs háló segítségével. Ez lenne tehát a NavMesh alapja. Nagyon egyszerű a pályánk, de már könnyebben el fogunk tudni indulni az AI vezérelte objektumok felé.

NavMesh animáció

Forrás: Gyanendu Shekhar’s Blog

Skeldar