Unity Mirror自定义玩家生成器调用AddPlayerForConnection报InvalidCastException错误
错误根因
- 执行上下文不匹配:你当前在**客户端回调
OnClientConnect**中调用了仅服务器可执行的NetworkServer.AddPlayerForConnection接口,客户端侧不存在有效服务器上下文的连接实例,传入的客户端NetworkConnection对象无法被服务器API识别,因此触发类型转换错误。 - 预制体配置缺失:若你的
Player预制体未挂载NetworkIdentity组件、或勾选了组件的Server Only选项,绑定连接时也会触发该转换错误。 - 逻辑顺序错误:当前代码在未完成网络对象生成同步的情况下直接绑定连接,不符合Mirror的网络对象生命周期要求。
修复步骤
- 移除
OnClientConnect中的玩家生成逻辑,客户端侧不负责玩家对象的创建,修正后的OnClientConnect仅保留必要的客户端逻辑:
public override void OnClientConnect(NetworkConnection conn) { connlist.Add(conn); if (!clientLoadedScene && !NetworkClient.ready) { NetworkClient.Ready(); } base.OnClientConnect(conn); }
- 重写服务器侧的
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!"); }
- 检查
Player预制体配置:
- 确认预制体上挂载了
NetworkIdentity组件,未勾选Server Only选项 - 若需要同步位置等属性,额外挂载
NetworkTransform组件 - 将
Player预制体添加到NetworkManager组件的Spawnable Prefabs列表中
补充说明
如果需要传递玩家名等自定义数据,可在客户端连接成功后发送自定义网络消息到服务器,服务器收到消息后再生成玩家并赋值对应属性即可。
内容的提问来源于stack exchange,提问作者DitIsVincent
相关产品推荐
相关产品推荐

