You are currently viewing Unity3D: Budujemy uniwersalny detektor w oparciu o UnityEvent system

Unity3D: Budujemy uniwersalny detektor w oparciu o UnityEvent system

Ze względu na to, że piszę obecnie kolejną grę w Unity3D, to postanowiłem podzielić się nieco sprawdzonymi sposobami na rozwiązywanie podstawowych problemów. Dziś na tapecie ląduje detekcja obiektów za pomocą generycznego skryptu oraz proste wprowadzenie do UnityEvent

Zasoby

Gotowy projekt znajdziesz na moim GitLab. Jeśli preferujesz wersję wideo zamiast tekstu, to zapraszam do obejrzenia tego poradnika na moim kanale YouTube.

Po co w ogóle osobny skrypt

Przy małych projektach gier nie ma za bardzo znaczenia czy detekcję kolizji robimy w głównym skrypcie danego obiektu, czy mniejszym – dedykowanym do tego celu. Jednak gdy poziom skomplikowania projektu rośnie, wówczas dużo częściej staramy się komponować zachowanie danego obiektu z mniejszych, wyspecjalizowanych i zarazem generycznych skryptów. Dzięki temu redukujemy skomplikowanie, sprawiając, że dalszy rozwój projektu jest dużo prostszy i zmniejsza ryzyko, że utkniemy z nadmiaru skomplikowania. Przykładem takiego skryptu jest właśnie budowany przez nas dziś detektor, który z pewnością wykorzystasz w swoich kolejnych projektach i to bez konieczności jego modyfikacji.

Skrypt Detektora

Rzućmy okiem na poniższy skrypt detektora. Jest to typowy skrypt unity rozszerzający MonoBehavour i wymagający aby obiekt posiadał również Collider. W przypadku gdy Collider wykryje interakcję z innim Collider’em, to skrypt emituje zdarzenie, które w dalszej części będziemy mogli obsłużyć.

using UnityEngine;
using UnityEngine.Events;

namespace Commons
{
    [RequireComponent(typeof(Collider))]
    public class Detector : MonoBehaviour
    {
        public UnityEvent<Collider> onTriggerEnter;
        public UnityEvent<Collider> onTriggerStay;
        public UnityEvent<Collider> onTriggerExit;

        private void OnTriggerEnter(Collider other)
        {
            onTriggerEnter?.Invoke(other);
        }

        private void OnTriggerStay(Collider other)
        {
            onTriggerStay?.Invoke(other);
        }

        private void OnTriggerExit(Collider other)
        {
            onTriggerExit?.Invoke(other);
        }
    }
}

Skrypt Odbiornika

Przygotujmy teraz jakiś prosty skrypt, który będzie reagować na zdarzenia emitowane przez detektor. Ważne, aby metody nasłuchujące na zdarzenia były publiczne oraz miały typy zgodne z emitowanymi przez detector zdarzeniami. Nasz przykładowy odbiornik może wyglądać następująco:

using UnityEngine;

namespace Commons
{
    public class DummyReceiver : MonoBehaviour
    {
        public void ListenOnTriggerEnter(Collider other)
        {
            Debug.Log("ListenOnTriggerEnter");
        }

        public void ListenOnTriggerStay(Collider other)
        {
            Debug.Log("ListenOnTriggerStay");
        }

        public void ListenOnTriggerExit(Collider other)
        {
            Debug.Log("ListenOnTriggerEnter");
        }
    }
}

Połączmy wszytko razem – UnityEvent system

Pora aby przygotować naszą testową scenę by – w dalszej części – móc skomunikować detektor z odbiornikiem. Na początek dodaj sferę, a następnie dodaj do niej komponent Rigidbody. Utwórz również dwa puste GameObject – jeden będzie pełnić rolę detektora, a drugi odbiornika. Przypisz do detektora skrypt który przed chwilą przygotowaliśmy oraz dodaj do niego dowolny collider, np. Box Collider. Jeśli chcesz aby Collider nie kolidował z innymi obiektami, a jedynie wykrywał inne obiekty, to na nim flagę IsTrigger=true.

Następnie dodaj skrypt DummyReceiver do odbiornika, co pozwoli nam potem reagować na zdarzenia wysyłane przez detektor.

A teraz najciekawsza część, czyli konfiguracja listenerów przy użyciu UnityEvent system. Brzmi skomplikowanie, ale tak naprawdę jest to bardzo proste. W tym celu, po prostu zaznacz obiekt detektora i dodaj event listener używając ikonki „+„. Następnie przeciągnij odbiornik w pole inspektora (1) i wybierz funkcję, którą chcesz wykorzystać do obsługi danego zdarzenia (2,3,4).

Jeśli wykonałeś wszystko jak należy, to po uruchomieniu symulacji i przeciągnięciu sfery w obszar Collider’a, w konsoli ukaże się komunikat o rodzaju przechwyconego zdarzenia.

To już wszystko co dla Ciebie przygotowałem w tym poradniku. Udostępnij proszę ten post aby pomóc mi dotrzeć do większego grona odbiorców. Dzięki i do zobaczenia w kolejnym poradniku.