Unity3D ECS框架 Entitas 基本概念

写文章

Unity3D ECS框架 Entitas 基本概念

Unity3D ECS框架 Entitas 基本概念

GeniusCode

GeniusCode

游戏开发

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

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值