Introduction to Entitas - OneYoungMean/Entitas-CSharp-OYM GitHub Wiki
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 |
+------------+
一个实体是一个容器,在你的应用中,它负责保存代表某些对象的数据。你可以以实际形式添加,替换或删除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();
待补充
待补充