diff --git a/Assets/TEngine/Scripts/Runtime/Audio/AudioMgr.cs b/Assets/TEngine/Scripts/Runtime/Audio/AudioMgr.cs index 9d9d4d91..ff9fada4 100644 --- a/Assets/TEngine/Scripts/Runtime/Audio/AudioMgr.cs +++ b/Assets/TEngine/Scripts/Runtime/Audio/AudioMgr.cs @@ -403,13 +403,13 @@ namespace TEngine.Runtime AudioClipPool.Clear(); } - private void Update() + public override void OnUpdate(float elapseSeconds, float realElapseSeconds) { for (int i = 0; i < _audioAgents.Length; ++i) { if (_audioAgents[i] != null) { - _audioAgents[i].Update(Time.deltaTime); + _audioAgents[i].Update(realElapseSeconds); } } } diff --git a/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/TSingleton.cs b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/TSingleton.cs index f81c2600..92669279 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/TSingleton.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/TSingleton.cs @@ -9,11 +9,24 @@ namespace TEngine.Runtime /// public interface ISingleton { + /// + /// 激活 + /// void Active(); + /// + /// 释放 + /// void Release(); } + public interface IUnitySingleton + { + int GetPriority(); + + void OnUpdate(float elapseSeconds, float realElapseSeconds); + } + /// /// 单例管理器(统一化持久和释放) /// @@ -21,6 +34,7 @@ namespace TEngine.Runtime { private static List _iSingletonList; private static Dictionary _gameObjects; + private static List _unitySingletons; private static GameObject _root; public static GameObject Root { @@ -119,7 +133,7 @@ namespace TEngine.Runtime return go; } - internal static bool CointansKey(string name) + internal static bool ContainsKey(string name) { if (_gameObjects != null) { diff --git a/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UnitySingleton.cs b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UnitySingleton.cs index ed892502..ca4a2d05 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UnitySingleton.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UnitySingleton.cs @@ -6,7 +6,7 @@ namespace TEngine.Runtime /// 具备Unity完整生命周期的单例 /// /// - public class UnitySingleton : MonoBehaviour where T : MonoBehaviour + public class UnitySingleton : MonoBehaviour,IUnitySingleton where T : MonoBehaviour { private static T _instance; @@ -86,6 +86,7 @@ namespace TEngine.Runtime { if (CheckInstance()) { + UpdateInstance.Instance.Retain(this); OnLoad(); } #if UNITY_EDITOR @@ -98,8 +99,42 @@ namespace TEngine.Runtime } } - protected virtual void OnDestroy() + /// + /// 获取游戏框架模块优先级。实现Interface + /// + /// + /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 + public int GetPriority() { + return Priority; + } + + /// + /// 获取游戏框架模块优先级。 + /// + /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 + public virtual int Priority + { + get + { + return 1; + } + } + + + /// + /// OnUpdate通过TEngine统一驱动,舍弃Unity的Update + /// + /// + /// + public virtual void OnUpdate(float elapseSeconds, float realElapseSeconds) + { + + } + + public virtual void OnDestroy() + { + UpdateInstance.Instance.Release(this); Release(); } diff --git a/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UpdateInstance.cs b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UpdateInstance.cs new file mode 100644 index 00000000..56e2688e --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UpdateInstance.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; + +namespace TEngine.Runtime +{ + /// + /// 实现UnitySingleton的OnUpdate + /// + internal class UpdateInstance : BehaviourSingleton + { + public List UnitySingletons; + + public UpdateInstance() + { + UnitySingletons = new List(); + } + + public void Retain(IUnitySingleton unitySingleton) + { + if (UnitySingletons.Contains(unitySingleton)) + { + Log.Fatal($"Repeat Retain UnitySingleton{unitySingleton}"); + } + else + { + UnitySingletons.Add(unitySingleton); + + UnitySingletons.Sort((x, y) => -x.GetPriority().CompareTo(y.GetPriority())); + } + + for (int i = 0; i < UnitySingletons.Count; i++) + { + Log.Fatal(UnitySingletons[i].ToString()); + } + } + + public void Release(IUnitySingleton unitySingleton) + { + if (UnitySingletons.Contains(unitySingleton)) + { + UnitySingletons.Remove(unitySingleton); + } + } + + public void ReleaseAll() + { + var count = UnitySingletons.Count; + for (int i = 0; i < count; i++) + { + Release(UnitySingletons[i]); + } + } + + public override void Update() + { + var count = UnitySingletons.Count; + for (int i = 0; i < count; i++) + { + UnitySingletons[i].OnUpdate(UnityEngine.Time.deltaTime, UnityEngine.Time.unscaledDeltaTime); + } + } + + public override void LateUpdate() + { + base.LateUpdate(); + } + + public override void Destroy() + { + ReleaseAll(); + base.Destroy(); + } + } +} \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UpdateInstance.cs.meta b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UpdateInstance.cs.meta new file mode 100644 index 00000000..07331af9 --- /dev/null +++ b/Assets/TEngine/Scripts/Runtime/Core/Base/Singleton/UpdateInstance.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0018c33e90584ee7a269d84609c606b0 +timeCreated: 1662259264 \ No newline at end of file diff --git a/Assets/TEngine/Scripts/Runtime/Core/Base/TEngineCore.cs b/Assets/TEngine/Scripts/Runtime/Core/Base/TEngineCore.cs index 85ae6894..78ecab76 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Base/TEngineCore.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Base/TEngineCore.cs @@ -143,7 +143,7 @@ namespace TEngine.Runtime } } - protected override void OnDestroy() + public override void OnDestroy() { for (int i = 0; i < m_LogicMgrList.Count; i++) { @@ -151,7 +151,6 @@ namespace TEngine.Runtime logicSys.OnDestroy(); } base.OnDestroy(); - SingletonMgr.Release(); } #endregion } diff --git a/Assets/TEngine/Scripts/Runtime/Core/Fsm/FsmManager.cs b/Assets/TEngine/Scripts/Runtime/Core/Fsm/FsmManager.cs index 034cceb3..1dcc42c2 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/Fsm/FsmManager.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/Fsm/FsmManager.cs @@ -25,7 +25,7 @@ namespace TEngine.Runtime /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 - internal int Priority + public override int Priority { get { @@ -48,7 +48,7 @@ namespace TEngine.Runtime /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 - public void Update() + public override void OnUpdate(float elapseSeconds, float realElapseSeconds) { m_TempFsms.Clear(); if (m_Fsms.Count <= 0) @@ -68,14 +68,14 @@ namespace TEngine.Runtime continue; } - fsm.Update(Time.deltaTime, Time.unscaledDeltaTime); + fsm.Update(elapseSeconds, realElapseSeconds); } } /// /// 关闭并清理有限状态机管理器。 /// - protected override void OnDestroy() + public override void OnDestroy() { foreach (KeyValuePair fsm in m_Fsms) { diff --git a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Core/Network.cs b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Core/Network.cs index 99cde0bd..dc3e54cf 100644 --- a/Assets/TEngine/Scripts/Runtime/Core/NetWork/Core/Network.cs +++ b/Assets/TEngine/Scripts/Runtime/Core/NetWork/Core/Network.cs @@ -19,6 +19,13 @@ namespace TEngine.Runtime get; } + /// + /// 获取游戏框架模块优先级。 + /// + /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 + public override int Priority => 10; + + /// /// 获取网络频道数量。 /// @@ -52,15 +59,15 @@ namespace TEngine.Runtime m_NetworkManager.NetworkCustomError += OnNetworkCustomError; } - private void Update() + public override void OnUpdate(float elapseSeconds, float realElapseSeconds) { if (m_NetworkManager != null) { - NetworkManager.Update(Time.deltaTime, Time.unscaledDeltaTime);; + NetworkManager.Update(elapseSeconds, realElapseSeconds);; } } - protected override void OnDestroy() + public override void OnDestroy() { base.OnDestroy(); if (NetworkManager != null)