1

这可能是一个菜鸟问题,但对我来说很重要。我也认为这是一个有趣的话题。

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

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

我检查了 Unity 文档,这似乎很糟糕。或者也许我理解错了。SyncList 似乎只有整数等基本类型,还有一个结构,但是......我真的需要将带有玩家统计信息的类转换为结构以进行服务器范围的同步吗?

再一次我想要实现的目标:我需要有一个全球玩家列表,新加入的玩家将被添加和识别。我已经完成了识别——在添加新实例时,我给那个玩家一个ID = PlayerList.Count - 1. ID 是静态的,但应该是本地的。如果 PlayerList 的元素可以是 PlayerStats 类实例,那可能是最好的。所以每个玩家(在他自己的索引处)将他的数据从磁盘加载到他在 PlayerList 中的实例中。我认为那样会很方便(虽然不知道该怎么做)。它在单人模式下工作,但在多人游戏中我不知道如何正确设计它。因为我需要该静态列表是服务器范围的,了解其他玩家。

如果我必须同步设备,这些设备是由我的项目中的类组成的。

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

所以基本上,我需要将每个玩家都添加到列表中,拥有自己的 PlayerStats,并使这些 PlayerStats 易于与其他玩家交互/修改(以及 AI 敌人/环境,但这很容易,它是单人游戏)。将 PlayerStats 作为一个组件添加到 Player prefab 对我来说似乎有点过头了,因为游戏中几乎所有东西都会一直调用这些统计数据。所以这是一吨GameObject.Find("Player").GetComponent<PlayerStats>();。似乎那将是灾难性的设计。

4

1 回答 1

4

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

下一步将是实际的数据交换。您需要一种从对象中推断数据的方法。通过网络发送对象的完整实例将需要相当多的带宽,并且不需要看到其他客户端知道类本身的结构。因此,您所需要的只是在机器 B 上构造与机器 A 上存在的对象完全相等的信息。

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

  1. PlayerStats在您的实例上循环(稍后会详细介绍)
  2. 将它们转换为字符串
  3. 将这些字符串连接成一个字符串,用分隔符分隔(例如##
  4. 将其发送到客户端/服务器
  5. 客户端可以将字符串拆分回多个字符串
  6. 通过匹配 UUID,客户端可以确定哪些玩家已经存在,哪些需要重新创建。

关于循环,我的建议是使用观察者模式。简而言之,PlayerStats在这种情况下,每种类型的对象都有一个监控实例。每个实例PlayerStats都会在实例化时在观察者处注册,或者您可以创建一个为您进行实例化和注册的工厂。在销毁PlayerStats实例时,您需要再次从监视实例中“取消订阅”(您不希望幽灵引用困扰您的应用程序)。

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

希望这将使您朝着正确的方向开始!

于 2016-09-19T19:33:01.703 回答