解析ET6框架Entity的生命周期

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)
		{
		}
	}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧寒大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值