Dodawanie mechaniki skradania się w Unity

Mechanika skradania to systemy rozgrywki, które pozwalają graczom uniknąć wykrycia przez wrogów. Mechanika ta, powszechnie stosowana w grach opartych na skradance, takich jak *Assassin's Creed* lub *Hitman*, obejmuje takie funkcje, jak stożki widzenia, wykrywanie dźwięku, miejsca ukrycia i poziomy widoczności gracza. Dodanie mechaniki skradania może sprawić, że rozgrywka będzie bardziej angażująca, zachęcając do strategicznego myślenia i nagradzając ostrożne planowanie.

W tym samouczku stworzymy podstawowe mechanizmy skradania się w Unity. Gracz uniknie wykrycia przez wrogów, którzy mają stożki widzenia. Jeśli gracz wejdzie w stożek, zostanie wykryty.

Krok 1: Przygotowanie sceny

Zacznij od utworzenia prostej sceny Unity:

  1. Utwórz nowy projekt Unity.
  2. Dodaj Samolot, który będzie stanowił podłoże.
  3. Dodaj model 3D (np. kapsułę), aby przedstawić Gracza.
  4. Dodaj kolejny model 3D (np. Sześcian), aby przedstawić Wroga.
  5. Umieść gracza i wroga w różnych miejscach na płaszczyźnie.

Krok 2: Tworzenie stożka widzenia wroga

Będziemy symulować wizję wroga za pomocą stożkowego obszaru wyzwalającego:

  1. Kliknij prawym przyciskiem myszy w hierarchii i wybierz Utwórz > Obiekt 3D > Cylinder.
  2. Zmień rozmiar cylindra, aby wyglądał jak stożek, dostosowując jego skalę (np. X = 1, Y = 0,5, Z = 1).
  3. Obróć go tak, aby płaska podstawa była skierowana do przodu (np. Obrót X = 90).
  4. Dołącz go jako obiekt podrzędny obiektu gry Enemy GameObject.
  5. Ustaw Collider stożka jako Trigger.
  6. Dostosuj skalę i pozycję do pola widzenia wroga.

Krok 3: Pisanie skryptu wykrywania wroga

Teraz utwórzmy skrypt wykrywający Gracza w polu widzenia:

  1. Utwórz skrypt C# o nazwie EnemyVision.
  2. Dołącz skrypt do obiektu gry wroga.
  3. Użyj następującego kodu:
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!");
        }
    }
}

Ten skrypt sprawdza, czy Gracz wchodzi lub wychodzi z stożka widzenia. Upewnij się, że obiekt gry Player GameObject ma tag Player.

Krok 4: Dodawanie widoczności gracza

Następnie zaimplementujmy mechanikę widoczności, aby uczynić wykrywanie bardziej dynamicznym. Gracz będzie trudniejszy do wykrycia, gdy kuca lub się ukrywa:

  1. Utwórz nowy skrypt o nazwie PlayerVisibility.
  2. Dołącz go do obiektu gry Player GameObject.
  3. Użyj następującego kodu:
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
        }
    }
}

Ten skrypt dostosowuje poziom widoczności Gracza na podstawie jego działań. Wrogowie mogą później użyć tej wartości, aby zdecydować, jak łatwo Gracz zostanie wykryty.

Krok 5: Ulepszanie wykrywania wrogów

Teraz połączmy widoczność z wykrywaniem. Zmodyfikuj skrypt EnemyVision w następujący sposób:

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

Ten skrypt wykorzystuje poziom widoczności Gracza, aby określić, czy zostanie on wykryty.

Krok 6: Testowanie mechaniki skradania

Aby przetestować konfigurację:

  1. Naciśnij przycisk Odtwórz w Edytorze Unity.
  2. Przesuń gracza w pole widzenia wroga, aby uruchomić wykrywanie.
  3. Naciśnij przycisk kucania (np. "C"), aby zmniejszyć widoczność i sprawdzić, jak wpłynie to na wykrywanie.

Opcjonalne ulepszenia

Oto kilka pomysłów na rozszerzenie mechaniki skradania się:

  • Wykrywanie dźwięku: Dodaj mechanikę, dzięki której przeciwnik wykrywa gracza na podstawie hałasu, jaki wydaje (np. podczas biegu).
  • Kryjówki: Twórz kryjówki, w których gracz będzie niewidoczny.
  • Patrolowanie wrogów: Zaprogramuj wrogów tak, aby patrolowali wyznaczoną ścieżkę, korzystając z systemu NavMesh Unity.
  • Stany alertów: Dodaj poziomy alertów dla wrogów (np. podejrzany, przeszukujący, agresywny).

Wniosek

W Unity zaimplementowaliśmy podstawowe mechanizmy skradania się, w tym stożki widzenia i poziomy widoczności. Te systemy mogą służyć jako podstawa bardziej złożonej rozgrywki skradania się. Eksperymentuj z dodatkowymi funkcjami, aby stworzyć w pełni immersyjne doświadczenie skradania się w swojej grze.