2025-04-22 17:16:40 +08:00

106 lines
3.0 KiB
C#

using System.Collections.Generic;
namespace TEngine
{
internal sealed partial class EntityManager
{
/// <summary>
/// 实体信息。
/// </summary>
private sealed class EntityInfo : IMemory
{
private IEntity _entity;
private EntityStatus _status;
private IEntity _parentEntity;
private readonly List<IEntity> _childEntities;
public EntityInfo()
{
_entity = null;
_status = EntityStatus.Unknown;
_parentEntity = null;
_childEntities = new List<IEntity>();
}
public IEntity Entity => _entity;
public EntityStatus Status
{
get => _status;
set => _status = value;
}
public IEntity ParentEntity
{
get => _parentEntity;
set => _parentEntity = value;
}
public int ChildEntityCount => _childEntities.Count;
public static EntityInfo Create(IEntity entity)
{
if (entity == null)
{
throw new GameFrameworkException("Entity is invalid.");
}
EntityInfo entityInfo = MemoryPool.Acquire<EntityInfo>();
entityInfo._entity = entity;
entityInfo._status = EntityStatus.WillInit;
return entityInfo;
}
public void Clear()
{
_entity = null;
_status = EntityStatus.Unknown;
_parentEntity = null;
_childEntities.Clear();
}
public IEntity GetChildEntity()
{
return _childEntities.Count > 0 ? _childEntities[0] : null;
}
public IEntity[] GetChildEntities()
{
return _childEntities.ToArray();
}
public void GetChildEntities(List<IEntity> results)
{
if (results == null)
{
throw new GameFrameworkException("Results is invalid.");
}
results.Clear();
foreach (IEntity childEntity in _childEntities)
{
results.Add(childEntity);
}
}
public void AddChildEntity(IEntity childEntity)
{
if (_childEntities.Contains(childEntity))
{
throw new GameFrameworkException("Can not add child entity which is already exist.");
}
_childEntities.Add(childEntity);
}
public void RemoveChildEntity(IEntity childEntity)
{
if (!_childEntities.Remove(childEntity))
{
throw new GameFrameworkException("Can not remove child entity which is not exist.");
}
}
}
}
}