Funkcja move_and_slide()

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)

Parametry move_and_slide()

  1. linear_velocity (wymagany):
  • To wektor, który określa prędkość ruchu postaci.
  • Przykład: velocity = move_and_slide(velocity, Vector3.UP)
  1. 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.
  1. 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.
  1. 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.
  1. 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.
  1. 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():

  1. 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")
  1. is_on_wall():
  • Sprawdza, czy postać dotyka ściany (np. w sytuacjach, gdy chcesz zablokować dalszy ruch w bok).
  1. 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)

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.


Komentarze

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *