gamedev-skills/awesome-gamedev-agent-skills

godot-multiplayer

Build networked games with Godot 4.7 high-level multiplayer: set up an ENetMultiplayerPeer server/client, define RPCs with the @rpc annotation (call via rpc()/rpcid()), set per-node multiplayer authority, and replicate state with MultiplayerSpawner and Mult…

소스 보기

사용 방법

  1. 설치 명령을 복사하고 자신의 에이전트 환경에 설치하기 전에 소스 패키지를 확인하세요.
  2. 필요한 도구, 인증 정보, 지원 환경은 원본 문서에서 확인하세요.
  3. 입력과 원하는 산출물을 설명하고 출처와 결과를 대조하세요.
npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill godot-multiplayer

시작 전 확인

  • 설치에는 모델 구독, API 한도, 파일 접근 권한이 포함되지 않습니다.
  • 별점 수와 설치 수는 활동 지표이며 독립적인 품질·보안 검증이 아닙니다.
원본 Skill 문서

원본 저장소의 제목, 예시, 코드, 표, 링크, 이미지를 유지해 표시합니다.

Godot Multiplayer (4.x high-level)

Connect peers, call functions remotely with @rpc, assign authority, and replicate state with MultiplayerSpawner/MultiplayerSynchronizer. Targets Godot 4.7 (ENet). Treat all client input as untrusted; keep the server authoritative.

When to use

  • Use when adding networked multiplayer: hosting/joining over ENet, calling RPCs,

assigning per-node authority, or auto-spawning/syncing nodes across peers.

When not to use:* local split-screen (no networking); raw TCP/UDP/WebSocket protocol work (low-level PacketPeer); HTTP requests. For save/persistence → save-systems.

Core workflow

  1. Create a peer (ENetMultiplayerPeer), call create_server(port, max) or

create_client(ip, port), and assign it to multiplayer.multiplayer_peer. The server's unique ID is always 1; clients get random positive IDs.

  1. Handle connection signals on multiplayer: peer_connected(id),

peer_disconnected(id), connected_to_server, connection_failed, server_disconnected.

  1. Define RPCs with @rpc(...). Call them on a Callable via rpc() (all peers) or

rpc_id(peer_id) (one peer). Inside, multiplayer.get_remote_sender_id() tells you who sent it.

  1. Keep RPC signatures identical on every peer that runs the script — Godot checksums

all @rpc methods in a script; mismatches break silently.

  1. Assign authority per node with set_multiplayer_authority(id); gate input/RPCs by

is_multiplayer_authority().

  1. Replicate state with MultiplayerSpawner (auto-instances scenes on clients) and

MultiplayerSynchronizer (auto-syncs selected properties).

  1. Validate on the server. Don't trust client-reported positions/results.

Patterns

1. Host or join (ENet)

gdscript
const PORT := 7000
const MAX_PLAYERS := 8

func host() -> void:
    var peer := ENetMultiplayerPeer.new()
    var err := peer.create_server(PORT, MAX_PLAYERS)
    if err != OK:
        push_error("Cannot host: %s" % err); return
    multiplayer.multiplayer_peer = peer
    multiplayer.peer_connected.connect(_on_peer_connected)

func join(ip := "127.0.0.1") -> void:
    var peer := ENetMultiplayerPeer.new()
    peer.create_client(ip, PORT)
    multiplayer.multiplayer_peer = peer
    multiplayer.connected_to_server.connect(func(): print("connected"))

func leave() -> void:
    multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new()

2. RPCs: client sends input to the server (anypeer, calllocal)

gdscript
func _unhandled_input(event: InputEvent) -> void:
    if event.is_action_pressed("fire") and is_multiplayer_authority():
        request_fire.rpc_id(1)          # send only to the server (id 1)

# Clients may call this; it runs on the server (and locally if server is a player).
@rpc("any_peer", "call_local", "reliable")
func request_fire() -> void:
    var sender := multiplayer.get_remote_sender_id()
    if not _can_fire(sender):           # server-side validation
        return
    spawn_projectile.rpc(sender)        # tell everyone to spawn it

@rpc("authority", "call_local", "reliable")
func spawn_projectile(owner_id: int) -> void:
    _do_spawn(owner_id)

3. Per-node authority (each player controls their own avatar)

gdscript
extends CharacterBody2D

func _ready() -> void:
    # The node name is the owning peer's id; that peer is the authority.
    set_multiplayer_authority(name.to_int())

func _physics_process(delta: float) -> void:
    if not is_multiplayer_authority():
        return                          # only the owner reads input & moves
    velocity = Input.get_vector("left", "right", "up", "down") * 200.0
    move_and_slide()

4. MultiplayerSynchronizer config (editor + replication)

gdscript
# Add a MultiplayerSynchronizer child; in its Replication editor add the properties to
# sync (e.g. position, velocity). Set "Sync"/"Spawn" flags per property. From code you
# can scope visibility:
@onready var sync: MultiplayerSynchronizer = $MultiplayerSynchronizer

func _ready() -> void:
    # Only replicate this node to a specific peer (e.g. private info).
    sync.set_visibility_for(target_peer_id, true)

Pitfalls

  • RPC signature checksum. Every @rpc method in a script must exist with the same

declaration on both client and server builds — even unused ones. A mismatch causes errors that may point at the wrong function. Argument names/count are not checked, but the set of RPCs and their annotations are.

  • Default `@rpc` is `"authority"`. Clients calling it are ignored unless you set

"any_peer". Use "call_local" so the host (also a player) runs it too.

  • NodePaths must match across peers. RPC routing uses the node's path/name; spawn nodes

with identical names on all peers (use MultiplayerSpawner or add_child(node, true) for readable, deterministic names).

  • Trusting the client. Never let clients set authoritative state (health, position,

hits) directly. Send intent, validate on the server, then broadcast results.

  • RPC on non-Node classes fails. @rpc methods must be on Node-derived classes, not

plain Resource/RefCounted.

  • RPCs don't serialize Objects/Callables. Pass plain data (ints, strings, arrays,

dictionaries, PackedArrays).

  • Forgetting to reset the peer. To disconnect cleanly, set

multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new().

  • Android needs INTERNET permission in the export preset or all networking is blocked.

References

  • For MultiplayerSpawner setup, transfer modes/channels, SceneMultiplayer

authentication (auth_callback/complete_auth), a lobby skeleton, and dedicated-server export notes, read references/replication-and-rpc.md.

Related skills

  • godot-nodes-scenes — instancing the scenes that get spawned/synced.
  • godot-signals-groups — connection signals and event flow.
  • godot-export — exporting a headless dedicated server build.

관련 작업

같은 저장소의 Skills

더 많은 Skills

모든 Skills
gamedev-skills
커뮤니티

game-feel

Add "juice" and game feel that makes actions satisfying — screen shake, hit-stop/freeze frames, tweened/eased motion, squash & stretch, knockback, and layered audio-visual feedback — as engine-neutral techniques that pair with the detected engine's tween, particle, and camera APIs. Use when the user mentions game feel, juice, "make it feel good/punchy", screen shake, hit stop, screen freeze, easing, squash and stretch, impact frames, or feedback/polish on hits, jumps, pickups, and deaths.

설치 수
16
GitHub Stars
4.3천
업데이트
10월 24일
gamedev-skills
커뮤니티

audio-design

Implement game audio practice — bus/mixer architecture and gain in decibels, ducking (sidechain), adaptive/dynamic music via layering and re-sequencing, SFX variation, and beat synchronization. Engine-neutral. Use when the user mentions audio mixing, audio buses, adaptive/dynamic music, ducking, SFX variation, music layers, or syncing gameplay to the beat.

설치 수
13
GitHub Stars
4.3천
업데이트
10월 24일
gamedev-skills
커뮤니티

performance-optimization

Find and fix game performance problems methodically — measure with the engine profiler first, reason about the frame-time budget, locate the CPU-vs-GPU bottleneck, then apply the right fix: object pooling, draw-call batching, fewer allocations/GC spikes, and asset budgets. Engine- neutral method that pairs with each engine's profiler. Use when the user mentions performance, optimize, low/dropping FPS, frame drops, stutter, lag, profiler, frame budget, draw calls, batching, garbage collection/GC

설치 수
13
GitHub Stars
4.3천
업데이트
10월 24일
gamedev-skills
커뮤니티

shader-programming

Write game shaders from cross-engine fundamentals — the vertex→fragment pipeline, coordinate spaces, UV math, and common 2D/3D effects (tint, UV scroll, dissolve, outline, fresnel rim, vignette) in GLSL with HLSL equivalents. Use when the user mentions shaders, fragment/pixel shader, vertex shader, UV, GLSL, HLSL, or effects like dissolve, outline, or rim light.

설치 수
13
GitHub Stars
4.3천
업데이트
10월 24일