Unity中使用ECS的一个目的是高效的利用内存,提高运行速度,另外一个方面从代码层解决复杂的耦合关系。而一个主要的应用,我想是在角色类的设计上,对象和行为分离。如今,为了热更新,客户端逻辑层主要使用的是Lua,主要解决对象和行为分离,提高角色的扩展性。
ECS的本质是数据驱动行为,拥有什么样的Componet就可以执行对应的行为。
ECS:E(Entity)是实体,是C(Component)的拥有者;C是基本数据的组织者;S(System)是C的控制者。
那么Entity怎样去组织Component?System应该怎么样去操作Component呢?
Entity和Component的组织方法有两种:Entity拥有Component,如
1. Entity是Component的集合
Class Entity
{
List<Component> components;
}
2. Component拥有Entity的ID,而Entity就只是一个ID就足够了,因为Component标记了其属于谁。
Class Entity
{
int id;
}
Class Component
{
int ownerEntity;
//Data
}
System操作Component,就是不同的System对关心的Component进行操作,使用过滤器就能够做到。
而Entity终究有什么用呢,其实就是标记是一个Object,而只有通过这个Entity才能获取数据,才是一个整体。
这里只说对ECS设计的理解,了解了这些,就可以设计ECS系统。对游戏来说,角色的设计 组合优于继承,原因在于,角色的基础都是一样的,角色拥有的Component不一样,就能拥有不同的行为。比如NPC拥有了移动组件就能够移动。可以丰富和解除很多特定的耦合关系。简单来说,Role是System的扯线木偶。