217 lines
5.8 KiB
C#
217 lines
5.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace Gameplay.Utils
|
|
{
|
|
/// <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);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|