mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
feat(ui): 添加CanvasItem页面行为和Godot UI工厂
- 实现CanvasItemPageBehavior类支持所有继承自CanvasItem的节点 - 添加OnEnter、OnExit、OnPause、OnResume、OnHide、OnShow页面生命周期方法 - 创建GodotUiFactory工厂类用于创建UI页面实例 - 实现Create方法根据UI键创建页面行为实例 - 重命名IUiPageProvider为IUiPageBehaviorProvider接口 - 更新接口方法GetPage返回页面行为实例的描述
This commit is contained in:
parent
8fd7e2e952
commit
c931cb7d66
13
GFramework.Game.Abstractions/ui/IUiPageBehaviorProvider.cs
Normal file
13
GFramework.Game.Abstractions/ui/IUiPageBehaviorProvider.cs
Normal file
@ -0,0 +1,13 @@
|
||||
namespace GFramework.Game.Abstractions.ui;
|
||||
|
||||
/// <summary>
|
||||
/// UI页面行为提供者接口,用于获取页面行为实例
|
||||
/// </summary>
|
||||
public interface IUiPageBehaviorProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取页面行为实例
|
||||
/// </summary>
|
||||
/// <returns>页面行为接口实例</returns>
|
||||
IPageBehavior GetPage();
|
||||
}
|
||||
@ -1,13 +0,0 @@
|
||||
namespace GFramework.Game.Abstractions.ui;
|
||||
|
||||
/// <summary>
|
||||
/// UI页面提供者接口,用于创建UI页面实例
|
||||
/// </summary>
|
||||
public interface IUiPageProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取UI页面实例
|
||||
/// </summary>
|
||||
/// <returns>UI页面实例</returns>
|
||||
IPageBehavior GetPage();
|
||||
}
|
||||
89
GFramework.Godot/ui/CanvasItemPageBehavior.cs
Normal file
89
GFramework.Godot/ui/CanvasItemPageBehavior.cs
Normal file
@ -0,0 +1,89 @@
|
||||
using GFramework.Game.Abstractions.ui;
|
||||
using GFramework.Godot.extensions;
|
||||
using Godot;
|
||||
|
||||
namespace GFramework.Godot.ui;
|
||||
|
||||
/// <summary>
|
||||
/// 控制 UI 页面行为的泛型行为类,
|
||||
/// 支持所有继承自 CanvasItem 的节点
|
||||
/// </summary>
|
||||
/// <typeparam name="T">CanvasItem 类型的视图节点</typeparam>
|
||||
public class CanvasItemPageBehavior<T>(T owner) : IPageBehavior
|
||||
where T : CanvasItem
|
||||
{
|
||||
private readonly IUiPage? _page = owner as IUiPage;
|
||||
|
||||
/// <summary>
|
||||
/// 页面视图对象
|
||||
/// </summary>
|
||||
public object View => owner;
|
||||
|
||||
/// <summary>
|
||||
/// 获取页面是否存活状态
|
||||
/// </summary>
|
||||
public bool IsAlive => owner.IsValidNode();
|
||||
|
||||
/// <summary>
|
||||
/// 页面进入时调用
|
||||
/// </summary>
|
||||
/// <param name="param">页面进入参数</param>
|
||||
public void OnEnter(IUiPageEnterParam? param)
|
||||
{
|
||||
_page?.OnEnter(param);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 页面退出时调用
|
||||
/// </summary>
|
||||
public void OnExit()
|
||||
{
|
||||
_page?.OnExit();
|
||||
owner.QueueFreeX();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 页面暂停时调用
|
||||
/// </summary>
|
||||
public void OnPause()
|
||||
{
|
||||
_page?.OnPause();
|
||||
|
||||
// 暂停节点的处理、物理处理和输入处理
|
||||
owner.SetProcess(false);
|
||||
owner.SetPhysicsProcess(false);
|
||||
owner.SetProcessInput(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 页面恢复时调用
|
||||
/// </summary>
|
||||
public void OnResume()
|
||||
{
|
||||
_page?.OnResume();
|
||||
|
||||
// 恢复节点的处理、物理处理和输入处理
|
||||
owner.SetProcess(true);
|
||||
owner.SetPhysicsProcess(true);
|
||||
owner.SetProcessInput(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 页面隐藏时调用
|
||||
/// </summary>
|
||||
public void OnHide()
|
||||
{
|
||||
_page?.OnHide();
|
||||
owner.Hide();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 页面显示时调用
|
||||
/// </summary>
|
||||
public void OnShow()
|
||||
{
|
||||
_page?.OnShow();
|
||||
owner.Show();
|
||||
OnResume();
|
||||
}
|
||||
}
|
||||
49
GFramework.Godot/ui/GodotUiFactory.cs
Normal file
49
GFramework.Godot/ui/GodotUiFactory.cs
Normal file
@ -0,0 +1,49 @@
|
||||
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 IWritableUiRegistry<PackedScene> _registry = null!;
|
||||
|
||||
/// <summary>
|
||||
/// 根据指定的UI键创建UI页面实例
|
||||
/// </summary>
|
||||
/// <param name="uiKey">UI资源的唯一标识键</param>
|
||||
/// <returns>实现IUiPage接口的UI页面实例</returns>
|
||||
/// <exception cref="InvalidCastException">当UI场景没有继承IUiPage接口时抛出</exception>
|
||||
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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化方法,获取UI注册表实例
|
||||
/// </summary>
|
||||
protected override void OnInit()
|
||||
{
|
||||
_registry = this.GetUtility<IWritableUiRegistry<PackedScene>>()!;
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user