Unity NetCode ClientRpc参数空引用异常及跨客户端调用失败排查
扑克游戏ClientRpc调用问题排查方案
确认NetworkObject有效性
挂载ClientRpc方法的脚本必须在已Spawn的NetworkObject上,且该对象的NetworkIdentity组件未勾选Server Only。空引用异常常因客户端缺少对应NetworkObject实例导致Rpc无法触发,可在服务器Spawn对象时打印日志,确认客户端同步到位。验证ClientRpcParams参数
- 检查传入的Player ID对应的
NetworkConnection是否存在:调用Rpc前打印targetClientId,同时通过NetworkServer.connections确认该ID的连接未断开。 - 确保参数构造正确,示例:
避免传入空数组或无效ID(比如给非主机玩家发牌时,不要传入0)。var clientRpcParams = new ClientRpcParams { Send = new ClientRpcSendParams { TargetClientIds = new ulong[] { targetPlayerId } } };
- 检查传入的Player ID对应的
定位空引用异常源
- 主机的高亮空引用行,要明确是NetworkIdentity、手牌预制体还是本地玩家对象为空。调用Rpc前的打印值仅能说明服务器端参数有效,Rpc内部可能访问了客户端未初始化的对象。
- 在ClientRpc方法开头加日志,确认客户端是否收到Rpc:
[ClientRpc] private void DealCardsClientRpc(List<Card> hand) { Debug.Log($"客户端收到发牌Rpc,本地玩家:{GameManager.Instance.LocalPlayer != null}"); // 后续逻辑 }
检查ClientRpc方法规范
- 必须加
[ClientRpc]特性,方法名以ClientRpc结尾,参数需支持网络序列化(自定义Card类要加[Serializable]或实现INetworkSerializable)。 - 客户端逻辑仅操作本地实例,避免直接访问未同步的场景对象。
- 必须加
基础网络配置检查
- 确认NetworkManager正常启动,客户端连接成功,玩家对象已通过
NetworkServer.AddPlayer或SpawnWithClientAuthority分配权限。 - 检查项目NetworkSettings,确保未禁用ClientRpc接收功能。
- 确认NetworkManager正常启动,客户端连接成功,玩家对象已通过
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

