C# - 如何同步“玩家统计数据”实例列表? (统一)

时间:2016-09-19 16:30:03

标签: c# unity3d unity5 multiplayer unity3d-unet

这可能是一个noob问题,但对我很重要。 我认为这是一个有趣的话题。

我正在使用C#和新的Unity多人游戏。你可以在这里找到教程:https://unity3d.com/learn/tutorials/topics/multiplayer-networking - 我正在研究这个基础。 我只是成功地制作了我的代码,以便当玩家加入或主持时,他将“玩家统计数据”添加到静态列表中作为“PlayerStats”类的实例。 它应该以这种方式为每个玩家工作 - 每当有人加入时,他的统计数据实例就会被添加到列表中。

现在,这个列表应该是一个全局的,所以我想 - 它应该由服务器同步。也许是某种SyncVar,可能是某种类型的SyncList。这就是问题 - 是否有任何方法可以同步类实例列表?

我检查过Unity文档,看起来真是太糟糕了。或许我理解错了。 SyncList似乎只有像integer这样的基本类型,还有一个struct,但是......我真的需要将带有播放器统计信息的类转换为一个结构,以进行服务器范围的同步吗?

我想要实现的目标:我需要有一个全球的球员名单,其中将添加和识别新的加盟球员。我已经完成了识别 - 在添加新实例时,我正在给该玩家ID = PlayerList.Count - 1。 ID是静态的,但应该是本地的。如果PlayerList的元素可能是PlayerStats类实例,可能是最好的。因此,每个玩家(在他自己的索引处)将他的数据从磁盘加载到他在PlayerList中的实例中。我认为这样方便(不知道如何做到这一点)。它适用于单人游戏模式,但在多人游戏中,我不知道如何正确设计它。因为我需要在服务器范围内使用静态列表,了解其他玩家。

如果我必须同步设备,那就是我的项目中的类。

你能以某种方式帮我设计吗?我正在尝试基于我们新的Unity多人游戏教程创建一个简单的多人RPG。 现在需要识别播放器并将数据加载到适当的位置,数据已经由字符生成器生成并保存,并且已经在单个播放器中正确加载。我认为我应该使用PlayerStats类的本地单例实例来获取玩家数据,并将这些实例保存在全局服务器范围的列表中。 我的PlayerStats是PlayerStatsObject的一个组件(层次结构中的空gameobject具有DontDestroyOnLoad)。 PlayerStats类,制作成单例实例,包含整个生成的角色,包括他的命名,类,种族,设备列表等等。

所以基本上,我需要将每个玩家添加到列表中,拥有自己的PlayerStats,并使这些PlayerStats能够轻松地与其他玩家进行交互/修改(和AI敌人/环境,但这很容易,它是单人游戏)。添加PlayerStats作为播放器预制件的一个组件对我来说似乎有些过分,因为这些统计数据几乎都会被游戏中的所有内容调用。所以这是GameObject.Find("Player").GetComponent<PlayerStats>();吨。似乎这将是灾难性的设计。

1 个答案:

答案 0 :(得分:4)

如何为服务器上的用户生成UUIDs。这些将为在客户端之间交换用户信息提供坚实的基础。

下一步将是实际的数据交换。您需要一种从对象推断数据的方法。通过网络发送完整的对象实例会产生相当大的带宽,并且不必看到其他客户端知道类本身的结构。所以你想要的只是在机器A上构建一个与机器B完全相同的对象的信息。

ToString是一种用于将复杂数据转换为字符串的标准。最常用于显示或存储此类数据。您可以选择要同步的对象字段并将它们组合成一个字符串。因此,通过向ToString课程添加PlayerStats方法,您可以:

  1. 循环(稍后会详述)PlayerStats个实例
  2. 将它们转换为字符串
  3. 将这些字符串连接成一个字符串,用分隔符分隔(例如##
  4. 将其发送到客户端/服务器
  5. 客户端可以将字符串拆分回多个字符串
  6. 通过匹配UUID,客户端可以确定哪些玩家已经存在以及哪些玩家需要新创建。
  7. 关于循环,我的建议是使用Observer Pattern。简而言之,在这种情况下,每种类型的对象都有一个监控实例PlayerStatsPlayerStats的每个实例都会在观察者身上注册实例化OR,你可以创建一个Factory来实例化并为你注册。在销毁PlayerStats个实例时,您需要&#34;取消订阅&#34;再次从监控实例(您不希望鬼引用困扰您的应用程序)。

    您使用PlayerStats作为组件的想法并不是一个奇怪的想法。然而,你是对的,一遍又一遍地寻找组件是浪费资源。使用观察者模式,您可以跟踪所有PlayerStats实例并轻松地循环它们。

    希望这会让你开始朝着正确的方向前进!