GFramework/GFramework.Godot/ui/GodotUiFactory.cs
GeWuYou 3589a0cf2f feat(registry): 添加通用注册表基础设施并重构UI注册功能
- 新增 IKeyValue 接口定义通用键值对数据结构契约
- 创建 IRegistry 接口提供通用注册表功能定义
- 实现 KeyValueRegistryBase 基类提供基于字典的键值对管理
- 添加 GodotSceneRegistry 类管理Godot场景资源
- 重构 GodotUiRegistry 和 GodotUiFactory 使用新的注册表基类
- 移除废弃的 IWritableUiRegistry 接口
- 更新项目文件添加注册表相关目录结构
2026-01-18 16:01:10 +08:00

49 lines
1.6 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.extensions;
using GFramework.Core.utility;
using GFramework.Game.Abstractions.ui;
using Godot;
namespace GFramework.Godot.ui;
/// <summary>
/// Godot UI工厂类用于创建UI页面实例
/// 继承自AbstractContextUtility并实现IUiFactory接口
/// </summary>
public class GodotUiFactory : AbstractContextUtility, IUiFactory
{
/// <summary>
/// UI注册表用于存储和获取PackedScene类型的UI资源
/// </summary>
private IUiRegistry<PackedScene> _registry = null!;
/// <summary>
/// 根据指定的UI键创建UI页面实例
/// </summary>
/// <param name="uiKey">UI资源的唯一标识键</param>
/// <returns>实现IUiPage接口的UI页面实例</returns>
/// <exception cref="InvalidCastException">当UI场景没有继承IUiPage接口时抛出</exception>
public IUiPageBehavior 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();
}
/// <summary>
/// 初始化方法获取UI注册表实例
/// </summary>
protected override void OnInit()
{
_registry = this.GetUtility<IUiRegistry<PackedScene>>()!;
}
}