namespace Guru { using System; using System.Collections.Generic; using UnityEngine; public class ContextObject: MonoBehaviour { private const string InstanceName = "app_context"; private HashSet _updaters; private HashSet _updatersWillRemove; public Action OnDestroyed; public Action OnStart; public static ContextObject Create(string name = "" ) { if (string.IsNullOrEmpty(name)) name = InstanceName; var go = new GameObject(name); DontDestroyOnLoad(go); return go.AddComponent(); } public void AddUpdater(IUpdater updater) { _updaters.Add(updater); } public void RemoveUpdater(IUpdater updater) { updater.IsStopped = true; _updatersWillRemove.Add(updater); } #region 生命周期 private void Awake() { _updaters = new HashSet(); _updatersWillRemove = new HashSet(); } void Start() { OnStart?.Invoke(); } private void OnDestroy() { OnDestroyed?.Invoke(); } public void SelfDestroy() { Destroy(gameObject); } private void Update() { if(_updaters.Count > 0) { foreach (var updater in _updaters) { if(updater != null && !updater.IsStopped && !_updatersWillRemove.Contains(updater)) { updater.OnUpdate(); } } if (_updatersWillRemove.Count > 0) { foreach (var d in _updatersWillRemove) { _updaters.Remove(d); } _updatersWillRemove.Clear(); } } } #endregion } }