我所理解的Entitas——Component(三)
这章我们将介绍ECS的三大基本概念中的Component。
Component 组件
组件是ECS框架中基础的数据结构单元。每个Compoent只有数据,不包含任何处理数据的方法。在内存中相同类型的组件是紧密排列的,这样在System中遍历拥有相同组件的实体时大大的提高内存命中率。这也是ECS框架用来做很多大型项目或者多物体的项目的原因之一。
Entitas中所有组件全部继承自IComponent接口。同时Entitas提供了各种特殊标签属性,在生成代码的时候为我们提供特殊功能。例如 [Context] 指定将该组件添加一个或者多个Context中。关于属性标签可以查看这里(Attributes)。
我们定义的组件在生成的代码的时候会自动生成所属的Context文件夹下的Components文件夹中。
一个Context可以包含多个组件,自动生成时实际上个是通过partial(不完全类)的方式为当前Context下的Entity提供相关接口。如果一个组件被添加到多个Context中,则每个Context下都会有该组件。
前面说过组件内部只有数据,但是我们创建组件的时候也可以不包含数据。如果包含任意类型的数据,生成代码时会自动帮我们定义 has,Add,Replace,Remove四个接口,如果没有任何数据则只会给我们提供一个bool的属性。
例 :
- 我们定义如下两个接口:
//组件一 不包含数据
public class TestFlagComponent : IComponent
{
}
// 组件二 包含数据
public class TestValueComponent : IComponent
{
public int value;
}
- 组件一自动生成代码
public partial class InputEntity {
static readonly TestFlagComponent testFlagComponent = new TestFlagComponent();
public bool isTestFlag {
get { return HasComponent(InputComponentsLookup.TestFlag); }
set {
if (value != isTestFlag) {
var index = InputComponentsLookup.TestFlag;
if (value) {
var componentPool = GetComponentPool(index);
var component = componentPool.Count > 0
? componentPool.Pop()
: testFlagComponent;
AddComponent(index, component);
} else {
RemoveComponent(index);
}
}
}
}
}
- 组件二自动生成代码
public partial class InputEntity {
public TestValueComponent testValue { get { return (TestValueComponent)GetComponent(InputComponentsLookup.TestValue); } }
public bool hasTestValue { get { return HasComponent(InputComponentsLookup.TestValue); } }
public void AddTestValue(int newValue) {
var index = InputComponentsLookup.TestValue;
var component = (TestValueComponent)CreateComponent(index, typeof(TestValueComponent));
component.value = newValue;
AddComponent(index, component);
}
public void ReplaceTestValue(int newValue) {
var index = InputComponentsLookup.TestValue;
var component = (TestValueComponent)CreateComponent(index, typeof(TestValueComponent));
component.value = newValue;
ReplaceComponent(index, component);
}
public void RemoveTestValue() {
RemoveComponent(InputComponentsLookup.TestValue);
}
}
添加组件
一个Entity在被调用CreateEntity()方法创建出来时没有任何组件信息,我们需要在合适的时机增加,删除或者修改组件来改变Entity的行为。
- 对于没有数据的组件我们调用bool型的属性来添加或者移除该组件
- true 添加组件
- false 移除移除
- 对于有数据的组组件
- Add 添加组件
- Replace 替换组件
- Remove 移除移除
总结:
上一章说了Contexts,Context和Entity的关系。
Component可以理解为技能,例如 开坦克(Component_1),开潜艇(Component_2), 开飞机(Component_3),。那么一个士兵(Entity)要有开飞机(Component_3)的技能那么首先他得是空军(context_3)。当前不排除一个陆军(context_1)的士兵即会开坦克(Component_1)也会开飞机(Component_3)(Component同时被添加到两个Context中)
上一篇: js实现数据双向绑定(访问器监听)
下一篇: 女人对衣服的热爱
推荐阅读
-
我所理解的摄影美学:表达出内心最重要
-
我理解的CRM 项目管理配置管理三星Spring活动
-
我理解的CRM 项目管理配置管理三星Spring活动
-
我所理解的Python里method和function的区别(关键词:method/方法/function/函数)
-
我所理解的摄影美学:表达出内心最重要
-
我所理解的MySQL五:锁及加锁规则
-
我所理解的MySQL之三:执行计划
-
一些常用css技巧的为什么(二)我所理解的line-height_html/css_WEB-ITnose
-
一些常用css技巧的为什么(二)我所理解的line-height_html/css_WEB-ITnose
-
我所理解的Entitas——Component(三)