using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Gameplay { /// /// 更新类型 /// public enum EActionType { UPDATE, LATE_UPDATE, FIXED_UPDATE, /// /// 离开application /// ON_PAUSE_FALSE, /// /// 回到application /// ON_PAUSE_TRUE, Destory, SCREEN_SIZE_CHANGE, } /// /// 反射工程内用的update辅助类 /// author:liutao /// [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(); } return _instance; } } private static MonoHelper _instance; public int m_UpdateCount; public int m_LateUpdateCount; public int m_FixedUpdateCount; private List _onUpdate; private List _onLateUpdate; private List _onFixedUpdate; private List _onDestory; private List _onPauseFalse; private List _onPauseTrue; private List _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(); _onLateUpdate = new List(); _onFixedUpdate = new List(); _onDestory = new List(); _onPauseFalse = new List(); _onPauseTrue = new List(); _onScreenSizeChanged = new List(); 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 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); } } } }