256 lines
7.9 KiB
C#
256 lines
7.9 KiB
C#
using CG.Framework;
|
||
using System.Collections;
|
||
using UnityEngine;
|
||
using UnityEngine.Events;
|
||
/*******************************************************************************
|
||
*Create By CG
|
||
*Function 让不继承MonoBehaviour类可以开启协程,可以用FixedUpdate、Update、LateUpdate方法更新
|
||
*******************************************************************************/
|
||
namespace CG.UTility
|
||
{
|
||
public class MonoManager : ClassSingleton<MonoManager>
|
||
{
|
||
//构造方法私有化,防止外部new对象。
|
||
private MonoManager() { }
|
||
|
||
//执行Mono逻辑的属性。
|
||
private MonoController monoExecuter;
|
||
private MonoController MonoExecuter
|
||
{
|
||
get
|
||
{
|
||
//会确保场景中有一个游戏对象挂载了MonoController脚本。如果没有,则会自动创建该游戏对象,并挂载MonoController脚本。
|
||
if (monoExecuter == null)
|
||
{
|
||
GameObject go = new GameObject(typeof(MonoController).Name);
|
||
monoExecuter = go.AddComponent<MonoController>();
|
||
}
|
||
|
||
return monoExecuter;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加FixedUpdate的事件。
|
||
/// </summary>
|
||
public void AddFixedUpdateListener(UnityAction call)
|
||
{
|
||
MonoExecuter.AddFixedUpdateListener(call);
|
||
}
|
||
/// <summary>
|
||
/// 移除FixedUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveFixedUpdateListener(UnityAction call)
|
||
{
|
||
MonoExecuter.RemoveFixedUpdateListener(call);
|
||
}
|
||
/// <summary>
|
||
/// 移除所有FixedUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveAllFixedUpdateListeners()
|
||
{
|
||
MonoExecuter.RemoveAllFixedUpdateListeners();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加Update的事件。
|
||
/// </summary>
|
||
public void AddUpdateListener(UnityAction call)
|
||
{
|
||
MonoExecuter.AddUpdateListener(call);
|
||
}
|
||
/// <summary>
|
||
/// 移除Update的事件。
|
||
/// </summary>
|
||
public void RemoveUpdateListener(UnityAction call)
|
||
{
|
||
MonoExecuter.RemoveUpdateListener(call);
|
||
}
|
||
/// <summary>
|
||
/// 移除所有Update的事件。
|
||
/// </summary>
|
||
public void RemoveAllUpdateListeners()
|
||
{
|
||
MonoExecuter.RemoveAllUpdateListeners();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加LateUpdate的事件。
|
||
/// </summary>
|
||
public void AddLateUpdateListener(UnityAction call)
|
||
{
|
||
MonoExecuter.AddLateUpdateListener(call);
|
||
}
|
||
/// <summary>
|
||
/// 移除LateUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveLateUpdateListener(UnityAction call)
|
||
{
|
||
MonoExecuter.RemoveLateUpdateListener(call);
|
||
}
|
||
/// <summary>
|
||
/// 移除所有LateUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveAllLateUpdateListeners()
|
||
{
|
||
MonoExecuter.RemoveAllLateUpdateListeners();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 移除所有Update、FixedUpdate、LateUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveAllListeners()
|
||
{
|
||
MonoExecuter.RemoveAllListeners();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 开启协程、停止协程。
|
||
/// </summary>
|
||
public Coroutine StartCoroutine(IEnumerator routine)
|
||
{
|
||
return MonoExecuter.StartCoroutine(routine);
|
||
}
|
||
public void StopCoroutine(IEnumerator routine)
|
||
{
|
||
if (routine != null)
|
||
MonoExecuter.StopCoroutine(routine);
|
||
}
|
||
public void StopCoroutine(Coroutine routine)
|
||
{
|
||
if (routine != null)
|
||
MonoExecuter.StopCoroutine(routine);
|
||
}
|
||
public void StopAllCoroutines()
|
||
{
|
||
MonoExecuter.StopAllCoroutines();
|
||
}
|
||
public void DestroyImmediate(Object obj)
|
||
{
|
||
MonoExecuter.DestroyImmediateWithCheck(obj);
|
||
}
|
||
//用于执行MonoBehaviour逻辑的脚本。会挂载到场景的游戏对象MonoExecuter身上。
|
||
private class MonoController : MonoBehaviour
|
||
{
|
||
event UnityAction updateEvent;//在生命周期方法Update中执行的事件。
|
||
|
||
event UnityAction fixedUpdaetEvent;//在生命周期方法FixedUpdate中执行的事件。
|
||
|
||
event UnityAction lateUpdateEvent;//在生命周期方法LateUpdate中执行的事件。
|
||
|
||
void Awake()
|
||
{
|
||
DontDestroyOnLoad(gameObject);
|
||
}
|
||
|
||
void FixedUpdate()
|
||
{
|
||
fixedUpdaetEvent?.Invoke();
|
||
}
|
||
|
||
void Update()
|
||
{
|
||
updateEvent?.Invoke();
|
||
}
|
||
|
||
void LateUpdate()
|
||
{
|
||
lateUpdateEvent?.Invoke();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加FixedUpdate的事件。
|
||
/// </summary>
|
||
/// <param name="call">要监听的事件</param>
|
||
public void AddFixedUpdateListener(UnityAction call)
|
||
{
|
||
fixedUpdaetEvent += call;
|
||
}
|
||
/// <summary>
|
||
/// 移除FixedUpdate的事件。
|
||
/// </summary>
|
||
/// <param name="call">要监听的事件</param>
|
||
public void RemoveFixedUpdateListener(UnityAction call)
|
||
{
|
||
fixedUpdaetEvent -= call;
|
||
}
|
||
/// <summary>
|
||
/// 移除所有FixedUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveAllFixedUpdateListeners()
|
||
{
|
||
fixedUpdaetEvent = null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加Update的事件。
|
||
/// </summary>
|
||
/// <param name="call">要监听的事件</param>
|
||
public void AddUpdateListener(UnityAction call)
|
||
{
|
||
updateEvent += call;
|
||
}
|
||
/// <summary>
|
||
/// 移除Update的事件。
|
||
/// </summary>
|
||
public void RemoveUpdateListener(UnityAction call)
|
||
{
|
||
updateEvent -= call;
|
||
}
|
||
/// <summary>
|
||
/// 移除所有Update的事件。
|
||
/// </summary>
|
||
public void RemoveAllUpdateListeners()
|
||
{
|
||
updateEvent = null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加LateUpdate的事件。
|
||
/// <param name="call">要监听的事件</param>
|
||
/// </summary>
|
||
public void AddLateUpdateListener(UnityAction call)
|
||
{
|
||
lateUpdateEvent += call;
|
||
}
|
||
/// <summary>
|
||
/// 移除LateUpdate的事件。
|
||
/// <param name="call">要监听的事件</param>
|
||
/// </summary>
|
||
public void RemoveLateUpdateListener(UnityAction call)
|
||
{
|
||
lateUpdateEvent -= call;
|
||
}
|
||
/// <summary>
|
||
/// 移除所有LateUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveAllLateUpdateListeners()
|
||
{
|
||
lateUpdateEvent = null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 移除所有FixedUpdate、Update、LateUpdate的事件。
|
||
/// </summary>
|
||
public void RemoveAllListeners()
|
||
{
|
||
RemoveAllFixedUpdateListeners();
|
||
RemoveAllUpdateListeners();
|
||
RemoveAllUpdateListeners();
|
||
}
|
||
|
||
public void DestroyImmediateWithCheck(Object obj)
|
||
{
|
||
if (Application.isEditor)
|
||
{
|
||
DestroyImmediate(obj);
|
||
}
|
||
else
|
||
{
|
||
Destroy(obj);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|