mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 19:03:29 +08:00
- 移除 DestroyAsync 方法中的 async 关键字 - 修改条件判断逻辑,确保返回正确的 ValueTask.CompletedTask - 删除不必要的 await 关键字,直接返回 ValueTask.CompletedTask - 保持方法的异步操作正确性
128 lines
2.9 KiB
C#
128 lines
2.9 KiB
C#
using Arch.Core;
|
||
using GFramework.Core.Abstractions.architecture;
|
||
using GFramework.Core.Abstractions.ioc;
|
||
|
||
namespace GFramework.Core.ecs;
|
||
|
||
/// <summary>
|
||
/// Arch ECS 模块 - 核心适配器,桥接 Arch 到框架生命周期
|
||
/// </summary>
|
||
public sealed class ArchEcsModule : IServiceModule
|
||
{
|
||
private readonly List<ArchSystemAdapter<float>> _systems = [];
|
||
private IIocContainer? _container;
|
||
private bool _isInitialized;
|
||
private World? _world;
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="enabled">是否启用模块</param>
|
||
public ArchEcsModule(bool enabled = true)
|
||
{
|
||
IsEnabled = enabled;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 模块名称
|
||
/// </summary>
|
||
public string ModuleName => nameof(ArchEcsModule);
|
||
|
||
/// <summary>
|
||
/// 模块优先级
|
||
/// </summary>
|
||
public int Priority => 50;
|
||
|
||
/// <summary>
|
||
/// 是否启用
|
||
/// </summary>
|
||
public bool IsEnabled { get; }
|
||
|
||
/// <summary>
|
||
/// 注册服务 - 创建并注册 World
|
||
/// </summary>
|
||
public void Register(IIocContainer container)
|
||
{
|
||
if (!IsEnabled) return;
|
||
|
||
_container = container;
|
||
|
||
// 创建并注册 World
|
||
_world = World.Create();
|
||
container.Register(_world);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 初始化 - 从容器获取所有适配器并初始化
|
||
/// </summary>
|
||
public void Initialize()
|
||
{
|
||
if (!IsEnabled || _world == null || _container == null) return;
|
||
|
||
// 防止重复初始化
|
||
if (_isInitialized)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// 从容器获取所有适配器
|
||
var adapters = _container.GetAll<ArchSystemAdapter<float>>();
|
||
if (adapters.Count > 0)
|
||
{
|
||
_systems.AddRange(adapters);
|
||
|
||
// 初始化所有系统(会调用 Arch 系统的 Initialize)
|
||
foreach (var system in _systems)
|
||
{
|
||
system.Initialize();
|
||
}
|
||
}
|
||
|
||
_isInitialized = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 异步销毁
|
||
/// </summary>
|
||
public ValueTask DestroyAsync()
|
||
{
|
||
if (!IsEnabled || !_isInitialized)
|
||
{
|
||
return ValueTask.CompletedTask;
|
||
}
|
||
|
||
// 销毁所有系统
|
||
foreach (var system in _systems)
|
||
{
|
||
system.Destroy();
|
||
}
|
||
|
||
_systems.Clear();
|
||
|
||
// 销毁 World
|
||
if (_world != null)
|
||
{
|
||
World.Destroy(_world);
|
||
_world = null;
|
||
}
|
||
|
||
_isInitialized = false;
|
||
|
||
return ValueTask.CompletedTask;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新所有 ECS 系统
|
||
/// </summary>
|
||
/// <param name="deltaTime">帧间隔时间</param>
|
||
public void Update(float deltaTime)
|
||
{
|
||
if (!IsEnabled) return;
|
||
|
||
// 调用所有系统的更新
|
||
foreach (var system in _systems)
|
||
{
|
||
system.Update(deltaTime);
|
||
}
|
||
}
|
||
} |