Update BehaviourSingleton.cs

This commit is contained in:
ALEXTANG
2023-05-13 20:35:34 +08:00
parent fd7d8a798b
commit 036c89a6d1

View File

@@ -1,9 +1,29 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
namespace TEngine namespace TEngine
{ {
/// <summary> /// <summary>
/// 通过LogicSys来驱动且具备Unity完整生命周期的单例不继承MonoBehaviour /// 帧更新标签。
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class UpdateAttribute : Attribute { }
/// <summary>
/// 后帧更新标签。
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class LateUpdateAttribute : Attribute{ }
/// <summary>
/// 物理帧更新标签。
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class FixedUpdateAttribute : Attribute{ }
/// <summary>
/// 通过LogicSys来驱动且具备Unity完整生命周期的单例不继承MonoBehaviour
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
public abstract class BehaviourSingleton<T> : BaseBehaviourSingleton where T : BaseBehaviourSingleton, new() public abstract class BehaviourSingleton<T> : BaseBehaviourSingleton where T : BaseBehaviourSingleton, new()
@@ -53,13 +73,29 @@ namespace TEngine
{ {
} }
/// <summary>
/// 帧更新。
/// <remarks>需要UpdateAttribute。</remarks>
/// </summary>
public virtual void Update() public virtual void Update()
{ {
} }
/// <summary>
/// 后帧更新。
/// <remarks>需要LateUpdateAttribute。</remarks>
/// </summary>
public virtual void LateUpdate() public virtual void LateUpdate()
{ {
} }
/// <summary>
/// 物理帧更新。
/// <remarks>需要FixedUpdateAttribute。</remarks>
/// </summary>
public virtual void FixedUpdate()
{
}
public virtual void Destroy() public virtual void Destroy()
{ {
@@ -84,12 +120,25 @@ namespace TEngine
private readonly List<BaseBehaviourSingleton> _listStart = new List<BaseBehaviourSingleton>(); private readonly List<BaseBehaviourSingleton> _listStart = new List<BaseBehaviourSingleton>();
private readonly List<BaseBehaviourSingleton> _listUpdate = new List<BaseBehaviourSingleton>(); private readonly List<BaseBehaviourSingleton> _listUpdate = new List<BaseBehaviourSingleton>();
private readonly List<BaseBehaviourSingleton> _listLateUpdate = new List<BaseBehaviourSingleton>(); private readonly List<BaseBehaviourSingleton> _listLateUpdate = new List<BaseBehaviourSingleton>();
private readonly List<BaseBehaviourSingleton> _listFixedUpdate = new List<BaseBehaviourSingleton>();
public void RegSingleton(BaseBehaviourSingleton inst) public void RegSingleton(BaseBehaviourSingleton inst)
{ {
Log.Assert(!_listInst.Contains(inst)); Log.Assert(!_listInst.Contains(inst));
_listInst.Add(inst); _listInst.Add(inst);
_listStart.Add(inst); _listStart.Add(inst);
if (HadAttribute<UpdateAttribute>(inst.GetType()))
{
_listUpdate.Add(inst);
}
if (HadAttribute<LateUpdateAttribute>(inst.GetType()))
{
_listLateUpdate.Add(inst);
}
if (HadAttribute<FixedUpdateAttribute>(inst.GetType()))
{
_listFixedUpdate.Add(inst);
}
} }
public void UnRegSingleton(BaseBehaviourSingleton inst) public void UnRegSingleton(BaseBehaviourSingleton inst)
@@ -174,6 +223,20 @@ namespace TEngine
TProfiler.EndFirstSample(); TProfiler.EndFirstSample();
} }
} }
public override void OnFixedUpdate()
{
var listFixedUpdate = _listFixedUpdate;
var listFixedUpdateCnt = listFixedUpdate.Count;
for (int i = 0; i < listFixedUpdateCnt; i++)
{
var inst = listFixedUpdate[i];
TProfiler.BeginFirstSample(inst.GetType().FullName);
inst.FixedUpdate();
TProfiler.EndFirstSample();
}
}
public override void OnDestroy() public override void OnDestroy()
{ {
@@ -208,5 +271,12 @@ namespace TEngine
inst.OnDrawGizmos(); inst.OnDrawGizmos();
} }
} }
private bool HadAttribute<T>(Type type) where T:Attribute
{
T attribute = Attribute.GetCustomAttribute(type, typeof(T)) as T;
return attribute != null;
}
} }
} }