Stealth-mechanica toevoegen in Unity

Stealth-mechanismen zijn gameplay-systemen waarmee spelers detectie door vijanden kunnen vermijden. Deze mechanismen worden vaak gebruikt in stealth-games zoals *Assassin's Creed* of *Hitman* en bevatten functies zoals zichtkegels, geluidsdetectie, verstopplekken en zichtbaarheidsniveaus van spelers. Het toevoegen van stealth-mechanismen kan de gameplay aantrekkelijker maken door strategisch denken aan te moedigen en zorgvuldige planning te belonen.

In deze tutorial maken we basis stealth-mechanismen in Unity. De speler vermijdt detectie door vijanden met zichtkegels. Als de speler de kegel betreedt, worden ze gedetecteerd.

Stap 1: De scène opzetten

Begin met het maken van een eenvoudige Unity-scène:

  1. Maak een nieuw Unity-project.
  2. Voeg een Vlak toe om als grond te dienen.
  3. Voeg een 3D-model (bijvoorbeeld een capsule) toe om de speler weer te geven.
  4. Voeg een ander 3D-model toe (bijvoorbeeld een kubus) om een ​​vijand voor te stellen.
  5. Plaats de speler en de vijand op verschillende locaties in het vliegtuig.

Stap 2: De vijandelijke zichtkegel creëren

We simuleren het zicht van de vijand met behulp van een kegelvormig trekkergebied:

  1. Klik met de rechtermuisknop in de hiërarchie en selecteer Maken > 3D-object > Cilinder.
  2. Pas de schaal van de cilinder aan zodat deze op een kegel lijkt (bijv. X = 1, Y = 0,5, Z = 1).
  3. Draai het zo dat de platte basis naar voren wijst (bijv. Rotatie X = 90).
  4. Voeg het toe als een onderliggend object van het Enemy GameObject.
  5. Stel de Collider van de kegel in als Trigger.
  6. Pas de schaal en positie aan het gezichtsveld van de vijand aan.

Stap 3: Het script voor vijanddetectie schrijven

Laten we nu een script maken om de speler binnen de zichtkegel te detecteren:

  1. Maak een C#-script met de naam EnemyVision.
  2. Koppel het script aan het Enemy GameObject.
  3. Gebruik de volgende code:
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!");
        }
    }
}

Dit script controleert of de speler de zichtkegel betreedt of verlaat. Zorg ervoor dat het Player GameObject de tag Player heeft.

Stap 4: Spelerszichtbaarheid toevoegen

Laten we vervolgens een zichtbaarheidsmechanisme implementeren om detectie dynamischer te maken. De speler zal moeilijker te detecteren zijn wanneer hij hurkt of zich verstopt:

  1. Maak een nieuw script genaamd PlayerVisibility.
  2. Koppel het aan het Player GameObject.
  3. Gebruik de volgende code:
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
        }
    }
}

Dit script past het zichtbaarheidsniveau van de speler aan op basis van zijn acties. Vijanden kunnen deze waarde later gebruiken om te bepalen hoe gemakkelijk de speler wordt gedetecteerd.

Stap 5: Verbetering van vijanddetectie

Laten we nu zichtbaarheid combineren met detectie. Wijzig het EnemyVision-script als volgt:

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

Dit script gebruikt het zichtbaarheidsniveau van de speler om te bepalen of deze wordt gedetecteerd.

Stap 6: De stealth-mechanica testen

Om uw opstelling te testen:

  1. Klik op de Play-knop in de Unity-editor.
  2. Beweeg de speler naar de zichtkegel van de vijand om detectie te activeren.
  3. Druk op de hurkknop (bijv. "C") om de zichtbaarheid te verminderen en te testen hoe dit de detectie beïnvloedt.

Optionele verbeteringen

Hier zijn enkele ideeën om je stealth-mechanica uit te breiden:

  • Geluidsdetectie: Voeg een mechanisme toe waarbij de vijand de speler detecteert op basis van het geluid dat hij maakt (bijvoorbeeld rennen).
  • Schuilplaatsen: Creëer schuilplaatsen waar de speler niet meer te detecteren is.
  • Patrouilleren van vijanden: Programmeer vijanden om langs een vast pad te patrouilleren met behulp van Unity's NavMesh-systeem.
  • Waarschuwingsniveaus: Voeg waarschuwingsniveaus toe voor vijanden (bijv. verdacht, zoekend, agressief).

Conclusie

We hebben basis stealth-mechanismen geïmplementeerd in Unity, inclusief zichtkegels en zichtbaarheidsniveaus. Deze systemen kunnen dienen als basis voor complexere stealth-gameplay. Experimenteer met extra functies om een ​​volledig meeslepende stealth-ervaring voor je game te creëren.