NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Utils/MonoHelper.cs

217 lines
5.8 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Gameplay
{
/// <summary>
/// 更新类型
/// </summary>
public enum EActionType
{
UPDATE,
LATE_UPDATE,
FIXED_UPDATE,
/// <summary>
/// 离开application
/// </summary>
ON_PAUSE_FALSE,
/// <summary>
/// 回到application
/// </summary>
ON_PAUSE_TRUE,
Destory,
SCREEN_SIZE_CHANGE,
}
/// <summary>
/// 反射工程内用的update辅助类
/// author:liutao
/// </summary>
[DefaultExecutionOrder(-99)]
public class MonoHelper : MonoBehaviour
{
public const string TAG = "[monohelper]";
public static MonoHelper instance
{
get
{
if (_instance == null)
{
#if UNITY_EDITOR
if (!UnityEditor.EditorApplication.isPlaying)
{
return null;
}
#endif
DebugUtil.Log("{0} 自动创建MonoHelper", TAG);
var newObj = new GameObject("MonoHelper");
_instance = newObj.AddComponent<MonoHelper>();
}
return _instance;
}
}
private static MonoHelper _instance;
public int m_UpdateCount;
public int m_LateUpdateCount;
public int m_FixedUpdateCount;
private List<Action> _onUpdate;
private List<Action> _onLateUpdate;
private List<Action> _onFixedUpdate;
private List<Action> _onDestory;
private List<Action> _onPauseFalse;
private List<Action> _onPauseTrue;
private List<Action> _onScreenSizeChanged;
public float deltaTime;
private int _xSize;
private int _ySize;
private void Awake()
{
this.deltaTime = Time.deltaTime;
_xSize = Screen.width;
_ySize = Screen.height;
_onUpdate = new List<Action>();
_onLateUpdate = new List<Action>();
_onFixedUpdate = new List<Action>();
_onDestory = new List<Action>();
_onPauseFalse = new List<Action>();
_onPauseTrue = new List<Action>();
_onScreenSizeChanged = new List<Action>();
DontDestroyOnLoad(this.gameObject);
this.AddAction(EActionType.UPDATE, _ListenScreenSize);
}
private void _ListenScreenSize()
{
if (_xSize == Screen.width && _ySize == Screen.height)
{
return;
}
_xSize = Screen.width;
_ySize = Screen.height;
_DoFuncs(_onScreenSizeChanged);
}
public void AddAction(EActionType type, Action action)
{
switch (type)
{
case EActionType.UPDATE:
_onUpdate.Add(action);
m_UpdateCount = _onUpdate.Count;
break;
case EActionType.LATE_UPDATE:
_onLateUpdate.Add(action);
m_LateUpdateCount = _onLateUpdate.Count;
break;
case EActionType.FIXED_UPDATE:
_onFixedUpdate.Add(action);
m_FixedUpdateCount = _onFixedUpdate.Count;
break;
case EActionType.Destory:
_onDestory.Add(action);
break;
case EActionType.ON_PAUSE_FALSE:
_onPauseFalse.Add(action);
break;
case EActionType.ON_PAUSE_TRUE:
_onPauseTrue.Add(action);
break;
case EActionType.SCREEN_SIZE_CHANGE:
_onScreenSizeChanged.Add(action);
break;
default:
DebugUtil.LogError( "{0} 暂未处理的消息类型: {1}", TAG, type);
break;
}
}
public void RemoveAction(EActionType type, Action action)
{
switch (type)
{
case EActionType.UPDATE:
_onUpdate.Remove(action);
m_UpdateCount = _onUpdate.Count;
break;
case EActionType.LATE_UPDATE:
_onLateUpdate.Remove(action);
m_LateUpdateCount = _onLateUpdate.Count;
break;
case EActionType.FIXED_UPDATE:
_onFixedUpdate.Remove(action);
m_FixedUpdateCount = _onFixedUpdate.Count;
break;
}
}
public Coroutine DoCoroutine(IEnumerator func)
{
return StartCoroutine(func);
}
public void CoroutineEnd(Coroutine cort)
{
if (cort != null)
StopCoroutine(cort);
}
private static void _DoFuncs(List<Action> actions)
{
for (int i = 0; i < actions.Count; ++i)
{
actions[i].Invoke();
}
}
void Update()
{
this.deltaTime = Time.deltaTime;
m_UpdateCount = _onUpdate.Count;
_DoFuncs(_onUpdate);
}
void LateUpdate()
{
_DoFuncs(_onLateUpdate);
}
void FixedUpdate()
{
_DoFuncs(_onFixedUpdate);
}
private void OnDestroy()
{
_DoFuncs(_onDestory);
}
private void OnApplicationPause(bool pause)
{
if (pause)
{
_DoFuncs(_onPauseTrue);
}
else
{
_DoFuncs(_onPauseFalse);
}
}
}
}