Kolizje w Godot są realizowane za pomocą specjalnych węzłów fizycznych i kształtów kolizyjnych. W tej instrukcji przejdziemy przez różne aspekty tworzenia kolizji, uwzględniając zarówno gry 2D, jak i 3D. Wersja Godot 4 wprowadza liczne ulepszenia w tym zakresie.
Rodzaje węzłów kolizyjnych
- StaticBody:
- Przeznaczone dla nieruchomych obiektów, takich jak ściany, podłogi czy tła.
- Przykład: Budynki w grze.
- Wymagany komponent:
CollisionShape
lubCollisionPolygon
.
- RigidBody:
- Dynamiczne obiekty podlegające prawom fizyki, takie jak siły, grawitacja czy zderzenia.
- Przykład: Piłka odbijająca się od podłoża.
- Wymagany komponent:
CollisionShape
.
- KinematicBody:
- Służy do kontrolowania obiektów poprzez skrypty (np. postaci gracza).
- Przykład: Postać chodząca po mapie.
- Wymagany komponent:
CollisionShape
.
- Area:
- Używane do wykrywania obecności innych obiektów w określonym obszarze.
- Przykład: Pułapki, strefy wykrywania wrogów.
- Wymagany komponent:
CollisionShape
.
Kroki do implementacji kolizji
- Dodanie węzła kolizyjnego:
- Dodaj odpowiedni węzeł, np.
StaticBody3D
,KinematicBody2D
. - Dodaj jako dziecko węzeł
CollisionShape
lubCollisionPolygon
.
- Dodaj odpowiedni węzeł, np.
- Ustawienie kształtu kolizji:
- W
CollisionShape
ustaw typ kształtu:- BoxShape: Prostopadłościan.
- SphereShape: Kula.
- CapsuleShape: Kapsuła (często używana dla postaci).
- ConvexPolygonShape: Skomplikowane obiekty 3D.
- CustomPolygon: Dla 2D można używać wielokątów.
- W
- Skrypty obsługujące kolizje:
- Dla KinematicBody: Użyj funkcji
move_and_slide()
lubmove_and_collide()
, aby zarządzać ruchem i kolizjami. - Przykład:
extends KinematicBody3D var velocity = Vector3.ZERO func _physics_process(delta): velocity = Vector3(0, -9.8, 0) # Grawitacja velocity = move_and_slide(velocity)
- Dla KinematicBody: Użyj funkcji
- Obsługa zdarzeń w Area:
- Włącz sygnały, takie jak
body_entered
lubarea_entered
, aby reagować na kolizje. - Przykład:
extends Area3D func _on_area_entered(body): print("Obiekt wszedł do obszaru!")
- Włącz sygnały, takie jak
Rozwiązania specyficzne dla 2D i 3D
- 2D:
- Używaj odpowiedników węzłów:
StaticBody2D
,KinematicBody2D
,RigidBody2D
,Area2D
. - Typowe kształty kolizyjne to:
RectangleShape2D
,CircleShape2D
,PolygonShape2D
.
- Używaj odpowiedników węzłów:
- 3D:
- Węzły to
StaticBody3D
,KinematicBody3D
,RigidBody3D
,Area3D
. - Typowe kształty kolizyjne:
BoxShape
,SphereShape
,CapsuleShape
.
- Węzły to
Debugowanie kolizji
Aby zweryfikować poprawność ustawień kolizji:
- Włącz opcję
Visible Collision Shapes
w menu Debug. - Sprawdź, czy kształty kolizyjne są poprawnie dopasowane do obiektów w grze.
Zaawansowane aspekty kolizji
- Maski warstw (Collision Layers i Masks):
- Służą do precyzyjnego określania, które obiekty mogą wchodzić w kolizję.
- Przykład: Gracz (Layer 1) koliduje tylko z przeszkodami (Maska 2).
- Złożone kształty kolizyjne:
- Dla modeli 3D możesz użyć
ConvexDecomposition
lub zaimportować gotowe kształty z programu do modelowania (np. Blender).
- Dla modeli 3D możesz użyć
- Kolizje dla animacji:
- Animacje mogą dynamicznie zmieniać kształt kolizyjny poprzez zmiany w
CollisionShape
.
- Animacje mogą dynamicznie zmieniać kształt kolizyjny poprzez zmiany w
- Fizyka GPU:
- Godot 4 obsługuje shadery obliczeniowe (Compute Shaders), co może być wykorzystane w złożonych symulacjach kolizji.
Przykład: Postać gracza z kolizjami
extends KinematicBody3D
var speed = 5.0
var velocity = Vector3.ZERO
func _process(delta):
var input_dir = Vector3(
Input.get_action_strength("move_right") - Input.get_action_strength("move_left"),
0,
Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward")
)
if input_dir.length() > 0:
input_dir = input_dir.normalized()
velocity = input_dir * speed
velocity = move_and_slide(velocity)
Podsumowanie
Kolizje w Godot są elastyczne i dostosowane zarówno do prostych, jak i złożonych projektów. Kluczowe aspekty to właściwe dobranie typu węzła kolizyjnego, konfiguracja kształtów oraz użycie skryptów do obsługi logiki kolizji. Godot 4 oferuje narzędzia zarówno dla gier 2D, jak i 3D, które umożliwiają szybkie prototypowanie i rozwijanie zaawansowanych systemów kolizji.