using System;
using System.Collections.Generic;
namespace TEngine
{
///
/// ECS架构基类Object
///
public class ECSObject
{
internal int HashCode;
internal ECSSystem System;
public ECSObject()
{
HashCode = GetType().GetHashCode();
}
public virtual void Awake() { }
public virtual void OnDestroy() { }
///
/// Remove The ECSEntity or Component And Throw the ECSObject to ArrayPool When AddComponent Or Create Can Use Again
///
///
/// 此对象是否可以复用,复用会将对象丢入System对象池中 等待再次使用,如果是Entity对象,并且不复用的话,则把Entity所使用的组件也不复用
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() 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() where T : ECSObject
{
Type type = typeof(T);
var items = System.Entities.ToArray();
List elements = new List();
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();
}
}
}