一个人如何在实体组件系统中存储全局上下文数据?


10

我的问题是这样的:

一个将如何存储全局上下文数据,即。实体组件系统中的世界数据信息,当前世界时间等?

我正在考虑使用C ++构建矮人要塞风格的开放式世界模拟游戏。我只是出于娱乐目的而建立了一个实体组件样式的游戏引擎,而我目前正在试图弄清楚如何在所有想要的功能中工作。除了标准的游戏玩法(渲染,物理,特定于实体的组件数据等)之外,我还希望获得一些所有相关系统都可以访问的全局上下文数据(即世界数据,例如当前的年份) ,全球变暖是否正在发生,与模拟世界有关的任何事物)。我最初曾想过要制作一个“世界”组件,但是如果许多不同的系统需要访问这个逻辑上的“全局”数据,这似乎毫无意义且困难。

拥有“世界”组件是否有意义,还是应该以其他方式存储此数据?

我还考虑过将这些数据简单地全局化,从而可以访问任何想要使用它的系统。这似乎总体上违反了实体组件原则,并且由于其他原因可能有些混乱,但是我认为这可能确实有效。

我想到的另一件事是将相关的世界上下文数据直接直接嵌入系统本身。例如,如果我有一个AgeSystem“老化”的具有getsWeakerAsTimePasses组件之类的所有实体,那么也许该系统可以直接将世界的相关时间数据存储为成员数据,以用于计算时间的流逝以及需要多少时间。年龄和弱化人们等。这是我最不喜欢的第三种选择,但是在头脑风暴中发生了一些事情。

有人可以建议吗?


3
拒绝投票的理由不仅对OP,而且对其他用户而言都是礼貌和有用的。
MichaelHouse

2
您已经建立了一把锤子,现在一切看起来都像钉子。我授予您使用ECS来保存和操纵程序中数据的权限,因为这并不是万能的。
Patrick Hughes

Answers:


10

任何可行的方式都是可行的方式。这听起来很愚蠢,但实际上,您的游戏比架构重要1000倍。选择您喜欢的任何方法,并找到易于使用的方法。

我在实际的运输游戏中看到过(使用基于组件的设计,而不是专门用于ECS;尽管许多组件设计都具有类似ECS的元素,但我从未见过“纯天然ECS”在野外使用):

  • 单身人士
  • 传递给包含对所有其他相关系统的引用的组件/系统的“上下文”对象
  • 将系统句柄传递给单个组件的组件工厂
  • 在对象层次结构的根中存储对系统的引用的组件(仅在某些奇数Unity游戏中)
  • 传递给持有对所有其他系统的引用的系统或组件的单一“引擎”对象
  • 基于字符串的资源查找系统(允许您使用C ++执行类似handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"),是的,确实如此)
  • 成堆的全局数据和在其上操作的C样式自由函数
  • 空间/子空间随附的视频

他们都工作。我对某些方法有所了解,并且很喜欢它,但是它们都已用于发布AAA游戏。有时,在一个项目中使用多种方法(40-100个以上的工程师团队往往会创建偶然的重复代码,las)。


2
我很想知道您最喜欢哪一个。
ashes999

我提供的链接是指向我的幻灯片的幻灯片,以及一个我正在就该主题进行演讲的视频(如果有任何提示)。:)
肖恩·米德迪奇

嗯,所以您最喜欢的是空格/子空间。:)
ashes999

好答案。我认为我已经解决了一些问题,实际上我继续将“空间/子空间”的概念纳入我的游戏计划。
Awesomania
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.