GFramework/GFramework.Godot/architecture/AbstractArchitecture.cs
GwWuYou f990f8d2c1 refactor(architecture): 重构架构初始化流程
将原有的 RegisterModels、RegisterSystems 和 RegisterUtilities 方法合并为统一的
InstallModules 抽象方法,由子类实现具体的模块注册逻辑。同时调整初始化顺序,确保
架构能正确绑定到 Godot 生命周期中并管理资源清理。
2025-12-21 12:28:02 +08:00

52 lines
1.5 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 GFramework.Core.architecture;
using Godot;
namespace GFramework.Godot.architecture;
/// <summary>
/// 抽象架构类,为特定类型的架构提供基础实现框架
/// </summary>
/// <typeparam name="T">架构的具体类型必须继承自Architecture且能被实例化</typeparam>
public abstract class AbstractArchitecture<T> : Architecture<T> where T : Architecture<T>, new()
{
private const string ArchitectureName = "__GFramework__Architecture__Anchor";
/// <summary>
/// 初始化架构,按顺序注册模型、系统和工具
/// </summary>
protected override void Init()
{
AttachToGodotLifecycle();
InstallModules();
}
/// <summary>
/// 安装模块抽象方法,由子类实现具体的模块注册逻辑
/// </summary>
protected abstract void InstallModules();
/// <summary>
/// 将架构绑定到Godot生命周期中确保在场景树销毁时能够正确清理资源
/// 通过创建一个锚节点来监听场景树的销毁事件
/// </summary>
private void AttachToGodotLifecycle()
{
if (Engine.GetMainLoop() is not SceneTree tree)
return;
// 防止重复挂载(热重载 / 多次 Init
if (tree.Root.GetNodeOrNull(ArchitectureName) != null)
return;
var anchor = new ArchitectureAnchorNode
{
Name = ArchitectureName
};
anchor.Bind(Destroy);
tree.Root.CallDeferred(Node.MethodName.AddChild, anchor);
}
}