Contents

Jak używać węzłów RayCast2D do wykrywania linii wzroku w Godot?

Wykrywanie linii wzroku dodaje warstwę złożoności do gry dzięki mechanizmowi, który pozwala postaciom lub obiektom postrzegać swoje otoczenie. Możesz użyć tej funkcji do zachowania sztucznej inteligencji wroga, mechaniki widoczności gracza, skradania się i nie tylko.

W Godot implementacja wykrywania linii wzroku poprzez wykorzystanie węzła RayCast2D jest zarówno usprawniona, jak i pomysłowa.

Konfigurowanie gry Godot

Aby rozpocząć pracę z węzłami RayCast2D w Godot, należy najpierw ustanowić podstawowe dwuwymiarowe środowisko gry. Obejmuje to stworzenie postaci gracza zdolnej do poruszania się za pomocą klawiatury, a także możliwość interakcji postaci z różnymi platformami w świecie gry.

Aby rozpocząć projektowanie postaci gracza w Unity, wykonaj następujące kroki:1. Utwórz pustą scenę, klikając prawym przyciskiem myszy w oknie projektu i wybierając “Scena”. Nadaj jej nazwę “PlayerCharacter” lub podobną.2. Przeciągnij nowy obiekt GameObject na panel Hierarchy w nowo utworzonej scenie. Będzie on służył jako główny obiekt dla naszej postaci gracza.3. Po wybraniu głównego obiektu GameObject, przejdź do panelu Inspektora i kliknij przycisk “Dodaj komponent” u dołu. Z listy dostępnych komponentów wybierz “CharacterController2D” i kliknij “Add”. Ten komponent jest niezbędny dla każdego ruchu postaci 2D w Unity.4. Następnie przeciągnij kolejny GameObject na panel Hierarchy z panelu Assets. Tym razem wybierz pre

Towarzyszący kod jest dostępny za pośrednictwem repozytorium GitHub, które służy jako platforma open-source dla programistów do dzielenia się swoją pracą z innymi. Ten konkretny zestaw kodów jest licencjonowany na warunkach licencji MIT, dzięki czemu użytkownicy mogą z niego korzystać bez opłat.

Dostarczony kod GDScript odnosi się do Ruchu Gracza, jak wskazuje jego tytuł. Zawiera funkcję o nazwie “move”, która wydaje się być odpowiedzialna za obsługę ruchu postaci w oparciu o dane wejściowe użytkownika i inne czynniki, takie jak skakanie i wspinaczka. Kod wykorzystuje również zmienne, w tym prędkość poziomą i pionową, przyspieszenie, grawitację i inne.

 extends CharacterBody2D

var speed = 300

func _physics_process(delta):
    var input_dir = Vector2.ZERO

    if Input.is_action_pressed("ui_left"):
        input_dir.x -= 1

    if Input.is_action_pressed("ui_right"):
        input_dir.x \\+= 1

    if Input.is_action_pressed("ui_up"):
        input_dir.y -= 1

    if Input.is_action_pressed("ui_down"):
        input_dir.y \\+= 1

    velocity = input_dir.normalized() * speed
    move_and_collide(velocity * delta)

Aby ułatwić interakcję między graczem a światem gry, konieczne jest stworzenie serii interaktywnych platform w obrębie sceny. Te mogą być budowane przy użyciu komponentów StaticBody2D, które oferują różne opcje definiowania kształtu obiektu. Rozmieszczając te elementy w przemyślany sposób, możemy skutecznie stworzyć wciągającą platformówkę dla użytkownika.

/pl/images/simple-los-in-godot.jpg

Konfigurowanie RayCast2D

Aby włączyć wykrywanie linii wzroku do projektu wykorzystującego Unity3D i GDScript, wykonaj następujące kroki, aby zintegrować węzeł Raycast2D z Godot Engine:

 var raycast: RayCast2D

func _ready():
    raycast = RayCast2D.new()
    add_child(raycast) 

Upewnij się, że dołączyłeś ten skrypt do

Dostarczanie wizualnych informacji zwrotnych na temat interakcji na linii wzroku

Możesz teraz wygenerować powiadomienie, gdy oś wizualna gracza przecina się z powierzchnią, wyrzucając wiązkę światła z jego bieżącej lokalizacji i kierując ją w stronę zamierzonej trajektorii. Jeśli promień ten trafi w obiekt, oznacza to, że gracz jest w stanie dostrzec platformę w swoim polu widzenia.

Włącz wyżej wymieniony kod do istniejącego skryptu w następujący sposób:

 func _physics_process(delta):
    # ... (previous movement code)

    raycast.target_position = Vector2(100, 0)

    if raycast.is_colliding():
        print("Collided with platform!") 

Oto dane wyjściowe:

/pl/images/simple-raycast-in-godot.jpg

Rozszerzanie funkcjonalności RayCast2D

Wykorzystanie mnóstwa innowacyjnych funkcji ma ogromne znaczenie dla podniesienia poziomu interakcji i zawiłości w grze do wyjątkowego stopnia.

get_collider()

Wykorzystanie funkcji get_collider() pozwala pobrać początkowy obiekt napotkany przez promień. Jeśli żaden obiekt nie znajduje się na trajektorii promienia, metoda ta zwróci wartość null, co dostarcza cennych informacji na temat braku przeszkody na linii wzroku gracza.

 if raycast.is_colliding():
    var collided_object = raycast.get_collider()

    if collided_object:
        print("You can see:", collided_object.name) 

get_collider_rid()

Funkcja get_collider_rid() umożliwia pobranie identyfikatora zasobu (RID) odpowiadającego pierwszemu zderzonemu obiektowi w systemie wykrywania kolizji, dostarczając cennych informacji przy określaniu, które obiekty zetknęły się podczas rozgrywki lub innych interaktywnych aplikacji.

 if raycast.is_colliding():
    var collider_rid = raycast.get_collider_rid()

    if !collider_rid.is_valid():
        print("No valid object RID")
    else:
        print("Object RID:", collider_rid) 

get_collider_shape()

Funkcja get_collider_shape() pobiera unikalny identyfikator powiązany z formą geometryczną początkowego nakładającego się obiektu lub zero (0) w przypadku, gdy kolizja nie nastąpi.

 if raycast.is_colliding():
    var collider_shape = raycast.get_collider_shape()

    if collider_shape == 0:
        print("No valid shape ID")
    else:
        print("Shape ID:", collider_shape) 

get_collision_normal()

Aby uzyskać głębsze zrozumienie interakcji, użycie funkcji get_collision_normal() zapewnia normalny wektor obiektu w punkcie kolizji. Gdy promień pochodzi z wnętrza kształtu i spełniony jest warunek hit_from_inside , normalna zwrócona przez tę funkcję będzie reprezentowana jako instancja Vector2 z wartością x równą zero i wartością y równą zero.

 if raycast.is_colliding():
    var collision_normal = raycast.get_collision_normal()
    print("Collision Normal:", collision_normal) 

get_collision_point()

Po napotkaniu obiektu, z którym następuje kolizja, funkcja get\_collision\_point() precyzyjnie określa punkt, w którym następuje kolizja w globalnie zdefiniowanym układzie współrzędnych.

 if raycast.is_colliding():
    var collision_point = raycast.get_collision_point()
    print("Collision Point:", collision_point) 

Wykorzystując skomplikowane funkcje modułu RayCast2D, można uzyskać nieocenioną wiedzę na temat interakcji między rzutowaną wiązką a przeszkodami na scenie.

Wykorzystanie tych technik umożliwia pozyskanie kluczowych danych, które mogą znacząco wpłynąć na mechanikę gry, interaktywność obiektów i wrażenia użytkownika.

Włączanie dodatkowych funkcji

Oprócz podstawowych możliwości wykrywania linii wzroku, można ulepszyć dynamiczne elementy gry poprzez włączenie bardziej zaawansowanych funkcji.

Wyzwalacze zdarzeń

Zamiast po prostu wyświetlać powiadomienie, można zainicjować określone zdarzenia w grze. Na przykład odsłonięcie ukrytych tras, aktywacja maszyn lub powiadomienie przeciwników o miejscu pobytu gracza może poprawić wrażenia z gry.

Dynamiczna obsługa przeszkód

Aby uwzględnić potencjalne zakłócenia linii wzroku, konieczne jest włączenie mechanizmu dynamicznego wykrywania wszelkich przeszkód, które mogą utrudniać odbiór wizualny. W ten sposób linia wzroku będzie mogła dostosowywać się w czasie rzeczywistym, gdy obiekty pojawią się lub znikną z pola widzenia użytkownika.

Niestandardowe wskaźniki wizualne

Aby rozszerzyć tradycyjne wskazówki tekstowe, można opracować dostosowane sygnały wizualne, które podkreślają połączenia linii wzroku między graczami i obiektami. Takie ulepszenia mogą obejmować zmianę odcienia sprite’a postaci lub przedmiotu, wyświetlanie symbolicznej reprezentacji lub aktywację animowanych elementów związanych z tymi relacjami.

Mechanika mgły wojny

Aby poprawić wrażenia w grach strategicznych, zaleca się wdrożenie mechaniki mgły wojny. Mechanika ta ogranicza widoczność gracza do momentu ustanowienia linii wzroku, tym samym stopniowo odsłaniając świat gry i promując przemyślane wybory strategiczne.

Najlepsze praktyki wykrywania linii wzroku

Optymalizacja wykrywania linii wzroku (LOS) jest niezbędna do zapewnienia płynnej rozgrywki, ponieważ pomaga zapobiegać przeszkodom i zapewnia, że gracze widzą to, czego potrzebują do interakcji lub skutecznej nawigacji. Przestrzeganie tych najlepszych praktyk pomoże ci osiągnąć ten cel:

Częstotliwość raycastów

Powstrzymaj się od ciągłego wykonywania raycastów w każdej iteracji, chyba że jest to absolutnie konieczne. Zamiast tego rozważ sprawdzanie widoczności tylko wtedy, gdy miejsce pobytu gracza lub scena ulegają znacznym zmianom. W ten sposób można zminimalizować liczbę niepotrzebnych obliczeń i zoptymalizować wydajność.

Długość promienia

Zapewnij optymalną wydajność, dostosowując czas trwania raycastu tak, aby obejmował tylko wymagany region bez powodowania nadmiernych obliczeń. Zbyt długie promienie mogą negatywnie wpływać na wydajność, dlatego ważne jest, aby zachować równowagę między pokryciem a obciążeniem obliczeniowym.

Warstwy kolizyjne

Wykorzystaj warstwy kolizyjne i maski, aby doprecyzować zakres obiektów branych pod uwagę przy wykrywaniu linii wzroku, wykluczając w ten sposób niepotrzebne raycasty skierowane na nieistotne obiekty.

Buforowanie wyników

Podczas przeprowadzania wielu instancji analizy linii widzenia na różnych obiektach lub w kolejnych klatkach, zaleca się przechowywanie wyników w pamięci podręcznej, aby zapobiec niepotrzebnym obliczeniom.

Integracja poziomów platformowych

Upewnij się, że system wykrywania linii wzroku w grze jest spójny z projektem poziomu platformowego, biorąc pod uwagę takie czynniki, jak pionowość otoczenia, różne wysokości platform i wszelkie możliwe przeszkody w ostrości widzenia w środowisku.

Upewnij się, że twój system wykrywania jest w stanie uwzględnić subtelne zawiłości obecne w rozgrywce, aby zapewnić graczom spójne i przyjazne dla użytkownika wrażenia.

Zwiększanie zaangażowania w grach Godot dzięki wykrywaniu linii wzroku

Wykrywanie linii wzroku zwiększa głębię i rzeczywistość środowiska gry, umożliwiając graczom planowanie, ukrywanie się lub pokonywanie przeszkód na różne sposoby w zależności od ich perspektywy wizualnej. Włączając ten element, programiści mogą przekształcić zwykłą platformówkę w bardziej wciągające i wciągające doświadczenie, które zwiększa zaangażowanie graczy i tworzy trwałe wspomnienia.