Funkcja move_and_slide()

in polish •  25 days ago 

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()

  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)</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.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!