浅谈 UnrealEngine 基于 ECS(Entity Component System)架构开发设计

什么是ECS

ECS 即 Entity-Component-System ,其模式遵循组合模式,不同于OOP(Object Oriented Programming),游戏内每一个基本单元(Entity)由一个或多个组件(Component)构成,通过游戏内不同的能力处理系统(System)来改变基本单元在游戏中的行为。实体与组件是一对多的关系,实体拥有什么样的能力,取决于实体拥有哪些能力组件。

为什么要用ECS

在游戏项目开发过程中,一般会采用OOP的设计方式让Object直接处理自身业务逻辑,由于继承是静态方式,一旦你继承了基类,那就无法替换和移除继承于基类的能力,这种继承关系使得派生的子类变得非常的臃肿。以这种思想进行框架的设计,在开发过程中如果修改类层次结构很可能会出现各种问题。为了解决OOP的高耦合性,降低复杂度,增加实体的可扩展性,我们选择使用这个架构去进行项目的开发。

怎样在UE中使用ECS

怎么在项目中使用ECS,着我们就要了解一下ECS的思考方式——实体有哪些行为,这些行为具有什么属性,哪些情况下会启用这些行为,哪些情况会终止这些行为。

根据这个思考方式,我们应该很容易得出一个结论——实体的行为是可扩展、可管理的。

基于这个想法,我们应该很容易想到一个东西——Manager(管理器),但是在ECS中不存在Manager这个东西,所以我们需要写一个能够统一管理 Component 的组件 ExtensionComponent

在创建ExtensionComponent 前 我们还要有一个关键步骤

声明一个接口,接口的目的是用于扩展组件遍历组件时判断是否初始化完毕的工具(由于扩展的其他组件是属于不同的类型,而组件的遍历需要元素类型相同,类比数组遍历)

这时候我们就需要一个接口类型,使得所有扩展的组件都要继承这个接口,即抽象一个BasicPawnComponent作为扩展组件的基类,基类中声明组件是否初始化的方法,使得派生的子类都拥有这个方法。

组件接口
继承接口的抽象类
最基本的扩展组件内方法与属性
检查实例中组件是否初始化完毕 等待广播
这里主要目的是将其他要扩展的组件初始化委托统一绑定到这个组件上 当准备好初始化时 统一执行
Hero组件注册时将初始化函数创建委托添加到扩展组件中

ECS基础架构大概就是酱紫,当然还有很多种方式可以实现ECS架构,我这里只列举了一个Hero组件,其他的组件可能会略有不同,可以自行研究。

如果有不对的地方,请批评指正!

虚幻版本V5.0.3

1 条评论

添加评论

您的邮箱地址不会被公开。 必填项已用 * 标注