Unity3D ECS框架 Entitas 基本概念

写文章

Unity3D ECS框架 Entitas 基本概念_第1张图片

Unity3D ECS框架 Entitas 基本概念

GeniusCode

GeniusCode

游戏开发

3 人赞了该文章

原文链接:Unity3D ECS框架 基本概念

Entitas是一个非常好用的框架,高复用性的代码,对Unity3D进行高度优化,大量的缓存对象管理,使得Entity/Component的访问简单快速。

这里简单介绍一下ECS的几个基本概念,以下是一张官方图:

Unity3D ECS框架 Entitas 基本概念_第2张图片

 

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.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

 

 

 

你可能感兴趣的:(Unity3D ECS框架 Entitas 基本概念)