using GFramework.Core.extensions;
using GFramework.Core.utility;
using GFramework.Game.Abstractions.ui;
using Godot;
namespace GFramework.Godot.ui;
///
/// Godot UI工厂类,用于创建UI页面实例
/// 继承自AbstractContextUtility并实现IUiFactory接口
///
public class GodotUiFactory : AbstractContextUtility, IUiFactory
{
///
/// UI注册表,用于存储和获取PackedScene类型的UI资源
///
private IWritableUiRegistry _registry = null!;
///
/// 根据指定的UI键创建UI页面实例
///
/// UI资源的唯一标识键
/// 实现IUiPage接口的UI页面实例
/// 当UI场景没有继承IUiPage接口时抛出
public IPageBehavior Create(string uiKey)
{
// 从注册表中获取对应的场景资源
var scene = _registry.Get(uiKey);
// 实例化场景节点
var node = scene.Instantiate();
// 验证节点是否实现了IUiPageProvider接口
if (node is not IUiPageBehaviorProvider provider)
throw new InvalidCastException(
$"UI scene {uiKey} must implement IUiPageBehaviorProvider");
// 获取并返回页面行为实例
return provider.GetPage();
}
///
/// 初始化方法,获取UI注册表实例
///
protected override void OnInit()
{
_registry = this.GetUtility>()!;
}
}