现在让我们看看Component是怎么挂载到Entity上的
Baker
Component的挂载是在烘焙的时候完成的。
首先默认组件,比如Mesh这些,Unity已经写好了对应的烘焙方法,这些不用我们去考虑。我们要考虑的是我们自己写的那些,比如
public class MoveComponentAuthoring : MonoBehaviour
{
public float speed;
}
我们想把这个里面的数据生成一个Component挂载到他的Entity上,那么我们需要新建一个类并且让它继承Baker类,并且重载Bake方法。这个方法会在全量烘焙和修改后的增量烘焙的时候调用。
public class MoveComponentBaker : Baker<MoveComponentAuthoring>
{
public override void Bake(MoveComponentAuthoring authoring)
{
var enitity = this.GetEntity(TransformUsageFlags.Dynamic);
var data = new MoveComponent
{
Speed = authoring.speed,
};
AddComponent(enitity,data);
}
}
首先Bake里面传进来的参数,就是上面的 MoveComponentAuthoring对象,
然后
var enitity = this.GetEntity(TransformUsageFlags.Dynamic);
这个获取到对应的Entity.
最后创建一个 MoveComponent对象,并且加到刚获取到的entity上。
var data = new MoveComponent
{
Speed = authoring.speed,
};
AddComponent(enitity,data);
这样我们就把一个MoveComponent的Component,挂载到了对应的entity上了。
Backer的运行逻辑
上面我们提到了两个名词,全量烘焙和增量烘焙。
那什么时候触发全量烘焙什么时候触发增量呢,烘焙的流程又是个啥呢?
烘焙是将 Unity 编辑器中的gameGameObject转换Entity的过程。
全量烘焙是把这个场景中的所有gameGameObject转换Entity
而增量则是只烘焙修改过的
触发条件
全量:
- Entity的场景已经丢失
- subScene单独打开修改,再回到主场景的时候
- Component属性修改
- Backer逻辑修改
- 重新导入 (在subScene 上的Reimport)
- 清除缓存 (Preferences->Entites->Clear Entity Cache)
增量:
当sunScene加载创作场景时,它还会初始化增量烘焙。在场景上执行增量烘焙传递意味着您可以在编辑创作场景时直接看到烘焙结果。
在增量烘焙期间,烘焙在内存中进行,而不是对磁盘执行运行。更改GameObject时,Unity 仅重新烘焙受影响的实体和组件。仅烘焙一小部分数据的速度要快得多,这意味着 ECS 数据可以实时更新。
先到这吧,下次我们接着说烘培的弯弯绕绕。