一、启动流程
1、在游戏启动或者Unity运行的时候,所有的System都会自动实例化且添加到default world中去;
2、当然如果不想System自动执行,可以加入宏UNITY_DISABLE_AUTOMATIC_SYSTEM_BOOTSTRAP,那么System就不会自动执行了.
二、执行流程
1、首先OnCreate()
2、然后OnUpdate()
[BurstCompile]
public partial struct MoveSystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state) { }
[BurstCompile]
public void OnUpdate(ref SystemState state) { }
}
3、但是还存在满足某种情况的前提下才能够执行OnUpdate()
[BurstCompile]
public partial struct MoveSystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state)
{
state.RequireForUpdate<Move>();
}
[BurstCompile]
public void OnUpdate(ref SystemState state) { }
}
这里执行OnUpdate()会受到OnCreate中RequireForUpdate的约束;
state.RequireForUpdate():
- 表示在游戏运行的时候,至少有一个Entity持有Move组件,才会执行Update;
- 如果使用了RequireForUpdate(),那么就需要存在T这个组件,只有这个组件存在了,当前的System才会运行;
这样就可以灵活的控制什么时候System进行运行;满足条件的情况下才可以执行;
三、基本操作
用到了ISystem,那么这里就需要把BurstCompile也用上;
这里生效的前提是需要把Struct,OnCreate/OnDestroy/OnUpdate都需要添加上BurstCompile;
[BurstCompile]能够编译为本机最优代码,这个性能的提升还是很客观的;
如果OnUpdate里面有访问Managed Objects;那么是无法进行Burst-Compiled的;其它方法也同理;所以这个时候就没有必要加BurstCompile 属性了。