You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中,可能连接完成时信号还未注册,导致错过触发。

修复步骤

  1. 确保脚本在服务器端注册信号
    仅在服务器实例中注册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;
        }
    }
    
  2. 修正方法参数类型
    将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);
    }
    
  3. 调整信号注册时机
    如果连接逻辑在菜单按钮点击时触发,确保信号注册在连接操作之前完成。比如将信号注册移到服务器启动/客户端连接的逻辑前执行。

额外验证

  • 启动服务器后再启动客户端,查看服务器控制台是否打印derpers1。
  • 确认服务器端已正确初始化Multiplayer(比如通过ENetMultiplayerPeer设置端口并启动)。

内容的提问来源于stack exchange,提问作者David Menard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:02:36