写文章
Unity3D ECS框架 Entitas 基本概念
游戏开发
3 人赞了该文章
原文链接:Unity3D ECS框架 基本概念
Entitas是一个非常好用的框架,高复用性的代码,对Unity3D进行高度优化,大量的缓存对象管理,使得Entity/Component的访问简单快速。
这里简单介绍一下ECS的几个基本概念,以下是一张官方图:
Entity 实体
Entity是一个数据的容器,代表游戏中某个对象,它应该只有数据,没有方法,你可以以组件形式(IComponent)添加、替代、删除这些数据。
entity.AddPosition(3, 7);
entity.AddHealth(100);
entity.isMovable = true;
entity.ReplacePosition(10, 100);
entity.ReplaceHealth(entity.health.value - 1);
entity.isMovable = false;
entity.RemovePosition();
var hasPos = entity.hasPosition;
var movable = entity.isMovable;
Context 环境
Context是一个工厂,用来创建和销毁Entity,可以使用它来过滤出所感兴趣的Entity。
var gameContext = Contexts.game;
var entity = gameContext.CreateEntity();
entity.isMovable = true;
var entities = gameContext.GetEntities(Matcher<GameEntity>.AllOf(GameMatcher.Movable, GameMatcher.Position));
foreach (var e in entities) {
// do something
}
Matcher
Matchers是通过code generator自动生成,通常用于从Context中获取所感兴趣的Groups。
var matcher = GameMatcher.Movable;
GameMatcher.AllOf(GameMatcher.Movable, GameMatcher.Position);
GameMatcher.AnyOf(GameMatcher.Move, GameMatcher.Position);
GameMatcher
.AllOf(GameMatcher.Position)
.AnyOf(GameMatcher.Health, GameMatcher.Interactive)
.NoneOf(GameMatcher.Animating);
Group 组
在Context中可以对Entity进行快速过滤,它能不断的更新以保持当前的组中的Entity是最新的。假设Context有上千个Entities,但只有两个Entities拥有PositionComponent,那只要向Context询问特定的组就能立刻获取到所有符合的Entity。
gameContext.GetGroup(GameMatcher.Position).GetEntities();
Group和Group所过滤到的entities会被缓存下来,所以即使多次调用GetGroup方法,也是非常高效的。
gameContext.GetEntities(GameMatcher.Movable)
内部也是通过Groups的方式来实现。Groups 拥有以下事件OnEntityAdded, OnEntityRemoved 和 OnEntityUpdated来直接响应Entity的变化。
Collector 收集器
Collector提供了一种简单的方法来处理Group中Entity变化的反应。假设你需要收集和处理所有entities,他们的PositionComponent被添加或替换:
var group = gameContext.GetGroup(GameMatcher.Position);
var collector = group.CreateCollector(GroupEvent.Added);
之后:
foreach (var e in collector.collectedEntities) {
// do something with all the entities
// that have been collected to this point of time
}
collector.ClearCollectedEntities();
我们还可以注销这个Collector
collector.Deactivate();
Systems
有四种不同类型的Systems:
- IInitializeSystem: 执行一次
- IExecuteSystem: 每帧执行
- ICleanupSystem: 在别的systems完成后,每帧执行
- ReactiveSystem: 当Group有变化时执行
国内Entitas交流网站:Unity3D ECS Framework - Entitas