Tilføjelse af Stealth Mechanics i Unity

Stealth-mekanik er gameplay-systemer, der gør det muligt for spillere at undgå opdagelse af fjender. Almindeligvis brugt i stealth-baserede spil som *Assassin's Creed* eller *Hitman*, omfatter disse mekanikker funktioner såsom synskegler, lydgenkendelse, gemmesteder og spillerens synlighedsniveauer. Tilføjelse af stealth-mekanik kan gøre gameplayet mere engagerende ved at tilskynde til strategisk tænkning og belønne omhyggelig planlægning.

I denne tutorial opretter vi grundlæggende stealth-mekanik i Unity. Spilleren vil undgå opdagelse af fjender, der har synskegler. Hvis spilleren går ind i keglen, vil de blive opdaget.

Trin 1: Opsætning af scenen

Start med at lave en simpel Unity scene:

  1. Opret et nyt Unity projekt.
  2. Tilføj et Plane for at tjene som jorden.
  3. Tilføj en 3D-model (f.eks. en kapsel) for at repræsentere Player.
  4. Tilføj en anden 3D-model (f.eks. en terning) for at repræsentere en Enemy.
  5. Placer spilleren og fjenden forskellige steder på flyet.

Trin 2: Oprettelse af Enemy Vision Cone

Vi vil simulere fjendens vision ved hjælp af et kegleformet udløserområde:

  1. Højreklik i hierarkiet og vælg Opret > 3D-objekt > Cylinder.
  2. Tilpas cylinderens størrelse, så den ligner en kegle ved at justere dens skala (f.eks. X = 1, Y = 0,5, Z = 1).
  3. Drej den, så den flade base vender fremad (f.eks. Rotation X = 90).
  4. Vedhæft det som et barn af Enemy GameObject.
  5. Indstil keglens Collider til at være en Trigger.
  6. Juster skalaen og positionen, så den matcher fjendens synsfelt.

Trin 3: Skrivning af fjendedetektionsscriptet

Lad os nu oprette et script til at detektere afspilleren i visionskeglen:

  1. Opret et C#-script kaldet EnemyVision.
  2. Vedhæft scriptet til Enemy GameObject.
  3. Brug følgende kode:
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!");
        }
    }
}

Dette script kontrollerer, om spilleren går ind eller ud af synskeglen. Sørg for, at Player GameObject har tagget Player.

Trin 4: Tilføjelse af spillersynlighed

Lad os derefter implementere en synlighedsmekaniker for at gøre detektion mere dynamisk. Spilleren vil være sværere at opdage, når han sidder på hug eller gemmer sig:

  1. Opret et nyt script kaldet PlayerVisibility.
  2. Vedhæft det til Player GameObject.
  3. Brug følgende kode:
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
        }
    }
}

Dette script justerer spillerens synlighedsniveau baseret på deres handlinger. Fjender kan senere bruge denne værdi til at afgøre, hvor let spilleren opdages.

Trin 5: Forbedring af fjendedetektion

Lad os nu kombinere synlighed med detektion. Rediger EnemyVision scriptet som følger:

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!");
        }
    }
}

Dette script bruger afspillerens synlighedsniveau til at afgøre, om de registreres.

Trin 6: Test af stealth-mekanikken

Sådan tester du din opsætning:

  1. Tryk på knappen Play i Unity Editor.
  2. Flyt spilleren ind i fjendens synskegle for at udløse detektion.
  3. Tryk på croucheknappen (f.eks. "C") for at reducere synlighed og teste, hvordan det påvirker detektion.

Valgfrie forbedringer

Her er nogle ideer til at udvide din stealth-mekanik:

  • Lydregistrering: Tilføj en mekaniker, hvor fjenden registrerer spilleren baseret på den støj, de laver (f.eks. løb).
  • Skjul pletter: Skab gemmesteder, hvor spilleren bliver uopdagelig.
  • Patruljerende fjender: Programmer fjender til at patruljere langs en bestemt sti ved hjælp af Unitys NavMesh-system.
  • Alarmstater: Tilføj alarmniveauer for fjender (f.eks. mistænkelige, søgende, aggressive).

Konklusion

Vi har implementeret grundlæggende stealth-mekanik i Unity, inklusive synskegler og synlighedsniveauer. Disse systemer kan tjene som grundlaget for mere kompleks stealth-gameplay. Eksperimenter med yderligere funktioner for at skabe en fuldstændig fordybende stealth-oplevelse til dit spil.