欢迎光临散文网 会员登陆 & 注册

组件模式

2023-03-01 14:37 作者:伪乱  | 我要投稿

在设计模式中有一个原则叫做合成复用。

在游戏编程领域中,常常需要让一个对象实现热插拔的功能。但是不能从代码处进行热插拔,因为这违反了开闭原则。

所以渐渐的基类的体量越来越大,形成了所谓的胖球。

当然我们也可以用装饰者模式,来扩展对象的功能。



为什么要实现热插拔,因为对于同样的一个player实体,我们希望他有背包功能,也希望他有宠物功能。我们希望在特定的时候,禁止甚至没有背包功能。

这个时候,就得掏出我们的组件模式了。

典型的组件模式就ECS。unity和ue的组件。

组件可以随时随地取消和挂载。

组件与组件之间完全可以独立运行,但是通常有需要导致某个组件依赖于另一个组件

比如一个移动组件,往往依赖对象的transform组件

我们的技能组件也会依赖于数值组件。这种依赖是无法避免的。



我仿照着unity的组件,构建了一个组件系统。

Entity和Component

entity只具备一个功能,保存Component的索引,并开放出组件的添加和获得的接口。

Component的功能就更简单的,如果不考虑生命周期,那么Component只需要持有entity的索引,以便获得entity上挂载的其他Component来执行来的逻辑即可。在子类中实现具体的逻辑。


ECS又怎么做呢?

将原有的Component拆分为Component和system。Component只具备数据,system只处理数据,这样就可以把Component放在栈上去处理了。但是这需要特殊处理。目前我只能把Component放在堆上。

entity只具备一个id。在创建entity的时候,是通过entitymanager给与一个id。

entitymanager再通过这个ID来查询对应的Component。

由于system和Component分离,因此system大量的使用了this的语法糖,从代码侧为为Component添加功能。每个Component都有一个对应的system。

从而让ecs代码,在调用上与以往一样。只是代码结构有所变化

大功告成。没有做数据整理的ecs框架。

组件模式的评论 (共 条)

分享到微博请遵守国家法律