Mirror报错:TargetRPC传入空连接的原因与解决方法
解决Mirror框架中TargetRpc调用"null connection"报错问题
报错核心原因
这个报错的本质是TargetRpc必须指定有效的目标客户端连接,你的代码存在两个关键问题:
- 挂载脚本的对象是场景对象,场景对象的
NetworkIdentity默认没有owner(connectionToClient为null)。直接调用TargetCreateSelection时,Mirror会默认使用当前NetworkBehaviour所属对象的owner.connection作为目标,自然得到null触发报错。 - 实例化卡牌时,
NetworkServer.Spawn(card)未指定玩家作为owner,卡牌不属于任何客户端连接,后续无法通过卡牌关联有效连接。
解决办法
1. 显式指定TargetRpc的目标连接
由于CmdCreateSelection是客户端发起的命令,可通过connectionToClient获取发起请求的玩家连接,显式传递给TargetRpc:
public void CmdCreateSelection() { List<GameObject> myLocalList = new(); // 获取当前调用Cmd的客户端连接 NetworkConnection targetConnection = connectionToClient; for (int i = 0; i < cardsPrefab.Count; i++) { GameObject card = Instantiate(cardsPrefab[i], holder); card.tag = "CreateDeck"; card.GetComponent<CardType>().prefab = cardsPrefab[i]; myLocalList.Add(card); // Spawn卡牌时指定owner为发起请求的玩家 NetworkServer.Spawn(card, targetConnection); // 显式传入目标连接调用TargetRpc TargetCreateSelection(targetConnection, card.transform); } } // 修改TargetRpc方法,添加NetworkConnection参数 [TargetRpc] public void TargetCreateSelection(NetworkConnection targetConn, Transform card) { card.SetParent(holder, false); }
2. 给场景对象关联有效玩家(可选)
如果场景对象需要长期属于某个玩家,可在场景加载完成后,为其NetworkIdentity分配客户端权限:
void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; } void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; } void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (isServer && scene.name == "你的游戏场景名称") { // 获取当前玩家(示例:从NetworkManager取本地玩家) PlayerController player = NetworkManager.singleton.LocalPlayer.GetComponent<PlayerController>(); if (player != null) { GetComponent<NetworkIdentity>().AssignClientAuthority(player.GetComponent<NetworkIdentity>().connectionToClient); } } }
此方法适合场景对象固定归属某玩家的场景,推荐优先使用第一种方法。
关键注意事项
- TargetRpc必须明确目标连接,不能依赖无owner对象的默认连接逻辑。
- 实例化网络对象时,尽量指定owner,确保后续网络操作能正确关联到对应客户端。
内容的提问来源于stack exchange,提问作者Oleksii
相关产品推荐
相关产品推荐

