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