今天继续第一个游戏练习, 创建一个主菜单, 并将它设置为默认运行场景, 并创建基础的多人Host服务器和Client连接
创建主菜单
创建一个根节点为Control的main_menu.tscn场景
结构如下

image.png
添加的两个按钮用于创建Host服务器和Client客户端
将main_menu.tscn设置为项目默认场景: Project -> Project Settings -> Run -> Main Scene
绑定脚本
脚本处理按钮事件, 暂时只打印点击事件
extends Control
@onready var host_button: Button = %HostButton
@onready var join_button: Button = %JoinButton
func _ready() -> void:
host_button.pressed.connect(_on_host_pressed)
join_button.pressed.connect(_on_join_pressed)
func _on_host_pressed() -> void:
print("host pressed")
func _on_join_pressed() -> void:
print("join pressed")
基本的服务器和客户端创建
修改Host和Join按钮的逻辑, 使用Godot中提供的高级网络接口创建服务器和客户端
extends Control
const PORT : int = 34560
@onready var host_button: Button = %HostButton
@onready var join_button: Button = %JoinButton
func _ready() -> void:
host_button.pressed.connect(_on_host_pressed)
join_button.pressed.connect(_on_join_pressed)
multiplayer.peer_connected.connect(_on_peer_connected)
func _on_host_pressed() -> void:
var server_peer := ENetMultiplayerPeer.new()
server_peer.create_server(PORT)
multiplayer.multiplayer_peer = server_peer
func _on_join_pressed() -> void:
var client_peer := ENetMultiplayerPeer.new()
client_peer.create_client("127.0.0.1", PORT)
multiplayer.multiplayer_peer = client_peer
func _on_peer_connected(id: int) -> void:
print("my peer [%s] connected: %s" % [multiplayer.get_unique_id(), id])
Host和Client都监听多人接口的peer_connected信号, 在信号处理时同时打印当前peer的id, 以及新连入的peer id
观察多人连接时peer_connected的触发方式
先打开多客户端示例支持 Debug -> Customize ... -> Enable Multiple Instances, 设置为3
再次运行游戏, 会同时打开3个实例

image.png
第一步: 在第一个游戏实例中点击Host, 创建服务器, 无打印
第二步: 在第二个游戏实例窗口点击Client, 连接服务器, 发现Host和Client都出现了打印
my peer [1234621383] connected: 1
my peer [1] connected: 1234621383
第三步: 在第三个游戏实例窗口中点击Client, 再观察新增的打印内容
my peer [834066640] connected: 1
my peer [1] connected: 834066640
my peer [1234621383] connected: 834066640
my peer [834066640] connected: 1234621383
众所周知, Server的peer id为1, 根据打印结果可得知
当一个peer连接到服务器时, 该peer自身会收到来自每一个其余peer(包含服务器)的peer_connected事件, 而其余每一个peer(包括服务器)也都会收到来自该peer的peer_connected事件