using GFramework.Core.architecture;
using Godot;
namespace GFramework.Godot.architecture;
///
/// 抽象架构类,为特定类型的架构提供基础实现框架
///
/// 架构的具体类型,必须继承自Architecture且能被实例化
public abstract class AbstractArchitecture : Architecture where T : Architecture, new()
{
private const string ArchitectureName = "__GFrameworkArchitectureAnchor";
///
/// 初始化架构,按顺序注册模型、系统和工具
///
protected override void Init()
{
RegisterModels();
RegisterSystems();
RegisterUtilities();
AttachToGodotLifecycle();
}
///
/// 将架构绑定到Godot生命周期中,确保在场景树销毁时能够正确清理资源
/// 通过创建一个锚节点来监听场景树的销毁事件
///
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);
}
///
/// 注册工具抽象方法,由子类实现具体的工具注册逻辑
///
protected abstract void RegisterUtilities();
///
/// 注册系统抽象方法,由子类实现具体系统注册逻辑
///
protected abstract void RegisterSystems();
///
/// 注册模型抽象方法,由子类实现具体模型注册逻辑
///
protected abstract void RegisterModels();
}