HOME / 第 6 部分 · 数据与进阶开发 / 第 72 课
MODULE 6 · 数据与进阶开发
第 72 课 · 多人游戏入门
🎯 本课学习目标
- 理解多人同步的两种模式
- 用 ENet 搭建主机/客户端
- 实现玩家位置同步
本课实现本地联机(LAN)多人:一个当主机,其他当客户端,位置实时同步。
📖 详细教学步骤
多人同步的两种模式概念
- 主机/服务器权威:服务器裁决,防作弊(竞技)
- 点对点(P2P):互相转发,简单(合作/本地)
Godot 内置 ENetMultiplayerPeer 支持两种。本课做主机/客户端。
创建主机代码
用 MultiplayerSpawner 简化同步(Godot 4 特性):
GDSCRIPTextends Node
@onready var spawner: MultiplayerSpawner = $MultiplayerSpawner
func host():
var peer = ENetMultiplayerPeer.new()
var err = peer.create_server(9999) # 端口 9999
if err != OK:
print("创建主机失败")
return
multiplayer.multiplayer_peer = peer
spawner.spawn_path = "/root/Main/Players"
multiplayer.peer_connected.connect(_on_peer_connected)
_spawn_player(multiplayer.get_unique_id()) # 主机自己也生成
func _on_peer_connected(id: int):
print("玩家加入:", id)
_spawn_player(id)
func _spawn_player(id: int):
var p = player_scene.instantiate()
p.name = str(id)
spawner.add_child(p)
创建客户端代码
客户端连接主机:
GDSCRIPTfunc join(host_ip: String):
var peer = ENetMultiplayerPeer.new()
var err = peer.create_client(host_ip, 9999)
if err != OK:
print("连接失败")
return
multiplayer.multiplayer_peer = peer
multiplayer.connected_to_server.connect(_on_connected)
func _on_connected():
print("连接主机成功!")
_request_spawn.rpc_id(1) # 请求主机给自己生成玩家
@rpc("any_peer")
func _request_spawn():
_spawn_player(multiplayer.get_remote_sender_id())
同步玩家位置代码
玩家节点脚本:
GDSCRIPTextends CharacterBody2D
@export var speed: float = 200.0
func _ready():
# 只有控制自己(name == 自己id)才处理输入
if name != str(multiplayer.get_unique_id()):
set_physics_process(false) # 其他玩家的输入关掉
func _physics_process(delta):
# 本地输入移动
var dir = Input.get_vector("move_left", "move_right", "move_up", "move_down")
velocity = dir * speed
move_and_slide()
# 广播自己的位置
_sync_position.rpc(position)
网络同步广播代码
其他客户端收位置更新:
GDSCRIPT@rpc("any_peer", "unreliable")
func _sync_position(new_pos: Vector2):
position = new_pos
测试测试
- 运行两个游戏实例:一个点「创建主机」,一个点「连接」填 IP
- 两个窗口互相能看到对方玩家,并实时移动同步
- 调整同步频率/可靠性控制流畅度
🎉 局域网多人达成!
⚠️
连不上主机?
确认两台在同一局域网、IP 正确(cmd 输入 ipconfig 查 IP)、防火墙放行端口。
⚠️
位置不同步/乱跳?
确认 rpc 标记正确、spawn 路径对、只控制自己的玩家。
🧪 动手试一试
🏋️ 课后练习
让两个客户端玩家在地图上移动互见,并做一个「名字显示」(每个玩家头顶 Label 显示自己的名字)。
spawn 时传名字,客户端 Label 显示。
💡
多人在线开发从「局域网双人」起步,先打通再优化。
💡
位置同步用 unreliable(UDP 风格),关键事件用 reliable。
🎓 本课小结
多人游戏:ENetMultiplayerPeer 建主机/客户端 + MultiplayerSpawner 自动生成 + @rpc 同步位置;本地输入、网络广播,实现局域网联机。