Cómo añadir mecánicas de sigilo en Unity

Las mecánicas de sigilo son sistemas de juego que permiten a los jugadores evitar que los enemigos los detecten. Estas mecánicas, que se utilizan habitualmente en juegos basados ​​en el sigilo como Assassin's Creed o Hitman, incluyen funciones como conos de visión, detección de sonido, escondites y niveles de visibilidad del jugador. Añadir mecánicas de sigilo puede hacer que el juego sea más atractivo, ya que fomenta el pensamiento estratégico y recompensa la planificación cuidadosa.

En este tutorial, crearemos mecánicas básicas de sigilo en Unity. El jugador evitará ser detectado por enemigos que tengan conos de visión. Si el jugador entra en el cono, será detectado.

Paso 1: Preparación de la escena

Comience creando una escena Unity sencilla:

  1. Crea un nuevo proyecto Unity.
  2. Añade un Plano para que sirva como tierra.
  3. Añade un modelo 3D (por ejemplo, una cápsula) para representar al Jugador.
  4. Añade otro modelo 3D (por ejemplo, un cubo) para representar un Enemigo.
  5. Coloca al jugador y al enemigo en diferentes lugares del avión.

Paso 2: Creación del cono de visión del enemigo

Simularemos la visión del enemigo utilizando un área de disparo en forma de cono:

  1. Haga clic derecho en la Jerarquía y seleccione Crear > Objeto 3D > Cilindro.
  2. Cambie el tamaño del cilindro para que parezca un cono ajustando su escala (por ejemplo, X = 1, Y = 0.5, Z = 1).
  3. Gírelo para que la base plana mire hacia adelante (por ejemplo, Rotación X = 90).
  4. Adjúntelo como un elemento secundario del GameObject Enemy.
  5. Establezca el Collider del cono para que sea un Trigger.
  6. Ajuste la escala y la posición para que coincidan con el campo de visión del enemigo.

Paso 3: Escritura del script de detección de enemigos

Ahora, vamos a crear un script para detectar al jugador dentro del cono de visión:

  1. Cree un script en C# llamado EnemyVision.
  2. Adjunte el script al GameObject enemigo.
  3. Utilice el siguiente código:
using UnityEngine;

public class EnemyVision : MonoBehaviour
{
    public bool playerDetected = false;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            playerDetected = true;
            Debug.Log("Player Detected!");
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            playerDetected = false;
            Debug.Log("Player Lost!");
        }
    }
}

Este script comprueba si el jugador entra o sale del cono de visión. Asegúrese de que el GameObject del jugador tenga la etiqueta Player.

Paso 4: Agregar visibilidad del jugador

A continuación, implementemos una mecánica de visibilidad para que la detección sea más dinámica. Será más difícil detectar al jugador cuando esté agachado o escondido:

  1. Crea un nuevo script llamado PlayerVisibility.
  2. Adjúntelo al GameObject del jugador.
  3. Utilice el siguiente código:
using UnityEngine;

public class PlayerVisibility : MonoBehaviour
{
    public float visibility = 1.0f; // Full visibility

    void Update()
    {
        // Reduce visibility when crouching (e.g., pressing "C")
        if (Input.GetKey(KeyCode.C))
        {
            visibility = 0.5f;
            Debug.Log("Crouching: Reduced visibility!");
        }
        else
        {
            visibility = 1.0f; // Default visibility
        }
    }
}

Este script ajusta el nivel de visibilidad del jugador en función de sus acciones. Los enemigos pueden usar este valor más adelante para decidir con qué facilidad se detecta al jugador.

Paso 5: Mejorar la detección de enemigos

Ahora, combinemos la visibilidad con la detección. Modifique el script EnemyVision de la siguiente manera:

using UnityEngine;

public class EnemyVision : MonoBehaviour
{
    public bool playerDetected = false;

    void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            PlayerVisibility playerVisibility = other.GetComponent<PlayerVisibility>();

            if (playerVisibility != null && playerVisibility.visibility > 0.75f)
            {
                playerDetected = true;
                Debug.Log("Player Detected with high visibility!");
            }
            else
            {
                Debug.Log("Player not visible enough to detect.");
            }
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            playerDetected = false;
            Debug.Log("Player Lost!");
        }
    }
}

Este script utiliza el nivel de visibilidad del jugador para determinar si es detectado.

Paso 6: Prueba de la mecánica del sigilo

Para probar su configuración:

  1. Presione el botón Reproducir en el Editor Unity.
  2. Mueva al jugador hacia el cono de visión del enemigo para activar la detección.
  3. Presione el botón de agacharse (por ejemplo, "C") para reducir la visibilidad y probar cómo afecta la detección.

Mejoras opcionales

Aquí tienes algunas ideas para ampliar tus mecánicas de sigilo:

  • Detección de sonido: Agrega una mecánica donde el enemigo detecta al jugador según el ruido que hace (por ejemplo, correr).
  • Escondites: Crea escondites donde el jugador se vuelve indetectable.
  • Enemigos patrullando: Programa a los enemigos para que patrullen a lo largo de una ruta establecida utilizando el sistema NavMesh de Unity.
  • Estados de alerta: Agrega niveles de alerta para enemigos (por ejemplo, sospechoso, buscando, agresivo).

Conclusión

Hemos implementado mecánicas básicas de sigilo en Unity, incluidos conos de visión y niveles de visibilidad. Estos sistemas pueden servir como base para una jugabilidad de sigilo más compleja. Experimenta con funciones adicionales para crear una experiencia de sigilo totalmente inmersiva para tu juego.