我试图创建一个合作的第一人称多人称多人游戏,我想我误解了Photon和RPC应该如何工作。我有一个正在工作的第一人称多人多玩家项目,玩家的头像可以看到彼此并移动,因为玩家的头像有一个光子视图光子变换视图。作为附加到播放器头像预置的播放器控制器脚本(仅处理本地玩家的播放器移动)的一部分,我有一个属性:
public PlayerCharacterInfo myCharacter;它包含玩家的所有信息和统计信息,包括姓名、级别、currentHP、maxHP等,当玩家进入房间并实例化他们的头像时,这些信息被添加到玩家头像的PlayerController中。
当我加入一个多人房间时,每个玩家只能看到他们自己的数据。例如,在编辑器中运行游戏时,只有本地编辑器玩家头像的值显示在玩家控制器myCharacter上。我可以看到其他玩家的头像上有一个实例化的myCharacter,但没有显示任何值。在这一点上,我想我只需要在我的播放器控制器中有一个像这样的RPC函数,它只是将myCharacter重新分配给它自己,这样它就可以广播给所有人:
[PunRPC]
void RPC_AddCharacter(PlayerCharacterInfo paramCharacter)
{
myCharacter = paramCharacter;
}在void Start()中:
if(PV.IsMine)
{
PV.RPC("RPC_AddCharacter", RpcTarget.All, myCharacter);
}但这并不能让我看到非本地玩家头像的myCharacter值。
我的目标是首先通过光线投射显示你正在查看的玩家头像的名称,但我甚至无法同步这些数据。
我的想法是正确的,但我执行错了吗?或者这不是Photon的工作方式?我是否需要在房间控制器中为每个玩家存储每个玩家的PlayerCharacterInfo,或者类似的东西?
发布于 2019-06-29 20:15:40
您想要使用Custom Properties。
Photon的自定义属性由一个键值哈希表组成,您可以按需填充该表。这些值被同步并缓存在客户机上,因此您不必在使用它们之前获取它们。更改由SetCustomProperties()推送到其他对象。
这有什么用呢?通常,房间和玩家具有一些与GameObject无关的属性:当前地图或玩家角色的颜色(考虑: 2d跳跃和奔跑)。这些可以通过对象同步或远程过程调用来发送,但使用自定义属性通常更方便。
发布于 2019-06-29 20:40:55
在某种程度上解决了!我删除了试图同步我的自定义PlayerCharacterInfo对象的RPC调用,而是在PlayerController中进行了一个调用和新字符串'myCharacterName‘来保存玩家的名字。
新的RPC调用获取本地播放器的myCharacter.characterName (来自PlayerCharacterInfo),并将myCharacterName和syncs设置为all。这是可行的,我的编辑器播放器可以看到其他播放器的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
https://stackoverflow.com/questions/56815715
复制相似问题