Dekorator @rpc – funkcja sieciowa Remote Procedure Call

RPC (Remote Procedure Call) to funkcja sieciowa w Godot, która umożliwia zdalne wywoływanie funkcji pomiędzy różnymi klientami oraz serwerem w trybie sieciowym. Dekorator @rpc pozwala oznaczyć funkcję jako taką, która może być wywoływana zdalnie w sieci (np. w grach wieloosobowych).

Jak działa RPC w Godot?

  1. Serwer i klient:
    W kontekście sieci w Godot mamy serwer, który zarządza grą, i klientów, którzy do niego dołączają. RPC pozwala klientom oraz serwerowi komunikować się ze sobą poprzez wywoływanie funkcji na zdalnych maszynach.
  2. Dekorator @rpc:
    Aby oznaczyć funkcję jako zdalną (RPC), używamy dekoratora @rpc. Możemy określić, na którym urządzeniu funkcja ma być wywołana, korzystając z parametrów, takich jak "any_peer", "authority", lub "master". Przykład:
   @rpc("any_peer")
   func sync_player_position(pos: Vector3):
       global_transform.origin = pos

W tym przykładzie funkcja sync_player_position() jest oznaczona jako zdalna i może być wywołana na dowolnym urządzeniu w sieci.

  1. Typy RPC:
    Godot oferuje różne sposoby wywoływania RPC, które określają, jaką rolę pełni funkcja w kontekście sieci:
  • "any_peer": Funkcja może być wywołana zarówno przez serwer, jak i klientów.
  • "authority": Wywoływana tylko przez serwer (lub klient będący serwerem).
  • "master": Wywoływana tylko przez właściciela obiektu.
  1. RPC Mode:
    Można używać RPC w różnych trybach:
  • rpc(): Wywołuje funkcję na zdalnym urządzeniu.
  • rpc_id(): Wywołuje funkcję na urządzeniu o konkretnym ID.
  • rset(): Używany do zdalnego ustawiania zmiennych.

Przykłady użycia:

Synchronizacja pozycji gracza w grze sieciowej:

@rpc("any_peer")
func sync_player_position(pos: Vector3):
    global_transform.origin = pos

Funkcja sync_player_position() pozwala na synchronizację pozycji gracza. Każdy klient lub serwer może wywołać tę funkcję i ustawić pozycję gracza.

Wywołanie zdalnej funkcji tylko na serwerze:

@rpc("authority")
func process_damage(damage: int):
    health -= damage

W tym przypadku funkcja process_damage() może być wywoływana tylko przez serwer, co zapewnia, że to serwer zarządza zdrowiem gracza.

Ustawienie zmiennej na kliencie:

@rpc("any_peer")
func sync_player_health(health_value: int):
    health = health_value

Funkcja sync_player_health() pozwala zsynchronizować zdrowie gracza między różnymi klientami.

Jak wywołać RPC?

  1. rpc():
    Wywołuje funkcję RPC na wszystkich urządzeniach (serwer i klienci).
   rpc("sync_player_position", Vector3(1, 2, 3))
  1. rpc_id():
    Wywołuje funkcję RPC tylko na konkretnym urządzeniu, np. kliencie o danym ID.
   rpc_id(3, "sync_player_position", Vector3(1, 2, 3))  # Wywołuje RPC na kliencie o ID 3
  1. rset():
    Służy do zdalnego ustawienia zmiennych.
   rset("health", 50)

Tryby synchronizacji:

  • Unreliable (UDP): Używane domyślnie w RPC. Komunikaty mogą zostać zgubione, ale są szybsze.
  • Reliable (TCP): Używane do krytycznych informacji, gdzie komunikaty muszą dotrzeć, nawet jeśli jest to wolniejsze.

Zastosowania w praktyce:

  • Synchronizacja pozycji i rotacji obiektów w grze sieciowej.
  • Zarządzanie zdrowiem lub punktami życia graczy.
  • Obsługa interakcji między różnymi klientami, np. otwieranie drzwi, uruchamianie zdarzeń.

RPC w Godot jest bardzo elastyczne i pozwala na łatwe tworzenie gier sieciowych, gdzie serwer i klienci mogą efektywnie wymieniać się danymi.


Komentarze

Dodaj komentarz

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