internal void RemoveBehavior(BaseBehaviour behaviour)
 {
     if (behaviour.IsAlive())
     {
         behaviour.SetEnable(false);
         behaviour.SetAlive(false);
         m_BehaviourOrdered.DeleteByIndex(m_BehaviourOrdered.GetIndexByKey(behaviour));
         m_RemoveBehavioursCache.Add(behaviour);
     }
     else
     {
         MDebug.LogError("Core"
                         , $"RemoveBehavior ({behaviour.GetName()}) failed. It doesn't alive.");
     }
 }
        protected void OnApplicationQuit()
        {
            WaitTaskUpdate();
            CollectionBehavioursForTraverse();

            for (int iBehaviour = 0; iBehaviour < m_BehavioursForTraverse.Count; iBehaviour++)
            {
                BaseBehaviour behaviour = m_BehavioursForTraverse[iBehaviour];
                behaviour.SetEnable(false);
                DisableBehaviour(behaviour);
            }

            for (int iBehaviour = 0; iBehaviour < m_BehavioursForTraverse.Count; iBehaviour++)
            {
                BaseBehaviour behaviour = m_BehavioursForTraverse[iBehaviour];
                behaviour.SetAlive(false);
                ReleaseBehaviour(behaviour);
            }

            m_BehavioursForTraverse.Clear();
            m_AddBehavioursCache.Clear();
            m_RemoveBehavioursCache.Clear();
            m_BehaviourOrdered.Clear();
        }
        private void BeginFrame()
        {
            if (Time.frameCount <= m_LastBeginFrame)
            {
                return;
            }
            m_LastBeginFrame = Time.frameCount;

            MDebug.LogVerbose("Core", "BeginFrame " + m_LastBeginFrame);
            WaitTaskUpdate();

            CollectionBehavioursForTraverse();

            #region Handle Initialize
            for (int iBehaviour = 0; iBehaviour < m_AddBehavioursCache.Count; iBehaviour++)
            {
                BaseBehaviour behaviour = m_AddBehavioursCache[iBehaviour];

                try
                {
                    MDebug.LogVerbose("Core"
                                      , $"Before execute {behaviour.GetName()}.OnInitialize");

                    behaviour.OnInitialize();

                    MDebug.LogVerbose("Core"
                                      , $"After execute {behaviour.GetName()}.OnInitialize");
                }
                catch (Exception e)
                {
                    MDebug.LogError("Core"
                                    , $"Execute {behaviour.GetName()}.OnInitialize Exception:{e.ToString()}");
                }
                behaviour.SetAlive(true);
            }
            m_AddBehavioursCache.Clear();
            #endregion

            #region Handle Enable
            for (int iBehaviour = 0; iBehaviour < m_BehavioursForTraverse.Count; iBehaviour++)
            {
                BaseBehaviour behaviour = m_BehavioursForTraverse[iBehaviour];
                if (behaviour.IsEnable() && !behaviour.IsLastEnable())
                {
                    try
                    {
                        MDebug.LogVerbose("Core"
                                          , $"Before execute {behaviour.GetName()}.OnEnable");

                        behaviour.OnEnable();

                        MDebug.LogVerbose("Core"
                                          , $"After execute {behaviour.GetName()}.OnEnable");
                    }
                    catch (Exception e)
                    {
                        MDebug.LogError("Core"
                                        , $"Execute {behaviour.GetName()}.OnEnable Exception:{e.ToString()}");
                    }
                    finally
                    {
                        behaviour.SetLastEnable(true);
                    }
                }
            }
            #endregion
        }