using GFramework.Core.Abstractions.architecture;
using GFramework.Core.Abstractions.ecs;
using GFramework.Core.Abstractions.ioc;
using GFramework.Core.Abstractions.lifecycle;
using GFramework.Core.ecs;
namespace GFramework.Core.services.modules;
///
/// ECS(Entity Component System)模块,用于注册、初始化和管理ECS相关服务。
/// 该模块负责创建ECS世界和系统运行器,并将其注册到依赖注入容器中。
///
public sealed class EcsModule : IServiceModule
{
private EcsSystemRunner? _ecsRunner;
private EcsWorld? _ecsWorld;
///
/// 构造函数,初始化ECS模块。
///
/// 指定模块是否启用,默认为 true。
public EcsModule(bool enabled = true)
{
IsEnabled = enabled;
}
///
/// 获取模块名称。
///
public string ModuleName => nameof(EcsModule);
///
/// 获取模块优先级,数值越小优先级越高。
///
public int Priority => 100;
///
/// 获取模块启用状态。
///
public bool IsEnabled { get; }
///
/// 注册ECS相关服务到依赖注入容器中。
/// 包括ECS世界实例和系统运行器实例的注册。
///
/// 依赖注入容器实例。
public void Register(IIocContainer container)
{
if (!IsEnabled) return;
_ecsWorld = new EcsWorld();
container.Register(_ecsWorld);
container.Register(_ecsWorld);
container.RegisterPlurality();
_ecsRunner = container.Get();
}
///
/// 初始化ECS模块。
/// 如果系统运行器实现了IInitializable接口,则调用其初始化方法。
///
public void Initialize()
{
if (!IsEnabled || _ecsRunner == null) return;
if (_ecsRunner is IInitializable initializable)
{
initializable.Initialize();
}
}
///
/// 异步销毁ECS模块并释放相关资源。
/// 包括销毁系统运行器和释放ECS世界资源。
///
/// 表示异步操作完成的任务。
public async ValueTask DestroyAsync()
{
if (!IsEnabled) return;
if (_ecsRunner is IDestroyable destroyable)
{
destroyable.Destroy();
}
_ecsRunner = null;
if (_ecsWorld != null)
{
_ecsWorld.Dispose();
_ecsWorld = null;
}
await ValueTask.CompletedTask;
}
///
/// 获取ECS世界实例。
///
/// ECS世界实例,如果未启用则返回 null。
public IEcsWorld? GetEcsWorld() => _ecsWorld;
///
/// 获取ECS系统运行器实例(内部使用)。
///
/// ECS系统运行器实例,如果未启用则返回 null。
internal EcsSystemRunner? GetEcsRunner() => _ecsRunner;
}