GFramework/GFramework.Core/ecs/ArchSystemAdapter.cs
GeWuYou 155ca3024b fix(ecs): 修复模块重复初始化和系统更新问题
- 添加 _isInitialized 标志防止 ArchEcsModule 重复初始化
- 在 Initialize 方法中检查是否已初始化避免重复执行
- 设置初始化标志在所有系统初始化完成后
- 修改 DestroyAsync 方法确保仅在已初始化时执行销毁
- 重置 _isInitialized 标志为 false 在销毁时
- 修正 ArchSystemAdapter 注释描述 OnUpdate 为虚方法而非抽象方法
- 简化 EcsAdvancedTests 中的断言语法移除不必要的大括号
2026-03-02 21:20:50 +08:00

136 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Arch.Core;
using GFramework.Core.extensions;
using GFramework.Core.system;
using ArchSys = Arch.System;
namespace GFramework.Core.ecs;
/// <summary>
/// Arch 系统适配器 - 桥接 Arch.System.ISystem&lt;T&gt; 到框架上下文
/// </summary>
/// <typeparam name="T">系统数据类型(通常是 float 表示 deltaTime</typeparam>
public abstract class ArchSystemAdapter<T> : AbstractSystem, ArchSys.ISystem<T>
{
/// <summary>
/// 获取或设置 Arch ECS 世界的实例
/// </summary>
public World World { get; private set; } = null!;
// ===== Arch 显式接口实现 =====
/// <summary>
/// 显式实现 Arch.System.ISystem&lt;T&gt; 的初始化方法
/// 调用受保护的虚方法 OnArchInitialize 以允许子类自定义初始化逻辑
/// </summary>
void ArchSys.ISystem<T>.Initialize()
{
OnArchInitialize();
}
/// <summary>
/// 显式实现 Arch.System.ISystem&lt;T&gt; 的更新前回调方法
/// 调用受保护的虚方法 OnBeforeUpdate 以允许子类自定义预处理逻辑
/// </summary>
/// <param name="t">系统数据参数(通常是 deltaTime</param>
void ArchSys.ISystem<T>.BeforeUpdate(in T t)
{
OnBeforeUpdate(in t);
}
/// <summary>
/// 显式实现 Arch.System.ISystem&lt;T&gt; 的主更新方法
/// 调用受保护的虚方法 OnUpdate 以强制子类实现核心更新逻辑
/// </summary>
/// <param name="t">系统数据参数(通常是 deltaTime</param>
public void Update(in T t)
{
OnUpdate(in t);
}
/// <summary>
/// 显式实现 Arch.System.ISystem&lt;T&gt; 的更新后回调方法
/// 调用受保护的虚方法 OnAfterUpdate 以允许子类自定义后处理逻辑
/// </summary>
/// <param name="t">系统数据参数(通常是 deltaTime</param>
void ArchSys.ISystem<T>.AfterUpdate(in T t)
{
OnAfterUpdate(in t);
}
/// <summary>
/// 显式实现 IDisposable 的资源释放方法
/// 调用受保护的虚方法 OnArchDispose 以允许子类自定义资源清理逻辑
/// </summary>
void IDisposable.Dispose()
{
OnArchDispose();
}
// ===== GFramework 生命周期 =====
/// <summary>
/// 系统初始化方法
/// 在此方法中获取 Arch World 实例并调用 Arch 系统的初始化逻辑
/// </summary>
protected override void OnInit()
{
World = this.GetService<World>()!;
// 调用 Arch 初始化
((ArchSys.ISystem<T>)this).Initialize();
}
/// <summary>
/// 系统销毁方法
/// 在此方法中调用 Arch 系统的资源释放逻辑
/// </summary>
protected override void OnDestroy()
{
((ArchSys.ISystem<T>)this).Dispose();
}
// ===== 子类可重写 Hook =====
/// <summary>
/// Arch 系统初始化的受保护虚方法
/// 子类可重写此方法以实现自定义的 Arch 系统初始化逻辑
/// </summary>
protected virtual void OnArchInitialize()
{
}
/// <summary>
/// 更新前处理的受保护虚方法
/// 子类可重写此方法以实现自定义的预处理逻辑
/// </summary>
/// <param name="t">系统数据参数(通常是 deltaTime</param>
protected virtual void OnBeforeUpdate(in T t)
{
}
/// <summary>
/// 核心更新逻辑的受保护抽象方法
/// 子类必须重写此方法以实现具体的系统更新功能
/// </summary>
/// <param name="t">系统数据参数(通常是 deltaTime</param>
protected virtual void OnUpdate(in T t)
{
}
/// <summary>
/// 更新后处理的受保护虚方法
/// 子类可重写此方法以实现自定义的后处理逻辑
/// </summary>
/// <param name="t">系统数据参数(通常是 deltaTime</param>
protected virtual void OnAfterUpdate(in T t)
{
}
/// <summary>
/// Arch 系统资源释放的受保护虚方法
/// 子类可重写此方法以实现自定义的资源清理逻辑
/// </summary>
protected virtual void OnArchDispose()
{
}
}