com.guru.unity.applit/Runtime/Framework/Core/ContextObject.cs

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
}
}