Cómo hacer que un NPC persiga al jugador en Unity usando NavMesh

En este tutorial, utilizaremos el sistema NavMesh de Unity para crear un NPC que persigue al jugador. NavMesh ofrece una búsqueda de rutas y una evitación de obstáculos eficientes, lo que lo hace ideal para el comportamiento de la IA en entornos 3D.

Paso 1: Preparación de la escena

Antes de implementar NavMesh, necesitamos una configuración de escena adecuada:

  1. Crea un nuevo proyecto 3D en Unity.
  2. Añade un Plano para que sirva como tierra.
  3. Agrega un Cubo o cualquier modelo 3D para representar al Jugador. Nómbralo Jugador.
  4. Añade otro Cubo o modelo 3D para representar al NPC. Nómbralo NPC.
  5. Coloca al jugador y al NPC en diferentes posiciones en el plano.

Paso 2: Hornear el NavMesh

Para utilizar el sistema NavMesh de Unity, necesitamos hornear la malla de navegación:

  1. Seleccione el plano de tierra en la jerarquía.
  2. En el Inspector, haga clic en Agregar componente y agregue una NavMeshSurface.
  3. En el componente NavMeshSurface, asegúrese de que el plano esté marcado como una superficie transitable.
  4. Haga clic en el botón Bake en el componente NavMeshSurface para generar el NavMesh.
  5. Opcional: si tienes obstáculos (por ejemplo, paredes), asegúrate de que tengan componentes NavMeshObstacle para bloquear el movimiento de los NPC.

Paso 3: Agregar un NavMeshAgent

Ahora, prepararemos al NPC para usar la búsqueda de rutas de Unity:

  1. Seleccione el NPC en la jerarquía.
  2. En el Inspector, haga clic en Agregar componente y agregue un NavMeshAgent.
  3. Ajuste las propiedades de NavMeshAgent según sea necesario, como la velocidad, la aceleración y la distancia de frenado.

Paso 4: Escritura del guión de Chase

A continuación, crearemos un script para hacer que el NPC persiga al jugador:

  1. Haz clic derecho en el panel Proyecto y selecciona Crear > Script de C#. Asígnale el nombre NPCChase.
  2. Haga doble clic en el script para abrirlo en su editor de código.
  3. Reemplace el código predeterminado por el siguiente:
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);
        }
    }
}

Paso 5: Asignación de la referencia del script y del jugador

Finalmente, asignaremos el script y configuraremos la referencia del jugador:

  1. Seleccione el NPC en la jerarquía.
  2. Arrastre y suelte el script NPCChase sobre el NPC.
  3. En el Inspector, localice el campo Player en el script.
  4. Arrastre el GameObject Jugador desde la Jerarquía al campo Jugador.

Paso 6: Probar la escena

Para probar su configuración:

  1. Presione el botón Reproducir en el Editor Unity.
  2. Mueva el reproductor (por ejemplo, utilizando el teclado o el controlador).
  3. Observa cómo el NPC busca dinámicamente el camino y persigue al jugador, evitando obstáculos cuando sea posible.

Opcional: Personalización del comportamiento

Puedes refinar aún más el comportamiento de tu NPC:

  • Distancia de detención: Ajuste la Distancia de detención del NavMeshAgent para hacer que el NPC se detenga en un rango determinado.
  • Evitación de obstáculos: Asegúrese de que los obstáculos tengan componentes NavMeshObstacle para evitarlos con precisión.
  • Animaciones: Usa animaciones para hacer que el movimiento del NPC sea más realista activando animaciones basadas en la velocidad.

Conclusión

Hemos creado un NPC que persigue dinámicamente al jugador mediante el sistema NavMesh de Unity. Este enfoque es sólido y se puede ampliar fácilmente para lograr comportamientos de IA más complejos. Experimenta con diferentes configuraciones para adaptar la búsqueda de rutas del NPC a las necesidades de tu juego.