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

Unity Mirror自定义玩家生成器调用AddPlayerForConnection报InvalidCastException错误

错误根因
  • 执行上下文不匹配:你当前在**客户端回调OnClientConnect**中调用了仅服务器可执行的NetworkServer.AddPlayerForConnection接口,客户端侧不存在有效服务器上下文的连接实例,传入的客户端NetworkConnection对象无法被服务器API识别,因此触发类型转换错误。
  • 预制体配置缺失:若你的Player预制体未挂载NetworkIdentity组件、或勾选了组件的Server Only选项,绑定连接时也会触发该转换错误。
  • 逻辑顺序错误:当前代码在未完成网络对象生成同步的情况下直接绑定连接,不符合Mirror的网络对象生命周期要求。
修复步骤
  1. 移除OnClientConnect中的玩家生成逻辑,客户端侧不负责玩家对象的创建,修正后的OnClientConnect仅保留必要的客户端逻辑:
public override void OnClientConnect(NetworkConnection conn)
{
    connlist.Add(conn);
    if (!clientLoadedScene && !NetworkClient.ready)
    {
        NetworkClient.Ready();
    }
    base.OnClientConnect(conn);
}
  1. 重写服务器侧的OnServerAddPlayer方法,在服务器端完成玩家生成与绑定逻辑:
public override void OnServerAddPlayer(NetworkConnectionToClient conn)
{
    GameObject playerobject = Instantiate(Player, Vector3.zero, Quaternion.identity);
    // 玩家名可以通过客户端消息发送到服务器后赋值,这里可以补充消息收发逻辑
    // playerobject.GetComponent<PlayerManager>().PlayerName = 客户端传过来的玩家名;
    NetworkServer.AddPlayerForConnection(conn, playerobject);
    Debug.Log(playerobject.GetComponent<PlayerManager>().PlayerName + " is spawned!");
}
  1. 检查Player预制体配置:
  • 确认预制体上挂载了NetworkIdentity组件,未勾选Server Only选项
  • 若需要同步位置等属性,额外挂载NetworkTransform组件
  • 将Player预制体添加到NetworkManager组件的Spawnable Prefabs列表中
补充说明

如果需要传递玩家名等自定义数据,可在客户端连接成功后发送自定义网络消息到服务器,服务器收到消息后再生成玩家并赋值对应属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:54:03