From 4a1876897c00b8daa96cd7d8261f49c6b1a4dfe2 Mon Sep 17 00:00:00 2001 From: Alex-Rachel <574809918@qq.com> Date: Sat, 8 Mar 2025 13:46:35 +0800 Subject: [PATCH] Utility.Unity --- .../Runtime/Core/Utility/Utility.Unity.cs | 338 ++++++++++++++++++ .../Core/Utility/Utility.Unity.cs.meta | 3 + 2 files changed, 341 insertions(+) create mode 100644 UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs create mode 100644 UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs.meta diff --git a/UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs b/UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs new file mode 100644 index 00000000..2468bace --- /dev/null +++ b/UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections; +using Cysharp.Threading.Tasks; +using UnityEngine; +using UnityEngine.Internal; + +namespace TEngine +{ + public static partial class Utility + { + /// + /// Unity相关的实用函数。 + /// + public static partial class Unity + { + private static IUpdateDriver _updateDriver; + + #region 控制协程Coroutine + + public static GameCoroutine StartCoroutine(string name, IEnumerator routine, MonoBehaviour bindBehaviour) + { + if (bindBehaviour == null) + { + Log.Error("StartCoroutine {0} failed, bindBehaviour is null", name); + return null; + } + + var behaviour = bindBehaviour; + return StartCoroutine(behaviour, name, routine); + } + + public static GameCoroutine StartCoroutine(string name, IEnumerator routine, GameObject bindGo) + { + if (bindGo == null) + { + Log.Error("StartCoroutine {0} failed, BindGo is null", name); + return null; + } + + var behaviour = GetDefaultBehaviour(bindGo); + return StartCoroutine(behaviour, name, routine); + } + + public static GameCoroutine StartGlobalCoroutine(string name, IEnumerator routine) + { + var coroutine = StartCoroutine(routine); + var gameCoroutine = new GameCoroutine(); + gameCoroutine.Coroutine = coroutine; + gameCoroutine.Name = name; + gameCoroutine.BindBehaviour = null; + return gameCoroutine; + } + + public static void StopCoroutine(GameCoroutine coroutine) + { + if (coroutine.Coroutine != null) + { + var behaviour = coroutine.BindBehaviour; + if (behaviour != null) + { + behaviour.StopCoroutine(coroutine.Coroutine); + } + + coroutine.Coroutine = null; + coroutine.BindBehaviour = null; + } + } + + private static GameCoroutine StartCoroutine(MonoBehaviour behaviour, string name, IEnumerator routine) + { + var coroutine = behaviour.StartCoroutine(routine); + var gameCoroutine = new GameCoroutine(); + gameCoroutine.Coroutine = coroutine; + gameCoroutine.Name = name; + gameCoroutine.BindBehaviour = behaviour; + return gameCoroutine; + } + + private static GameCoroutineAgent GetDefaultBehaviour(GameObject bindGameObject) + { + if (bindGameObject != null) + { + if (bindGameObject.TryGetComponent(out GameCoroutineAgent coroutineBehaviour)) + { + return coroutineBehaviour; + } + + return bindGameObject.AddComponent(); + } + + return null; + } + + + public static Coroutine StartCoroutine(string methodName) + { + if (string.IsNullOrEmpty(methodName)) + { + return null; + } + + _MakeEntity(); + return _updateDriver.StartCoroutine(methodName); + } + + public static Coroutine StartCoroutine(IEnumerator routine) + { + if (routine == null) + { + return null; + } + + _MakeEntity(); + return _updateDriver.StartCoroutine(routine); + } + + public static Coroutine StartCoroutine(string methodName, [DefaultValue("null")] object value) + { + if (string.IsNullOrEmpty(methodName)) + { + return null; + } + + _MakeEntity(); + return _updateDriver.StartCoroutine(methodName, value); + } + + public static void StopCoroutine(string methodName) + { + if (string.IsNullOrEmpty(methodName)) + { + return; + } + + _MakeEntity(); + _updateDriver.StopCoroutine(methodName); + } + + public static void StopCoroutine(IEnumerator routine) + { + if (routine == null) + { + return; + } + + _MakeEntity(); + _updateDriver.StopCoroutine(routine); + } + + public static void StopCoroutine(Coroutine routine) + { + if (routine == null) + { + return; + } + + _MakeEntity(); + _updateDriver.StopCoroutine(routine); + routine = null; + } + + public static void StopAllCoroutines() + { + _MakeEntity(); + _updateDriver.StopAllCoroutines(); + } + + #endregion + + #region 注入UnityUpdate/FixedUpdate/LateUpdate + + /// + /// 为给外部提供的 添加帧更新事件。 + /// + /// + public static void AddUpdateListener(Action fun) + { + _MakeEntity(); + AddUpdateListenerImp(fun).Forget(); + } + + private static async UniTaskVoid AddUpdateListenerImp(Action fun) + { + await UniTask.Yield( /*PlayerLoopTiming.LastPreUpdate*/); + _updateDriver.AddUpdateListener(fun); + } + + /// + /// 为给外部提供的 添加物理帧更新事件。 + /// + /// + public static void AddFixedUpdateListener(Action fun) + { + _MakeEntity(); + AddFixedUpdateListenerImp(fun).Forget(); + } + + private static async UniTaskVoid AddFixedUpdateListenerImp(Action fun) + { + await UniTask.Yield(PlayerLoopTiming.LastEarlyUpdate); + _updateDriver.AddFixedUpdateListener(fun); + } + + /// + /// 为给外部提供的 添加Late帧更新事件。 + /// + /// + public static void AddLateUpdateListener(Action fun) + { + _MakeEntity(); + AddLateUpdateListenerImp(fun).Forget(); + } + + private static async UniTaskVoid AddLateUpdateListenerImp(Action fun) + { + await UniTask.Yield( /*PlayerLoopTiming.LastPreLateUpdate*/); + _updateDriver.AddLateUpdateListener(fun); + } + + /// + /// 移除帧更新事件。 + /// + /// + public static void RemoveUpdateListener(Action fun) + { + _MakeEntity(); + _updateDriver.RemoveUpdateListener(fun); + } + + /// + /// 移除物理帧更新事件。 + /// + /// + public static void RemoveFixedUpdateListener(Action fun) + { + _MakeEntity(); + _updateDriver.RemoveFixedUpdateListener(fun); + } + + /// + /// 移除Late帧更新事件。 + /// + /// + public static void RemoveLateUpdateListener(Action fun) + { + _MakeEntity(); + _updateDriver.RemoveLateUpdateListener(fun); + } + + #endregion + + #region Unity Events 注入 + + /// + /// 为给外部提供的Destroy注册事件。 + /// + /// + public static void AddDestroyListener(Action fun) + { + _MakeEntity(); + _updateDriver.AddDestroyListener(fun); + } + + /// + /// 为给外部提供的Destroy反注册事件。 + /// + /// + public static void RemoveDestroyListener(Action fun) + { + _MakeEntity(); + _updateDriver.RemoveDestroyListener(fun); + } + + /// + /// 为给外部提供的OnDrawGizmos注册事件。 + /// + /// + public static void AddOnDrawGizmosListener(Action fun) + { + _MakeEntity(); + _updateDriver.AddOnDrawGizmosListener(fun); + } + + /// + /// 为给外部提供的OnDrawGizmos反注册事件。 + /// + /// + public static void RemoveOnDrawGizmosListener(Action fun) + { + _MakeEntity(); + _updateDriver.RemoveOnDrawGizmosListener(fun); + } + + /// + /// 为给外部提供的OnApplicationPause注册事件。 + /// + /// + public static void AddOnApplicationPauseListener(Action fun) + { + _MakeEntity(); + _updateDriver.AddOnApplicationPauseListener(fun); + } + + /// + /// 为给外部提供的OnApplicationPause反注册事件。 + /// + /// + public static void RemoveOnApplicationPauseListener(Action fun) + { + _MakeEntity(); + _updateDriver.RemoveOnApplicationPauseListener(fun); + } + + #endregion + + private static void _MakeEntity() + { + if (_updateDriver != null) + { + return; + } + + _updateDriver = ModuleSystem.GetModule(); + } + } + + public class GameCoroutine + { + public string Name; + public Coroutine Coroutine; + public MonoBehaviour BindBehaviour; + } + + class GameCoroutineAgent : MonoBehaviour + { + } + } +} \ No newline at end of file diff --git a/UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs.meta b/UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs.meta new file mode 100644 index 00000000..879295be --- /dev/null +++ b/UnityProject/Assets/TEngine/Runtime/Core/Utility/Utility.Unity.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9360ad0d8a8c472c8482e30141f4b531 +timeCreated: 1741411808 \ No newline at end of file