Photon Unity Networking 2中如何引用Player类并向特定玩家发送RPC
解决Photon 2中向特定玩家发送RPC的问题
咱们先拆解下你遇到的两个核心问题:一是GetComponent<Player>的报错,二是Photon升级后发送RPC给特定玩家的方式变化。
1. 为什么会出现GetComponent的报错?
你看到的这条错误:
ArgumentException: GetComponent requires that the requested component 'Player' derives from MonoBehaviour or Component or is an interface
本质原因是你代码里的Player类没有继承MonoBehaviour或者Component。GetComponent方法只能用来查找挂载在GameObject上的组件类——也就是必须继承自这两个基类(或者是接口)的类。如果你的Player是自己写的纯逻辑类(比如没有继承任何Unity组件基类),那肯定不能用GetComponent来获取它。
2. Photon 2中向特定玩家发送RPC的正确姿势
Photon 2和旧版本相比,玩家相关的API有不少改动:原来的PhotonPlayer被替换成了Player类,而且获取特定玩家的方式也变了,完全不需要你通过GameManager去绕弯子,Photon内置了直接获取玩家的方法。
正确代码示例
要向特定玩家发送RPC,你只需要拿到Photon官方的Player对象即可,不需要引用你自己的自定义玩家类:
// 获取目标玩家的Actor编号 int targetActorNr = other.GetComponent<PhotonView>().OwnerActorNr; // 通过Actor编号获取Photon的Player对象 Player targetPhotonPlayer = PhotonNetwork.CurrentRoom.GetPlayer(targetActorNr); // 发送RPC给这个特定玩家 other.photonView.RPC("Reflect", targetPhotonPlayer);
如果你需要用到自定义玩家逻辑类
如果你的Player是自定义的玩家控制组件(比如处理玩家移动、状态的类),那你需要先把它改成继承MonoBehaviour,然后通过Photon的Player对象找到对应的玩家GameObject,再获取组件:
int targetActorNr = other.GetComponent<PhotonView>().OwnerActorNr; Player targetPhotonPlayer = PhotonNetwork.CurrentRoom.GetPlayer(targetActorNr); // 获取玩家对应的GameObject(前提是你已经正确设置了Photon的ActorGameObject) GameObject targetPlayerObj = targetPhotonPlayer.ActorGameObject; // 获取你的自定义玩家组件(这里假设你的类叫PlayerController) PlayerController customPlayer = targetPlayerObj.GetComponent<PlayerController>();
你之前代码的问题出在哪?
- 你混淆了Photon官方的
Player类和你自己写的Player类:发送RPC只需要Photon的Player对象,不需要你自己的类引用。 GameObject.Find("Game Manager").GetComponent<Player>()的写法错误,要么你的Player不是组件类,要么Game Manager对象上根本没挂载这个组件。
内容的提问来源于stack exchange,提问作者nate300and4




