HOME / 第 6 部分 · 数据与进阶开发 / 第 72 课
MODULE 6 · 数据与进阶开发

第 72 课 · 多人游戏入门

⏱ 预计时长 45 分钟📊 难度 进阶📚 模块 第 6 部分 · 数据与进阶开发

🎯 本课学习目标

本课实现本地联机(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

测试测试

  1. 运行两个游戏实例:一个点「创建主机」,一个点「连接」填 IP
  2. 两个窗口互相能看到对方玩家,并实时移动同步
  3. 调整同步频率/可靠性控制流畅度

🎉 局域网多人达成!

⚠️
连不上主机?

确认两台在同一局域网、IP 正确(cmd 输入 ipconfig 查 IP)、防火墙放行端口。

⚠️
位置不同步/乱跳?

确认 rpc 标记正确、spawn 路径对、只控制自己的玩家。

🧪 动手试一试

🏋️ 课后练习

让两个客户端玩家在地图上移动互见,并做一个「名字显示」(每个玩家头顶 Label 显示自己的名字)。

spawn 时传名字,客户端 Label 显示。

💡

多人在线开发从「局域网双人」起步,先打通再优化。

💡

位置同步用 unreliable(UDP 风格),关键事件用 reliable。

🎓 本课小结

多人游戏:ENetMultiplayerPeer 建主机/客户端 + MultiplayerSpawner 自动生成 + @rpc 同步位置;本地输入、网络广播,实现局域网联机。