Skip to content

Introduction to Entitas

OneYoungMean edited this page Nov 8, 2018 · 4 revisions

Overview

Entitas快速,轻便,摆脱了不必要的复杂性. 在你火速开始你的游戏或者程序之前,你必须要知道少数几个名词以及他们的含义

+------------------+
|      上下文       |
|------------------|
|    e       e     |      +-----------+
|        e     e---|----> |    实体e   |
|  e        e      |      |-----------|
|     e  e       e |      |    组件A   |
| e            e   |      |           |      +-----------+
|    e     e       |      |    组件B  -|---->|    组件    |
|  e    e     e    |      |           |      |-----------|
|    e      e    e |      |    组件C   |     |    数据    |
+------------------+      +-----------+      +-----------+
  |
  |
  |     +-------------+  组:
  |     |      e      |  上下文中关于实体的子集
  |     |   e     e   |  为了快速被查询
  +---> |        +------------+
        |     e  |    |       |
        |  e     | e  |  e    |
        +--------|----+    e  |
                 |     e      |
                 |  e     e   |
                 +------------+

实体(Entity)

一个实体是一个容器,在你的应用中,它负责保存代表某些对象的数据。你可以以实际形式添加,替换或删除IComponent中实体中的数据。同时Entitias 具有相应的事件,以通知您是否添加,替换或删除了组件。

下面介绍一些您与实体互动的方式。尝试享受更自然,更易读的API,只需使用Entitas附带的代码生成器即可。

在这个例子中,你可以看到一些生成的方法比如 PositionComponent, HealthComponent, MovableComponent.

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;

上下文是一个负责创造或者销毁实体的工厂,他是实体的父级。使用它来过滤你所感兴趣的实体。

// Contexts.game is kindly generated for you by the code generator
var gameContext = Contexts.game;
var entity = gameContext.CreateEntity();
entity.isMovable = true;

// Returns all entities having MovableComponent and PositionComponent.
// Matchers are also generated for you.
var entities = gameContext.GetEntities(Matcher<GameEntity>.AllOf(GameMatcher.Movable, GameMatcher.Position));
foreach (var e in entities) {
    // do something
}

组可以对上下文当中的实体进行超级快速(super quick)的过滤。它们会一直的更新当实体发生变化,并且可以返瞬间返回你所需要的组。想想一下,你有成千上万个实体,但是你只想要那些拥有PositionComponent的组,只需要向上下文询问这个组,答案就已经在等着你了。

gameContext.GetGroup(GameMatcher.Position).GetEntities();

组与获取实体都被缓存在内存当中,所以关于调用他们方法将会非常的快,尝试尽可能多的使用这个小技巧。

同样gameContext.GetEntities(GameMatcher.Movable) 也是使用组的结构。

组具有事件 OnEntityAdded, OnEntityRemoved and OnEntityUpdated 可以直接对组的更改做出反应。

gameContext.GetGroup(GameMatcher.Position).OnEntityAdded += (group, entity, index, component) => {
    // Do something
};

如果你希望收集并处理需要改变的部分,尝试使用收集器是一个不错的主意。

收集器提供了一种简单的方法来响应组中的更改。 在下面我将演示如何去使用收集器,假设您想要收集和处理那些添加或替换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.Deactivate();

待补充

待补充