Godot 4.0 C#中Multiplayer.PeerConnected信号未触发问题排查
问题排查与解决方案
核心问题分析
你的peer_connected信号注册成功但未触发,主要是以下几个原因导致:
1. 信号仅在服务器端触发
Godot的Multiplayer.peer_connected信号只有服务器实例会触发,客户端无法捕获该信号。如果你的脚本运行在客户端节点上,自然收不到新客户端连接的事件。
2. 方法参数类型不匹配
peer_connected信号传递的是int类型的peer ID,而你的SpawnPlayer方法参数是long id,类型不匹配会导致Godot无法正确调用该方法。
3. 信号注册时机晚于连接建立
如果菜单的连接逻辑(比如点击按钮连接服务器)在_Ready之后执行,而信号注册在_Ready中,可能连接完成时信号还未注册,导致错过触发。
修复步骤
确保脚本在服务器端注册信号
仅在服务器实例中注册peer_connected信号,可通过Multiplayer.IsServer()判断:public override void _Ready() { _main = GetTree().Root.GetNode("Main"); _players = _main.GetNode("Players"); _menu = ResourceLoader.Load<PackedScene>("res://scenes/menu.tscn").Instantiate(); _main.AddChild(_menu); // 仅服务器端注册信号 if (Multiplayer.IsServer()) { Multiplayer.PeerConnected += SpawnPlayer; Multiplayer.PeerDisconnected += RemovePlayer; } }修正方法参数类型
将SpawnPlayer的参数改为int,匹配信号传递的类型:public void SpawnPlayer(int id) { GD.Print("derpers1"); Player player = (Player)ResourceLoader.Load<PackedScene>("res://scenes/player.tscn").Instantiate(); player.PeerID = id; _players.AddChild(player); }调整信号注册时机
如果连接逻辑在菜单按钮点击时触发,确保信号注册在连接操作之前完成。比如将信号注册移到服务器启动/客户端连接的逻辑前执行。
额外验证
- 启动服务器后再启动客户端,查看服务器控制台是否打印
derpers1。 - 确认服务器端已正确初始化
Multiplayer(比如通过ENetMultiplayerPeer设置端口并启动)。
内容的提问来源于stack exchange,提问作者David Menard
相关产品推荐
相关产品推荐

