mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
Utility.Unity
This commit is contained in:
@@ -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
|
||||
{
|
||||
/// <summary>
|
||||
/// Unity相关的实用函数。
|
||||
/// </summary>
|
||||
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<GameCoroutineAgent>();
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的 添加帧更新事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的 添加物理帧更新事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的 添加Late帧更新事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除帧更新事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void RemoveUpdateListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.RemoveUpdateListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除物理帧更新事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void RemoveFixedUpdateListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.RemoveFixedUpdateListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除Late帧更新事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void RemoveLateUpdateListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.RemoveLateUpdateListener(fun);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unity Events 注入
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的Destroy注册事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void AddDestroyListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.AddDestroyListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的Destroy反注册事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void RemoveDestroyListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.RemoveDestroyListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的OnDrawGizmos注册事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void AddOnDrawGizmosListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.AddOnDrawGizmosListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的OnDrawGizmos反注册事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void RemoveOnDrawGizmosListener(Action fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.RemoveOnDrawGizmosListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的OnApplicationPause注册事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void AddOnApplicationPauseListener(Action<bool> fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.AddOnApplicationPauseListener(fun);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 为给外部提供的OnApplicationPause反注册事件。
|
||||
/// </summary>
|
||||
/// <param name="fun"></param>
|
||||
public static void RemoveOnApplicationPauseListener(Action<bool> fun)
|
||||
{
|
||||
_MakeEntity();
|
||||
_updateDriver.RemoveOnApplicationPauseListener(fun);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private static void _MakeEntity()
|
||||
{
|
||||
if (_updateDriver != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_updateDriver = ModuleSystem.GetModule<IUpdateDriver>();
|
||||
}
|
||||
}
|
||||
|
||||
public class GameCoroutine
|
||||
{
|
||||
public string Name;
|
||||
public Coroutine Coroutine;
|
||||
public MonoBehaviour BindBehaviour;
|
||||
}
|
||||
|
||||
class GameCoroutineAgent : MonoBehaviour
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9360ad0d8a8c472c8482e30141f4b531
|
||||
timeCreated: 1741411808
|
Reference in New Issue
Block a user