You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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或者ComponentGetComponent方法只能用来查找挂载在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

火山引擎 最新活动