move_and_slide()
to kluczowa funkcja dostępna w węźle CharacterBody3D
(i wcześniej w KinematicBody3D
w Godot 3), która ułatwia zarządzanie ruchem postaci, jednocześnie obsługując kolizje. Funkcja automatycznie przesuwa postać, a także koryguje jej pozycję w przypadku zderzeń z innymi obiektami. Jest to idealne rozwiązanie do tworzenia płynnych ruchów w grach 3D, takich jak chodzenie, bieganie, skakanie i zjeżdżanie po pochyłych powierzchniach.
Jak działa move_and_slide()
- Ruch i kolizje:
move_and_slide()
pozwala na ruch obiektu w określonym kierunku, a także automatycznie obsługuje kolizje, zatrzymując lub przesuwając postać, gdy napotka przeszkodę. - Utrzymywanie kontaktu z podłożem: Funkcja uwzględnia grawitację i koryguje pozycję postaci, aby umożliwić naturalne poruszanie się po nierównych powierzchniach.
- Automatyczne „ślizganie się”: Nazwa
move_and_slide()
odnosi się do ślizgania się obiektu wzdłuż powierzchni, po której się porusza, dzięki czemu ruch jest płynny i realistyczny.
Podstawowy sposób użycia move_and_slide()
extends CharacterBody3D
const SPEED = 5.0
const GRAVITY = -9.8
var velocity: Vector3 = Vector3.ZERO
func _physics_process(delta: float) -> void:
# Dodaj grawitację
if not is_on_floor():
velocity.y += GRAVITY * delta
# Obsługa wejścia gracza
var input_direction = Vector3.ZERO
input_direction.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_direction.z = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
# Normalizacja kierunku
input_direction = input_direction.normalized()
# Ustaw prędkość na osi X i Z
velocity.x = input_direction.x * SPEED
velocity.z = input_direction.z * SPEED
# Przesuń postać i obsłuż kolizje
velocity = move_and_slide(velocity, Vector3.UP)</code></pre>
Parametry move_and_slide()
linear_velocity
(wymagany):
- To wektor, który określa prędkość ruchu postaci.
- Przykład:
velocity = move_and_slide(velocity, Vector3.UP)
up_direction
(opcjonalny):
- Wektor określający, która oś jest uznawana za „górę”. Pomaga to przy obsłudze grawitacji oraz pochyłych powierzchni.
- Zazwyczaj używasz
Vector3.UP
((0, 1, 0)
) dla standardowych scen 3D.
stop_on_slope
(opcjonalny, domyślnie false
):
- Gdy ustawione na
true
, postać zatrzyma się, jeśli napotka pochyłą powierzchnię zbyt stromą do wejścia.
- Przydatne, jeśli chcesz, aby postać nie mogła wspinać się po pochyłych powierzchniach.
max_slides
(opcjonalny, domyślnie 4
):
- Określa, ile razy postać może odbić się (ślizgać) po powierzchni w jednej klatce. Większa liczba oznacza bardziej płynne ślizganie.
- Możesz dostosować tę wartość, aby uzyskać bardziej realistyczne odbicia.
floor_max_angle
(opcjonalny, domyślnie 0.785398
radiana ≈ 45 stopni):
- Definiuje maksymalny kąt powierzchni, który nadal będzie traktowany jako podłoga. Pomaga to kontrolować, na jak stromych powierzchniach postać może się poruszać bez poślizgu.
infinite_inertia
(opcjonalny, domyślnie true
):
- Gdy ustawione na
true
, postać nie będzie obracana ani zmieniana przez zderzenia. Wyłączenie tego pozwala na bardziej realistyczne oddziaływanie z innymi obiektami dynamicznymi.
Przykłady użycia dodatkowych parametrów:
1. Ustawienie stop_on_slope
na true
velocity = move_and_slide(velocity, Vector3.UP, true)
To zatrzyma postać, gdy napotka zbyt stromą pochyłość, zamiast próbować po niej wejść lub zsunąć się.
2. Zmiana floor_max_angle
velocity = move_and_slide(velocity, Vector3.UP, false, 4, deg2rad(30))
Tutaj maksymalny kąt nachylenia, który jest uznawany za podłogę, został zmieniony na 30 stopni (zamiast domyślnych 45 stopni).
Dodatkowe metody przydatne z move_and_slide()
:
is_on_floor()
:
- Sprawdza, czy postać znajduje się na ziemi.
- Przydatne do wykrywania, kiedy postać może skakać.
if is_on_floor():
print("Postać jest na ziemi")
is_on_wall()
:
- Sprawdza, czy postać dotyka ściany (np. w sytuacjach, gdy chcesz zablokować dalszy ruch w bok).
is_on_ceiling()
:
- Sprawdza, czy postać dotyka sufitu, co może być użyteczne do kontrolowania skoków w niskich przestrzeniach.
Przykład skryptu z pełnym ruchem postaci:
extends CharacterBody3D
const SPEED = 5.0
const JUMP_VELOCITY = 10.0
const GRAVITY = -20.0
var velocity: Vector3 = Vector3.ZERO
func _physics_process(delta: float) -> void:
# Dodanie grawitacji
if not is_on_floor():
velocity.y += GRAVITY * delta
# Obsługa ruchu poziomego
var input_dir = Vector3(
Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left"),
0,
Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
)
input_dir = input_dir.normalized()
velocity.x = input_dir.x * SPEED
velocity.z = input_dir.z * SPEED
# Skakanie
if Input.is_action_just_pressed("ui_accept") and is_on_floor():
velocity.y = JUMP_VELOCITY
# Przesuwanie postaci i obsługa kolizji
velocity = move_and_slide(velocity, Vector3.UP)</code></pre>
Podsumowanie:
move_and_slide()
automatyzuje przesuwanie postaci, obsługę kolizji oraz ślizganie po powierzchniach, co czyni ją niezwykle przydatną do kontrolowania ruchu postaci w grach 3D.
- Dzięki dodatkowemu parametrowi
up_direction
, funkcja może poprawnie obsługiwać nachylone powierzchnie i reagować na grawitację.
- Metody takie jak
is_on_floor()
, is_on_wall()
i is_on_ceiling()
pomagają kontrolować zachowanie postaci, umożliwiając tworzenie płynnego ruchu, skoków i interakcji z otoczeniem.
move_and_slide()
to podstawowe narzędzie, które znacznie ułatwia kontrolowanie ruchu postaci w grach 3D, dzięki czemu można skupić się na bardziej złożonych elementach rozgrywki.
Published using WordPress Blurt Publisher from https://godot.com.pl.