Creëer een NPC die de speler in eenheid volgt

Niet-spelerpersonages of NPCs ​​zijn de personages die niet worden bestuurd door een menselijke speler en in plaats daarvan worden bestuurd door de scripts of de AI.

De meest gebruikelijke taak die NPC's moeten uitvoeren, is het volgen of achtervolgen van de speler.

In deze tutorial laat ik zien hoe je een NPC maakt die de speler in Unity volgt.

Stap 1: Maak de spelercontroller

We zullen een eenvoudige Player Controller maken, zodat we rond kunnen lopen en de NPC kunnen testen:

  • Maak een nieuw GameObject ('GameObject' -> 'Create Empty') en geef het een naam "Player"
  • Maak een nieuwe capsule ('GameObject' -> '3D Object' -> 'Capsule'), verplaats deze binnen het Spelerobject en verander de positie in (0, 1, 0)
  • Verwijder het Capsule Collider-onderdeel uit een capsule
  • Verplaats de hoofdcamera binnen het spelerobject en verander de positie in (0, 1.64, 0)
  • Maak een nieuw script, noem het 'SC_CharacterController' en plak de onderstaande code erin:

'SC_CharacterController.cs'

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_CharacterController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Camera playerCamera;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    CharacterController characterController;
    Vector3 moveDirection = Vector3.zero;
    Vector2 rotation = Vector2.zero;

    [HideInInspector]
    public bool canMove = true;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        rotation.y = transform.eulerAngles.y;
    }

    void Update()
    {
        if (characterController.isGrounded)
        {
            // We are grounded, so recalculate move direction based on axes
            Vector3 forward = transform.TransformDirection(Vector3.forward);
            Vector3 right = transform.TransformDirection(Vector3.right);
            float curSpeedX = speed * Input.GetAxis("Vertical");
            float curSpeedY = speed * Input.GetAxis("Horizontal");
            moveDirection = (forward * curSpeedX) + (right * curSpeedY);

            if (Input.GetButton("Jump"))
            {
                moveDirection.y = jumpSpeed;
            }
        }

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        moveDirection.y -= gravity * Time.deltaTime;

        // Move the controller
        characterController.Move(moveDirection * Time.deltaTime);

        // Player and Camera rotation
        if (canMove)
        {
            rotation.y += Input.GetAxis("Mouse X") * lookSpeed;
            rotation.x += -Input.GetAxis("Mouse Y") * lookSpeed;
            rotation.x = Mathf.Clamp(rotation.x, -lookXLimit, lookXLimit);
            playerCamera.transform.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • Voeg het 'SC_CharacterController'-script toe aan het Player-object en wijs een onderliggende hoofdcamera toe aan een Player Camera-variabele
  • Je zult merken dat het automatisch een ander onderdeel heeft toegevoegd, genaamd Character Controller, en de middenpositie verandert in (0, 1, 0)

Stap 2: Creëer de NPC

Volg de onderstaande stappen om een ​​NPC te maken:

  • Maak een nieuw GameObject en noem het "NPC"
  • Maak een nieuwe capsule, verplaats deze binnen het NPC-object en verander de positie in (0, 1, 0)
  • Maak een nieuw materiaal en geef het een naam "npc_material"
  • Verander de kleur van npc_material in rood
  • Wijs npc_material toe aan Capsule in het NPC-object (dit is alleen zodat we NPC kunnen onderscheiden van de speler)

Voordat we verder gaan, moeten we de NavMesh in onze scène bakken.

NavMesh staat voor "Navigation Mesh" en wordt gebruikt bij het zoeken naar paden, zodat NPC's door het level kunnen navigeren zonder tegen obstakels aan te botsen.

Om de NavMesh te bakken, volg je de onderstaande stappen:

  • Markeer elk statisch object in de scène als navigatiestatisch

  • Ga naar het navigatievenster ('Venster' -> 'AI' -> 'Navigation'), selecteer het tabblad Bakken en klik vervolgens op Bakken

Nadat de NavMesh is gebakken, zou het er ongeveer zo uit moeten zien:

Unity 3D NavMesh-bak

Nu kunnen we overgaan tot de programmering van de NPC-beweging:

  • Bevestig de 'NavMesh Agent'-component aan het NPC-object
  • Maak een nieuw script en geef het een naam 'SC_NPCFollow'
  • Voeg het 'SC_NPCFollow'-script toe aan het NPC-object
  • Open het 'SC_NPCFollow'-script

Eerst beginnen we met het toevoegen van een UnityEngine.AI-naamruimte aan het begin van het script:

using UnityEngine.AI;

Vervolgens definiëren we de noodzakelijke variabelen:

    //Transform that NPC has to follow
    public Transform transformToFollow;
    //NavMesh Agent variable
    NavMeshAgent agent;

In 'void Start()' beginnen we met het koppelen van de NavMesh Agent-component aan dit object:

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

Ten slotte instrueren we in 'void Update()' de NavMesh Agent om de speler te volgen:

    // Update is called once per frame
    void Update()
    {
        //Follow the player
        agent.destination = transformToFollow.position;
    }

Hier is het definitieve 'SC_NPCFollow.cs'-script:

using UnityEngine;
using UnityEngine.AI;

public class SC_NPCFollow : MonoBehaviour
{
    //Transform that NPC has to follow
    public Transform transformToFollow;
    //NavMesh Agent variable
    NavMeshAgent agent;

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        //Follow the player
        agent.destination = transformToFollow.position;
    }
}

Enkele problemen oplossen:

Uitgave 1: Nadat je op Play hebt gedrukt, zweeft de NPC-capsule boven de grond:

Oplossing: Verander de Base Offset-variabele in NavMesh Agent naar een negatieve waarde (in mijn geval is dit -0,08)

Probleem 2: De NPC komt te dichtbij als hij de speler volgt:

Oplossing: Verander de stopafstand in NavMesh Agent naar een hogere waarde (in mijn geval heb ik deze ingesteld op 5)

De NPC is nu klaar, laten we hem testen:

Sharp Coder Video speler

Alles werkt zoals verwacht, de NPC volgt nu de speler en stopt op een ingestelde afstand.

Voorgestelde artikelen
Implementatie van AI van een vijand in eenheid
Hoe je een FPS maakt met de AI-ondersteuning in Unity
Hoe je een AI van een hert in eenheid maakt
Herziening van het Unity Asset Store-pakket - Zombie AI-systeem
Unity Voeg vijanden toe aan een 2D-platformgame
Werken met NavMeshAgent in Unity
Dialoogsysteem voor eenheid