78 lines
1.9 KiB
C#
78 lines
1.9 KiB
C#
using Godot;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using BITKit.Core.Entites;
|
|
namespace BITKit;
|
|
/// <summary>
|
|
/// 用于Godot的ECS.Entity实现
|
|
/// </summary>
|
|
public partial class Entity : Node,IEntity
|
|
{
|
|
/// <summary>
|
|
/// 类型组件的缓存
|
|
/// </summary>
|
|
private readonly Dictionary<Type,IEntityComponent> TypeComponents=new ();
|
|
/// <summary>
|
|
/// IEntityService的缓存
|
|
/// </summary>
|
|
private IEntitiesService _entitiesService;
|
|
/// <summary>
|
|
/// 所有EntityComponent
|
|
/// </summary>
|
|
private IEntityComponent[] _components;
|
|
IEntityComponent[] IEntity.Components => _components;
|
|
/// <summary>
|
|
/// IEntity.Id实现
|
|
/// </summary>
|
|
public ulong Id { get; private set; }
|
|
/// <summary>
|
|
/// 加载所有EntityComponent的内部实现
|
|
/// </summary>
|
|
public override void _Ready()
|
|
{
|
|
List<IEntityComponent> entityComponents = new();
|
|
Id = GetInstanceId();
|
|
_entitiesService = DI.Get<IEntitiesService>();
|
|
foreach (var x in MathNode.GetAllNode(this))
|
|
{
|
|
GetInstanceId();
|
|
if (x is not IEntityComponent component) continue;
|
|
component.Entity = this;
|
|
TypeComponents.TryAdd(x.GetType(),component);
|
|
BIT4Log.Log<Entity>($"已加载组件:{x.Name}");
|
|
component.OnAwake();
|
|
entityComponents.Add(component);
|
|
}
|
|
foreach (var component in TypeComponents.Values)
|
|
{
|
|
component.OnStart();
|
|
}
|
|
_entitiesService.Register(this);
|
|
this._components = entityComponents.ToArray();
|
|
}
|
|
public bool TryGetComponent<T>(out T component) where T : IEntityComponent
|
|
{
|
|
if (TypeComponents.TryGetValue(typeof(T), out var iComponent) && iComponent is T _component)
|
|
{
|
|
component = _component;
|
|
return true;
|
|
}
|
|
component = default;
|
|
return false;
|
|
}
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
if (disposing)
|
|
{
|
|
_entitiesService.UnRegister(this);
|
|
}
|
|
}
|
|
|
|
public bool RegisterComponent<T>(T component) where T : IEntityComponent
|
|
{
|
|
return TypeComponents.TryAdd(typeof(T), component);
|
|
}
|
|
}
|