Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一光子-如何同步玩家统计/信息_C#_Unity3d_Rpc_Photon - Fatal编程技术网

C# 统一光子-如何同步玩家统计/信息

C# 统一光子-如何同步玩家统计/信息,c#,unity3d,rpc,photon,C#,Unity3d,Rpc,Photon,我试图创建一个合作的第一人称多人游戏,我想我误解了光子和RPC的工作原理。 我有一个正在工作的第一人称多人游戏项目,玩家头像可以看到彼此,并在玩家头像有光子视图光子变换视图时四处移动。 作为玩家控制器脚本(仅处理本地玩家的玩家移动)的一部分,该脚本附加到玩家头像预置,我有一个属性: public PlayerCharacterInfo myCharacter; 其中包含玩家的所有信息和统计信息,包括姓名、级别、当前HP、maxHP等,当玩家进入房间并实例化其化身时,这些信息和统计信息会添加到玩

我试图创建一个合作的第一人称多人游戏,我想我误解了光子和RPC的工作原理。 我有一个正在工作的第一人称多人游戏项目,玩家头像可以看到彼此,并在玩家头像有光子视图光子变换视图时四处移动。 作为玩家控制器脚本(仅处理本地玩家的玩家移动)的一部分,该脚本附加到玩家头像预置,我有一个属性:

public PlayerCharacterInfo myCharacter;
其中包含玩家的所有信息和统计信息,包括姓名、级别、当前HP、maxHP等,当玩家进入房间并实例化其化身时,这些信息和统计信息会添加到玩家化身的玩家控制器中

当我加入多人游戏室时,每个玩家只能看到自己的统计数据。例如,在运行游戏时的编辑器中,仅在玩家控制器myCharacter上显示本地编辑器玩家化身的值。 我可以看到其他玩家头像上有一个实例化的myCharacter,但没有显示任何值。 在这一点上,我想我只需要在我的播放器控制器中有一个这样的RPC函数,它将myCharacter重新分配给它自己,这样它就可以广播给所有人:

[PunRPC]
void RPC_AddCharacter(PlayerCharacterInfo paramCharacter)
{
    myCharacter = paramCharacter;
}
在void Start()中:

但这并没有让我看到非本地玩家化身的myCharacter值

我的目标是首先通过光线投射显示你正在查看的玩家头像的名称,但我甚至无法同步这些数据

我的想法是对的,但我执行错了? 或者这不是光子的工作原理? 我是否需要将每位玩家的PlayerCharacterInfo存储在每个玩家的房间控制器或类似的东西中?

您想要使用的

光子的自定义属性由一个键值哈希表组成,您可以 你可以按需填写。这些值被同步并缓存在客户端上, 所以你不必在使用前取它们。更改被推送到 其他由SetCustomProperties()创建

这有什么用?通常,房间和玩家都有一些属性 与游戏对象无关的:当前地图或游戏对象的颜色 玩家的角色(思考:2d跳跃和奔跑)。这些可以通过电子邮件发送 对象同步或RPC,但它通常更便于使用 自定义属性


有点解决了!我删除了试图同步我的自定义PlayerCharacterInfo对象的RPC调用,而是在PlayerController中调用了一个新字符串“myCharacterName”,以仅保存播放器的名称

新的RPC调用接受本地播放器的myCharacter.characterName(来自PlayerCharacterInfo),并将myCharacterName和syncs设置为all。 这很有效,我的编辑器播放器可以看到其他播放器的myCharacterName!然而,我并没有接近同步我的整个myCharacter类

现在我对如何工作有了正确的想法,我能够进行更多的研究,发现光子无法正常同步自定义类,但您可以序列化类以发送它:

然而,读到这篇文章让我意识到,我可能不需要同步我的整个玩家数据(它不仅包含健康和状态,还包含库存、设备、任务等信息),而且我最好在单独的通话中同步单独的数据类型

这个帖子也有帮助:

这并不是我想要的,因为我需要每个玩家都有自己的myCharacter对象和各自的值,但这仍然非常有用,因为我最终需要这种“房间数据”。谢谢。@toxia我建议您更深入地了解CustomProperties,包括文档和演示。它们用于轻松同步状态,光子播放器对象也具有自定义属性,因此它非常适合同步不经常更改的播放器状态,不管是什么:名称、颜色、等级、分数。
if(PV.IsMine)
{
    PV.RPC("RPC_AddCharacter", RpcTarget.All, myCharacter);
}