90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| 
 | |
| namespace Guru
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections.Generic;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     public class ContextObject: MonoBehaviour
 | |
|     {
 | |
|         private const string InstanceName = "app_context";
 | |
|         
 | |
|         private HashSet<IUpdater> _updaters;
 | |
|         private HashSet<IUpdater> _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<ContextObject>();
 | |
|         }
 | |
| 
 | |
|         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<IUpdater>();
 | |
|             _updatersWillRemove = new HashSet<IUpdater>();
 | |
|         }
 | |
| 
 | |
|         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
 | |
| 
 | |
|     }
 | |
| } |