游戏开发中的组件化架构

4
我一直在考虑尝试使用组件化架构进行游戏开发。我已经阅读了一些关于此的博客文章和文章,但还有一些问题我还没有解决。当我说组件化时,我的意思是您可以向ComponentManager添加组件,它会更新其列表中的所有组件。我想尝试这样做是为了避免获取继承不需要的变量和函数的类。我非常喜欢拥有一个非常简单的实体类,其中有许多组件并排工作而不会变得臃肿的想法。此外,可以在运行时轻松删除和添加功能,这使它真正酷炫。
这就是我所追求的。
// this is what the setup could be like
entity.componentManager.add(new RigidBody(3.0, 12.0));
entity.componentManager.add(new CrazyMagneticForce(3.0));
entity.componentManager.add(new DrunkAffection(42.0, 3.0));

// the game loop updates the component manager which updates all components
entity.componentManager.update(deltaTime);

通信:一些组件需要与其他组件通信

我不能依赖组件自给自足。有时它们需要与其他组件通信。如何解决这个问题?在Unity 3D中,您可以使用GetComponent()访问组件。

我曾考虑过这样做,但如果您有两个相同类型的组件会发生什么?也许你会得到一个向量返回。

var someComponent : RigidBody = _componentManager.getComponent(RigidBody);

优先级: 有些组件需要在其他组件之前更新

为了获取当前游戏循环的正确数据,有些组件需要在其他组件之前更新。我正在考虑为每个组件添加一个优先级,但我不确定这是否足够。Unity使用LateUpdate和Update,但也许有一种方法可以更好地控制执行顺序。

就是这样。如果您有任何想法,请随时留下评论。或者,如果您有任何关于此问题的好文章或博客,我将非常乐意查看它们。谢谢。

基于组件的游戏引擎设计

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


编辑: 我的问题实际上是如何解决优先级和组件间通信的问题。


1
好的 - 但是你的问题是什么,确切地说? - Cameron
我想获得关于组件间通信和优先级问题的输入。我会编辑问题以澄清。谢谢。 - Mattias
1个回答

3
我采用了一个RDMBS组件实体系统http://entity-systems.wikidot.com/rdbms-with-code-in-systems#objc,目前效果非常好。每个组件仅保留数据,没有方法。然后我有子系统处理这些组件并执行实际工作。有时,一个子系统需要与另一个子系统通信,我使用服务定位器模式http://gameprogrammingpatterns.com/service-locator.html。至于优先级,每个系统在我的主游戏循环中被处理,所以只是哪个被先处理的问题。所以对于我的系统,我先处理控制,然后物理,相机和最后渲染。

谢谢回答。我还有很多东西需要弄清楚,但您让我朝着正确的方向前进了。 - Mattias
@Mattias 不用担心。是的,我发现很多关于组件实体系统的文献都忽略了很多细节。最后,我阅读了所有能找到的资料,并想出了一些对我有意义的东西。我希望有一天能写一篇文章介绍它。我真的认为组件实体系统是游戏开发的未来,希望你也觉得它值得一试 :) - Allan
@Allan,我正在研究RDMBS方法。每个“系统”都会搜索与系统的组件标准匹配的实体。这不是非常低效吗?更不用说对于找到的每个实体,我们还必须再次搜索要使用的组件。是否有更有效的解决方案,或者我们必须为每次更新执行一系列字典查找和数组创建?我正在查看此代码库作为示例:[链接]https://github.com/adamgit/Game--Escape-from-the-Pit/blob/master/eclipse%20workspace/Escape%20From%20the%20Pit/src/org/tmachine/games/escapefromthepit/SubsystemGhosts.java - terry franguiadakis
@terry franguiadakis - RDMBS方法并不是为了最优速度而设计的,但这种权衡是值得的。实际上,性能损失可以忽略不计。对于游戏来说,至少50%的时间都用于渲染。在我的测试中,仅具有查找功能的实体系统仅占总时间的约1%。为了确保最佳性能,我使用了两个字典,一个用于在调用getAllComponentsOfType()时快速检索,另一个用于快速获取getComponent()。 - Allan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接