using GFramework.Core.Abstractions.logging;
using GFramework.Core.extensions;
using GFramework.Core.logging;
using GFramework.Core.utility;
using GFramework.Game.Abstractions.ui;
namespace GFramework.Godot.ui;
///
/// Godot UI工厂类,用于创建UI页面实例。
/// 继承自AbstractContextUtility并实现IUiFactory接口。
///
public class GodotUiFactory : AbstractContextUtility, IUiFactory
{
///
/// 日志记录器,用于记录调试信息。
///
private static readonly ILogger Log =
LoggerFactoryResolver.Provider.CreateLogger(nameof(GodotUiFactory));
///
/// UI注册表,用于管理UI场景资源。
///
private IGodotUiRegistry _registry = null!;
///
/// 根据指定的UI键创建UI页面实例。
///
/// UI页面的唯一标识符。
/// 返回创建的UI页面行为实例。
///
/// 当UI场景未实现IUiPageBehaviorProvider接口时抛出异常。
///
public IUiPageBehavior Create(string uiKey)
{
// 从注册表中获取指定UI键对应的场景
var scene = _registry.Get(uiKey);
// 实例化场景节点
var node = scene.Instantiate();
// 检查节点是否实现了IUiPageBehaviorProvider接口
if (node is not IUiPageBehaviorProvider provider)
throw new InvalidCastException(
$"UI scene {uiKey} must implement IUiPageBehaviorProvider");
// 获取页面行为实例
var page = provider.GetPage();
// 记录调试日志
Log.Debug("Created UI instance: {0}", uiKey);
return page;
}
///
/// 初始化方法,在对象初始化时调用。
/// 获取并设置UI注册表实例。
///
protected override void OnInit()
{
_registry = this.GetUtility()!;
}
}