我试图创建一个合作的第一人称多人游戏,但我认为我误解了Photon和RPC应该如何工作。 我有一个正在工作的第一人称多人项目,其中玩家化身可以彼此看到并随着玩家化身具有光子视图光子变换视图而四处移动。 作为附加在玩家头像预制板上的玩家控制器脚本(仅处理本地玩家的玩家移动)的一部分,我具有一个属性:
public PlayerCharacterInfo myCharacter;
包含玩家的所有信息和统计信息,包括姓名,级别,currentHP,maxHP等,并在玩家进入房间并实例化其头像时添加到玩家头像的PlayerController中。
当我加入多人游戏室时,每个玩家只能看到自己的统计信息。例如,在运行游戏的编辑器中,播放器控制器myCharacter上仅显示本地编辑器玩家头像的值。 我可以看到其他玩家头像上具有实例化的myCharacter,但未显示任何值。 在这一点上,我认为我只需要在播放器控制器中具有这样的RPC函数,即可将myCharacter重新分配给它自己,以便可以广播给所有人:
[PunRPC]
void RPC_AddCharacter(PlayerCharacterInfo paramCharacter)
{
myCharacter = paramCharacter;
}
在无效的Start()中:
if(PV.IsMine)
{
PV.RPC("RPC_AddCharacter", RpcTarget.All, myCharacter);
}
但这不能让我看到非本地玩家头像的myCharacter值。
我的目标是首先通过射线广播显示正在查看的播放器头像的名称,但我什至无法同步此数据。
我在这里有正确的想法,但是我执行错了吗? 还是这不是Photon的工作原理? 我是否需要将每个玩家的PlayerCharacterInfo存储在每个玩家的房间控制器中或类似的东西?
答案 0 :(得分:0)
您要使用Custom Properties。
Photon的自定义属性由键值哈希表组成,您可以使用 可以按需填充。这些值已同步并缓存在客户端上, 因此您无需在使用前先获取它们。更改已推送到 其他通过SetCustomProperties()。
这有什么用?通常,房间和玩家具有一些属性 与GameObject不相关的内容:当前的地图或颜色 玩家的角色(想想:二维跳跃和奔跑)。这些可以通过发送 对象同步或RPC,但是使用起来通常更方便 自定义属性。
答案 1 :(得分:0)
有些解决!我删除了试图同步自定义PlayerCharacterInfo对象的RPC调用,而是在PlayerController中进行了调用和新字符串'myCharacterName'来仅保留播放器的名称。
新的RPC调用获取本地播放器的myCharacter.characterName(来自PlayerCharacterInfo)并设置myCharacterName并同步到所有。 这有效,我的编辑器播放器可以看到其他播放器的myCharacterName!但是,我几乎无法同步整个myCharacter类。
现在,我对它的工作原理有了正确的认识,我可以进行更多的研究,发现Photon无法正常同步自定义类,但是您可以序列化类以发送它: https://doc.photonengine.com/en-us/realtime/current/reference/serialization-in-photon
但是,读到这使我意识到我可能不需要同步我的整个玩家数据(它不仅包含健康和状态,还包含库存,设备,任务等信息),而且我可能会更好在单独的调用中同步单独的数据类型。
此线程也有帮助: https://forum.photonengine.com/discussion/880/custom-class-object-sent-over-rpc