--- title: Godot UI 系统 description: Godot UI 系统提供了 GFramework UI 管理与 Godot Control 节点的完整集成。 --- # Godot UI 系统 ## 概述 Godot UI 系统是 GFramework.Godot 中连接框架 UI 管理与 Godot Control 节点的核心组件。它提供了 UI 页面行为封装、UI 工厂、UI 注册表等功能,支持多层级 UI 显示,让你可以在 Godot 项目中使用 GFramework 的 UI 管理系统。 通过 Godot UI 系统,你可以使用 GFramework 的 UI 路由、生命周期管理、多层级显示等功能,同时保持与 Godot UI 系统的完美兼容。 **主要特性**: - UI 页面行为封装 - UI 工厂和注册表 - 与 Godot PackedScene 集成 - 多层级 UI 支持(Page、Overlay、Modal、Toast、Topmost) - UI 生命周期管理 - UI 根节点管理 ## 核心概念 ### UI 页面行为 `CanvasItemUiPageBehaviorBase` 封装了 Godot Control 节点的 UI 行为: ```csharp public abstract class CanvasItemUiPageBehaviorBase : IUiPageBehavior where T : CanvasItem { protected readonly T Owner; public string Key { get; } public UiLayer Layer { get; } public bool IsReentrant { get; } } ``` ### UI 工厂 `GodotUiFactory` 负责创建 UI 实例: ```csharp public class GodotUiFactory : IUiFactory { public IUiPageBehavior Create(string uiKey); } ``` ### UI 层级行为 不同层级的 UI 有不同的行为类: ```csharp // Page 层(栈管理) public class PageLayerUiPageBehavior : CanvasItemUiPageBehaviorBase { public override UiLayer Layer => UiLayer.Page; public override bool IsReentrant => false; } // Modal 层(模态对话框) public class ModalLayerUiPageBehavior : CanvasItemUiPageBehaviorBase { public override UiLayer Layer => UiLayer.Modal; public override bool IsReentrant => true; } ``` ## 基本用法 ### 创建 UI 脚本 ```csharp using Godot; using GFramework.Game.Abstractions.UI; public partial class MainMenuPage : Control, IUiPage { public void OnEnter(IUiPageEnterParam? param) { GD.Print("进入主菜单"); Show(); } public void OnExit() { GD.Print("退出主菜单"); Hide(); } public void OnPause() { GD.Print("暂停主菜单"); } public void OnResume() { GD.Print("恢复主菜单"); } public void OnShow() { Show(); } public void OnHide() { Hide(); } } ``` ### 实现 UI 页面行为提供者 ```csharp using Godot; using GFramework.Game.Abstractions.UI; using GFramework.Godot.UI; public partial class MainMenuPage : Control, IUiPageBehaviorProvider { private PageLayerUiPageBehavior _behavior; public override void _Ready() { _behavior = new PageLayerUiPageBehavior(this, "MainMenu"); } public IUiPageBehavior GetPage() { return _behavior; } } ``` ### 注册 UI ```csharp using GFramework.Godot.UI; using Godot; public class GameUiRegistry : GodotUiRegistry { public GameUiRegistry() { // 注册 UI 资源 Register("MainMenu", GD.Load("res://ui/MainMenu.tscn")); Register("Settings", GD.Load("res://ui/Settings.tscn")); Register("ConfirmDialog", GD.Load("res://ui/ConfirmDialog.tscn")); Register("Toast", GD.Load("res://ui/Toast.tscn")); } } ``` ### 设置 UI 系统 ```csharp using GFramework.Godot.Architecture; using GFramework.Godot.UI; public class GameArchitecture : AbstractArchitecture { protected override void InstallModules() { // 注册 UI 注册表 var uiRegistry = new GameUiRegistry(); RegisterUtility(uiRegistry); // 注册 UI 工厂 var uiFactory = new GodotUiFactory(); RegisterUtility(uiFactory); // 注册 UI 路由 var uiRouter = new GodotUiRouter(); RegisterSystem(uiRouter); } } ``` ### 使用 UI 路由 ```csharp using Godot; using GFramework.Godot.Extensions; public partial class GameController : Node { public override void _Ready() { ShowMainMenu(); } private async void ShowMainMenu() { var uiRouter = this.GetSystem(); await uiRouter.PushAsync("MainMenu"); } private async void ShowSettings() { var uiRouter = this.GetSystem(); await uiRouter.PushAsync("Settings"); } private void ShowDialog() { var uiRouter = this.GetSystem(); uiRouter.Show("ConfirmDialog", UiLayer.Modal); } private void ShowToast(string message) { var uiRouter = this.GetSystem(); uiRouter.Show("Toast", UiLayer.Toast, new ToastParam { Message = message }); } } ``` ## 高级用法 ### 不同层级的 UI 行为 ```csharp // Page 层 UI(栈管理,不可重入) public partial class MainMenuPage : Control, IUiPageBehaviorProvider { public IUiPageBehavior GetPage() { return new PageLayerUiPageBehavior(this, "MainMenu"); } } // Overlay 层 UI(浮层,可重入) public partial class InfoPanel : Control, IUiPageBehaviorProvider { public IUiPageBehavior GetPage() { return new OverlayLayerUiPageBehavior(this, "InfoPanel"); } } // Modal 层 UI(模态对话框,可重入) public partial class ConfirmDialog : Control, IUiPageBehaviorProvider { public IUiPageBehavior GetPage() { return new ModalLayerUiPageBehavior(this, "ConfirmDialog"); } } // Toast 层 UI(提示,可重入) public partial class ToastMessage : Control, IUiPageBehaviorProvider { public IUiPageBehavior GetPage() { return new ToastLayerUiPageBehavior(this, "Toast"); } } // Topmost 层 UI(顶层,不可重入) public partial class LoadingScreen : Control, IUiPageBehaviorProvider { public IUiPageBehavior GetPage() { return new TopmostLayerUiPageBehavior(this, "Loading"); } } ``` ### UI 参数传递 ```csharp // 定义 UI 参数 public class ConfirmDialogParam : IUiPageEnterParam { public string Title { get; set; } public string Message { get; set; } public Action OnConfirm { get; set; } public Action OnCancel { get; set; } } // 在 UI 中接收参数 public partial class ConfirmDialog : Control, IUiPage { private Label _titleLabel; private Label _messageLabel; private Action _onConfirm; private Action _onCancel; public override void _Ready() { _titleLabel = GetNode