Files
TEngine/Assets/TEngine/Runtime/ECS/ECSObject.cs
ALEXTANG 90ae4874a9 TEngine Commit 1.0.0
TEngine Commit 1.0.0
2022-05-20 23:19:50 +08:00

113 lines
3.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
namespace TEngine
{
/// <summary>
/// ECS架构基类Object
/// </summary>
public class ECSObject
{
internal int HashCode;
internal ECSSystem System;
public ECSObject()
{
HashCode = GetType().GetHashCode();
}
public virtual void Awake() { }
public virtual void OnDestroy() { }
/// <summary>
/// Remove The ECSEntity or Component And Throw the ECSObject to ArrayPool When AddComponent Or Create Can Use Again
/// </summary>
/// <param name="ecsObject"></param>
/// <param name="reuse">此对象是否可以复用复用会将对象丢入System对象池中 等待再次使用如果是Entity对象并且不复用的话则把Entity所使用的组件也不复用</param>
public static void Destroy(ECSObject ecsObject, bool reuse = true)
{
if (ecsObject is ECSComponent ecsComponent)
{
ecsComponent.Entity.Components.Remove(ecsComponent);
if (ecsComponent is IUpdate update)
{
ecsComponent.Entity.Updates.Remove(update);
}
if (reuse)
{
ecsComponent.Entity.System.Push(ecsComponent);
}
ecsObject.OnDestroy();
return;
}
else if (ecsObject is Entity entity)
{
entity.System.RemoveEntity(entity);
entity.OnDestroy();
while (entity.Components.Count > 0)
{
ECSComponent ecsComponentTemp = entity.Components[0];
entity.Components.RemoveAt(0);
ecsComponentTemp.OnDestroy();
if (reuse)
{
entity.System.Push(ecsComponentTemp);
}
}
entity.Updates.Clear();
entity.CanUpdate = false;
if (reuse)
{
entity.System.Push(entity);
}
}
}
public T FindObjectOfType<T>() where T : ECSObject
{
Type type = typeof(T);
var elements = System.Entities.ToArray();
for (int i = 0; i < elements.Length; i++)
{
if (elements[i].GetType() == type)
{
return elements[i] as T;
}
for (int n = 0; n < elements[i].Components.Count; n++)
{
if (elements[i].Components[n].GetType() == type)
{
return elements[i].Components[n] as T;
}
}
}
return null;
}
public T[] FindObjectsOfType<T>() where T : ECSObject
{
Type type = typeof(T);
var items = System.Entities.ToArray();
List<T> elements = new List<T>();
for (int i = 0; i < items.Length; i++)
{
if (items[i].GetType() == type)
{
elements.Add(items[i] as T);
}
for (int n = 0; n < items[i].Components.Count; n++)
{
if (items[i].Components[n].GetType() == type)
{
elements.Add(items[i].Components[n] as T);
}
}
}
return elements.ToArray();
}
}
}