1.介绍
1.LoadSystem:热重载时调用
2.AwakeSystem:entity在Addcomponent/AddChild时调用
3.DeserializeSystem:entity反序列话后调用
4.UpdateSystem:同unity的Update一样每帧调用
5.LateUpdateSystem:同unity的LateUpdate一样每帧调用(比Update晚)
6.DestroySystem:entity触发Dispose时调用
2.实现原理(以Awake/UpdateSystem为例)
1.Entry.cs
将热更层的Update/LateUpdate/Close绑定到mono的Update/LateUpdate/OnApplicationQuit
CodeLoader.Instance.Update += Game.Update;
CodeLoader.Instance.LateUpdate += Game.LateUpdate;
CodeLoader.Instance.OnApplicationQuit += Game.Close;
2.EventSystem.cs
注册缓存ObjectSystem并处理方法
//entity注册/销毁时调用
public void RegisterSystem(Entity component, bool isRegister = true)
{
//isRegister为false的时候从allEntities移除
if (!isRegister)
{
this.Remove(component.InstanceId);
return;
}
//isRegister为true的时候添加到allEntities
this.allEntities.Add(component.InstanceId, component);
Type type = component.GetType();
//从typeSystems取出entity的所有ObjectSystemAttribute
OneTypeSystems oneTypeSystems = this.typeSystems.GetOneTypeSystems(type);
if (oneTypeSystems == null)
{
return;
}
//分类进入各自的队列
if (oneTypeSystems.ContainsKey(typeof (ILoadSystem)))
{
this.loaders.Enqueue(component.InstanceId);
}
if (oneTypeSystems.ContainsKey(typeof (IUpdateSystem)))
{
this.updates.Enqueue(component.InstanceId);
}
if (oneTypeSystems.ContainsKey(typeof (ILateUpdateSystem)))
{
this.lateUpdates.Enqueue(component.InstanceId);
}
}
//以带一个参数的Awake为例
public void Awake<P1>(Entity component, P1 p1)
{
//从typeSystems中获取component中继承IAwakeSystem<P1>的所有类
List<object> iAwakeSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IAwakeSystem<P1>));
if (iAwakeSystems == null)
{
return;
}
foreach (IAwakeSystem<P1> aAwakeSystem in iAwakeSystems)
{
if (aAwakeSystem == null)
{
continue;
}
try
{
//调用run方法
aAwakeSystem.Run(component, p1);
}
catch (Exception e)
{
Log.Error(e);
}
}
}
public void Update()
{
while (this.updates.Count > 0)
{
//从updates队列取出一个Entity
long instanceId = this.updates.Dequeue();
Entity component;
if (!this.allEntities.TryGetValue(instanceId, out component))
{
continue;
}
if (component.IsDisposed)
{
continue;
}
//获取Entity继承IUpdateSystem的类
List<object> iUpdateSystems = this.typeSystems.GetSystems(component.GetType(), typeof (IUpdateSystem));
if (iUpdateSystems == null)
{
continue;
}
//将Entity压入updates2
this.updates2.Enqueue(instanceId);
foreach (IUpdateSystem iUpdateSystem in iUpdateSystems)
{
try
{
//执行run方法
iUpdateSystem.Run(component);
}
catch (Exception e)
{
Log.Error(e);
}
}
}
//将updates和updates2交换,方便下次是用
ObjectHelper.Swap(ref this.updates, ref this.updates2);
}
3.使用
1.打上ObjectSystem的标签
2.继承system
3.重新实现system的abstract方法
[ObjectSystem]
public class UnitComponentAwakeSystem : AwakeSystem<UnitComponent>
{
public override void Awake(UnitComponent self)
{
}
}