Lägger till Stealth Mechanics i Unity

Stealth-mekanik är spelsystem som tillåter spelare att undvika upptäckt av fiender. Vanligtvis används i stealth-baserade spel som *Assassin's Creed* eller *Hitman*, dessa mekaniker inkluderar funktioner som synkoner, ljuddetektering, gömställen och spelarens synlighetsnivåer. Att lägga till smygmekanik kan göra spelandet mer engagerande genom att uppmuntra strategiskt tänkande och belöna noggrann planering.

I den här handledningen skapar vi grundläggande stealth-mekanik i Unity. Spelaren kommer att undvika upptäckt av fiender som har synkoner. Om spelaren går in i konen, kommer de att upptäckas.

Steg 1: Konfigurera scenen

Börja med att skapa en enkel Unity scen:

  1. Skapa ett nytt Unity-projekt.
  2. Lägg till ett Plane för att fungera som marken.
  3. Lägg till en 3D-modell (t.ex. en kapsel) för att representera Player.
  4. Lägg till ytterligare en 3D-modell (t.ex. en kub) för att representera en Enemy.
  5. Placera spelaren och fienden på olika platser på planet.

Steg 2: Skapa enemy Vision Cone

Vi kommer att simulera fiendens vision med hjälp av ett konformat triggerområde:

  1. Högerklicka i hierarkin och välj Skapa > 3D-objekt > Cylinder.
  2. Ändra storlek på cylindern så att den ser ut som en kon genom att justera dess skala (t.ex. X = 1, Y = 0,5, Z = 1).
  3. Rotera den så att den platta basen är vänd framåt (t.ex. Rotation X = 90).
  4. Fäst den som ett barn till Enemy GameObject.
  5. Ställ in konens Collider till en Trigger.
  6. Justera skalan och positionen för att matcha fiendens synfält.

Steg 3: Skriva fiendens upptäcktsskript

Låt oss nu skapa ett skript för att upptäcka spelaren i visionkonen:

  1. Skapa ett C#-skript som heter EnemyVision.
  2. Bifoga skriptet till Enemy GameObject.
  3. Använd följande kod:
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!");
        }
    }
}

Detta skript kontrollerar om spelaren går in i eller lämnar synkonen. Se till att Player GameObject har taggen Player.

Steg 4: Lägga till spelarsynlighet

Låt oss sedan implementera en synlighetsmekaniker för att göra upptäckten mer dynamisk. Spelaren blir svårare att upptäcka när han hukar eller gömmer sig:

  1. Skapa ett nytt skript som heter PlayerVisibility.
  2. Fäst den till Player GameObject.
  3. Använd följande kod:
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
        }
    }
}

Det här skriptet justerar spelarens synlighetsnivå baserat på deras handlingar. Fiender kan senare använda detta värde för att bestämma hur lätt spelaren upptäcks.

Steg 5: Förbättra fiendens upptäckt

Låt oss nu kombinera synlighet med upptäckt. Ändra EnemyVision-skriptet enligt följande:

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

Det här skriptet använder spelarens synlighetsnivå för att avgöra om de upptäcks.

Steg 6: Testa smygmekaniken

Så här testar du din inställning:

  1. Tryck på knappen Play i Unity Editor.
  2. Flytta spelaren in i fiendens visionkon för att utlösa upptäckt.
  3. Tryck på hukknappen (t.ex. "C") för att minska sikten och testa hur det påverkar upptäckten.

Valfria förbättringar

Här är några idéer för att utöka din smygmekanik:

  • Ljudavkänning: Lägg till en mekaniker där fienden upptäcker spelaren baserat på ljudet de gör (t.ex. löpning).
  • Gömställen: Skapa gömställen där spelaren inte kan upptäckas.
  • Patrullerande fiender: Programmera fiender att patrullera längs en bestämd väg med Unitys NavMesh-system.
  • Varningsstater: Lägg till varningsnivåer för fiender (t.ex. misstänkta, sökande, aggressiva).

Slutsats

Vi har implementerat grundläggande smygmekanik i Unity, inklusive siktkoner och siktnivåer. Dessa system kan fungera som grunden för mer komplext smygspel. Experimentera med ytterligare funktioner för att skapa en helt uppslukande smygupplevelse för ditt spel.