using System.Collections.Generic;
namespace TEngine
{
///
/// 通过LogicSys来驱动且具备Unity完整生命周期的单例(不继承MonoBehaviour)
///
///
public class BehaviourSingleton : BaseBehaviourSingleton where T : BaseBehaviourSingleton, new()
{
private static T sInstance;
public static T Instance
{
get
{
if (null == sInstance)
{
sInstance = new T();
TLogger.LogAssert(sInstance != null);
sInstance.Awake();
RegSingleton(sInstance);
}
return sInstance;
}
}
private static void RegSingleton(BaseBehaviourSingleton inst)
{
BehaviourSingleSystem.Instance.RegSingleton(inst);
}
}
public class BaseBehaviourSingleton
{
public bool IsStart = false;
public virtual void Active()
{
}
public virtual void Awake()
{
}
public virtual bool IsHaveLateUpdate()
{
return false;
}
public virtual void Start()
{
}
public virtual void Update()
{
}
public virtual void LateUpdate()
{
}
public virtual void Destroy()
{
}
public virtual void OnPause()
{
}
public virtual void OnResume()
{
}
}
public class BehaviourSingleSystem : BaseLogicSys
{
List m_listInst = new List();
List m_listStart = new List();
List m_listUpdate = new List();
List m_listLateUpdate = new List();
public void RegSingleton(BaseBehaviourSingleton inst)
{
TLogger.LogAssert(!m_listInst.Contains(inst));
m_listInst.Add(inst);
m_listStart.Add(inst);
}
public void UnRegSingleton(BaseBehaviourSingleton inst)
{
if (inst == null)
{
TLogger.LogError($"BaseBehaviourSingleton Is Null");
return;
}
TLogger.LogAssert(m_listInst.Contains(inst));
if (m_listInst.Contains(inst))
{
m_listInst.Remove(inst);
}
if (m_listStart.Contains(inst))
{
m_listStart.Remove(inst);
}
if (m_listUpdate.Contains(inst))
{
m_listUpdate.Remove(inst);
}
if (m_listLateUpdate.Contains(inst))
{
m_listLateUpdate.Remove(inst);
}
inst.Destroy();
inst = null;
}
public override void OnUpdate()
{
var listStart = m_listStart;
var listToUpdate = m_listUpdate;
var listToLateUpdate = m_listLateUpdate;
if (listStart.Count > 0)
{
for (int i = 0; i < listStart.Count; i++)
{
var inst = listStart[i];
TLogger.LogAssert(!inst.IsStart);
inst.IsStart = true;
inst.Start();
listToUpdate.Add(inst);
if (inst.IsHaveLateUpdate())
{
listToLateUpdate.Add(inst);
}
}
listStart.Clear();
}
var listUpdateCnt = listToUpdate.Count;
for (int i = 0; i < listUpdateCnt; i++)
{
var inst = listToUpdate[i];
TProfiler.BeginFirstSample(inst.GetType().FullName);
inst.Update();
TProfiler.EndFirstSample();
}
}
public override void OnLateUpdate()
{
var listLateUpdate = m_listLateUpdate;
var listLateUpdateCnt = listLateUpdate.Count;
for (int i = 0; i < listLateUpdateCnt; i++)
{
var inst = listLateUpdate[i];
TProfiler.BeginFirstSample(inst.GetType().FullName);
inst.LateUpdate();
TProfiler.EndFirstSample();
}
}
public override void OnDestroy()
{
for (int i = 0; i < m_listInst.Count; i++)
{
var inst = m_listInst[i];
inst.Destroy();
}
}
public override void OnPause()
{
for (int i = 0; i < m_listInst.Count; i++)
{
var inst = m_listInst[i];
inst.OnPause();
}
}
public override void OnResume()
{
for (int i = 0; i < m_listInst.Count; i++)
{
var inst = m_listInst[i];
inst.OnResume();
}
}
}
}