Come far sì che un PNG insegua il giocatore in Unity usando NavMesh

In questo tutorial, useremo il sistema NavMesh di Unity per creare un NPC che insegue il Player. NavMesh fornisce un efficiente pathfinding e un evitamento degli ostacoli, rendendolo ideale per il comportamento dell'IA in ambienti 3D.

Fase 1: Impostazione della scena

Prima di implementare NavMesh, abbiamo bisogno di una corretta configurazione della scena:

  1. Crea un nuovo progetto 3D in Unity.
  2. Aggiungere un Piano che funga da base.
  3. Aggiungi un Cubo o qualsiasi modello 3D per rappresentare il Giocatore. Chiamalo Giocatore.
  4. Aggiungi un altro Cubo o modello 3D per rappresentare il PNG. Chiamalo NPC.
  5. Posiziona il Giocatore e il PNG in posizioni diverse sul Piano.

Fase 2: Cottura del NavMesh

Per utilizzare il sistema NavMesh di Unity, dobbiamo preparare la mesh di navigazione:

  1. Selezionare il piano terra nella gerarchia.
  2. Nell'Inspector, fare clic su Aggiungi componente e aggiungere NavMeshSurface.
  3. Nel componente NavMeshSurface, assicurati che il piano sia contrassegnato come superficie calpestabile.
  4. Fare clic sul pulsante Bake nel componente NavMeshSurface per generare NavMesh.
  5. Facoltativo: se hai degli ostacoli (ad esempio muri), assicurati che abbiano componenti NavMeshObstacle per bloccare il movimento dei PNG.

Passaggio 3: aggiunta di un NavMeshAgent

Ora prepareremo il PNG a utilizzare il pathfinding di Unity:

  1. Seleziona il PNG nella Gerarchia.
  2. Nell'Inspector, fare clic su Aggiungi componente e aggiungere un NavMeshAgent.
  3. Regolare le proprietà di NavMeshAgent in base alle proprie esigenze, ad esempio velocità, accelerazione e distanza di arresto.

Fase 4: Scrittura della sceneggiatura dell'inseguimento

Successivamente, creeremo uno script per far sì che il PNG insegua il Giocatore:

  1. Fare clic con il pulsante destro del mouse nel pannello Progetto e selezionare Crea > Script C#. Assegnare il nome NPCChase.
  2. Fare doppio clic sullo script per aprirlo nell'editor di codice.
  3. Sostituisci il codice predefinito con il seguente:
using UnityEngine;
using UnityEngine.AI;

public class NPCChase : MonoBehaviour
{
    public Transform player; // Reference to the player's position
    private NavMeshAgent agent; // Reference to the NavMeshAgent

    void Start()
    {
        // Get the NavMeshAgent component
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (player != null)
        {
            // Set the agent's destination to the player's position
            agent.SetDestination(player.position);
        }
    }
}

Fase 5: Assegnazione dello script e del riferimento del lettore

Infine, assegneremo lo script e imposteremo il riferimento Player:

  1. Seleziona il PNG nella Gerarchia.
  2. Trascina e rilascia lo script NPCChase sul PNG.
  3. Nell'Inspector, individua il campo Player nello script.
  4. Trascinare il GameObject Player dalla Gerarchia al campo Player.

Fase 6: Test della scena

Per testare la tua configurazione:

  1. Premere il pulsante Play nell'editor Unity.
  2. Spostare il Player (ad esempio, utilizzando la tastiera o il controller).
  3. Osserva il PNG che individua dinamicamente il percorso e insegue il Giocatore, evitando gli ostacoli ove possibile.

Facoltativo: personalizzazione del comportamento

Puoi perfezionare ulteriormente il comportamento del tuo PNG:

  • Distanza di arresto: Regola la Distanza di arresto del NavMeshAgent per far fermare il PNG a una certa distanza.
  • Evitamento degli ostacoli: Assicurati che gli ostacoli abbiano componenti NavMeshObstacle per evitarli in modo accurato.
  • Animazioni: Utilizza le animazioni per rendere più realistico il movimento dei PNG attivando le animazioni in base alla velocità.

Conclusione

Abbiamo creato un NPC che insegue dinamicamente il Player usando il sistema NavMesh di Unity. Questo approccio è robusto e può essere facilmente ampliato per comportamenti AI più complessi. Sperimenta diverse impostazioni per adattare il pathfinding dell'NPC alle esigenze del tuo gioco.