logo
0
0
WeChat Login

Game Frame X UI

License Unity Version Version

Game Frame X UI 是 GameFrameX 框架的 UI 组件,提供了完整的 UI 管理解决方案,支持 UGUI 和 FairyGUI 两种 UI 系统。

📋 目录

✨ 特性

  • 🎯 统一的 UI 管理接口 - 支持 UGUI 和 FairyGUI
  • 🏗️ 分层 UI 系统 - 预定义的 UI 组层级管理
  • 🔄 对象池管理 - 自动回收和复用 UI 实例
  • 📡 事件驱动 - 完整的 UI 生命周期事件
  • 异步加载 - 支持异步 UI 加载和依赖管理
  • 🎨 灵活配置 - 可配置的 UI 组和辅助器
  • 🔧 编辑器支持 - 完整的 Unity 编辑器集成

📦 安装

方式一:Package Manager (推荐)

  1. 打开 Unity Package Manager
  2. 点击 "+" 按钮,选择 "Add package from git URL"
  3. 输入以下 URL:
    https://github.com/gameframex/com.gameframex.unity.ui.git

方式二:manifest.json

在项目的 Packages/manifest.json 文件中添加:

{ "dependencies": { "com.gameframex.unity.ui": "https://github.com/gameframex/com.gameframex.unity.ui.git" } }

方式三:本地安装

  1. 下载或克隆此仓库
  2. 将文件夹放置到项目的 Packages 目录下
  3. Unity 会自动识别并加载包

🚀 快速开始

1. 添加 UI 组件

在场景中创建一个 GameObject 并添加 UIComponent 组件:

// 获取 UI 组件 var uiComponent = GameEntry.GetComponent<UIComponent>();

2. 创建 UI 窗体

// 继承 UIForm 创建自定义 UI public class MainMenuUI : UIForm { protected override void OnInit(object userData) { base.OnInit(userData); // 初始化 UI 逻辑 } protected override void OnOpen(object userData) { base.OnOpen(userData); // UI 打开时的逻辑 } protected override void OnClose(bool isShutdown, object userData) { base.OnClose(isShutdown, userData); // UI 关闭时的逻辑 } }

3. 打开和关闭 UI

// 打开 UI uiComponent.OpenUIForm("MainMenuUI", "UI/MainMenu"); // 异步打开 UI await uiComponent.OpenUIFormAsync("MainMenuUI", "UI/MainMenu"); // 关闭 UI uiComponent.CloseUIForm("MainMenuUI"); // 关闭所有 UI uiComponent.CloseAllLoadedUIForms();

🏗️ 核心概念

UI 管理器 (IUIManager)

UI 管理器是整个 UI 系统的核心,负责:

  • UI 窗体的生命周期管理
  • UI 组的管理和层级控制
  • 对象池的管理和回收
  • 事件的分发和处理

UI 窗体 (UIForm)

UI 窗体是所有 UI 界面的基类,提供:

  • 标准的生命周期方法
  • 可见性控制
  • 暂停和恢复功能
  • 用户数据传递

UI 组 (UIGroup)

UI 组用于管理 UI 的层级关系,每个组有不同的深度值:

  • 深度值越小,显示层级越高
  • 支持组内 UI 的排序和管理
  • 可配置组的辅助器

📚 API 文档

UIComponent 主要方法

打开 UI 窗体

/// <summary> /// 打开界面。 /// </summary> /// <param name="uiFormAssetName">界面资源名称。</param> /// <param name="uiGroupName">界面组名称。</param> /// <param name="priority">加载界面资源的优先级。</param> /// <param name="pauseCoveredUIForm">是否暂停被覆盖的界面。</param> /// <param name="userData">用户自定义数据。</param> /// <returns>界面的序列编号。</returns> public int OpenUIForm(string uiFormAssetName, string uiGroupName, int priority = 0, bool pauseCoveredUIForm = true, object userData = null) /// <summary> /// 异步打开界面。 /// </summary> /// <param name="uiFormAssetName">界面资源名称。</param> /// <param name="uiGroupName">界面组名称。</param> /// <param name="priority">加载界面资源的优先级。</param> /// <param name="pauseCoveredUIForm">是否暂停被覆盖的界面。</param> /// <param name="userData">用户自定义数据。</param> /// <returns>界面实例。</returns> public Task<IUIForm> OpenUIFormAsync(string uiFormAssetName, string uiGroupName, int priority = 0, bool pauseCoveredUIForm = true, object userData = null)

关闭 UI 窗体

/// <summary> /// 关闭界面。 /// </summary> /// <param name="serialId">要关闭界面的序列编号。</param> /// <param name="userData">用户自定义数据。</param> public void CloseUIForm(int serialId, object userData = null) /// <summary> /// 关闭界面。 /// </summary> /// <param name="uiForm">要关闭的界面。</param> /// <param name="userData">用户自定义数据。</param> public void CloseUIForm(IUIForm uiForm, object userData = null)

获取 UI 窗体

/// <summary> /// 获取界面。 /// </summary> /// <param name="serialId">要获取界面的序列编号。</param> /// <returns>要获取的界面。</returns> public IUIForm GetUIForm(int serialId) /// <summary> /// 获取界面。 /// </summary> /// <param name="uiFormAssetName">要获取界面的资源名称。</param> /// <returns>要获取的界面。</returns> public IUIForm GetUIForm(string uiFormAssetName)

UIForm 生命周期方法

/// <summary> /// 界面初始化。 /// </summary> /// <param name="userData">用户自定义数据。</param> protected virtual void OnInit(object userData) { } /// <summary> /// 界面回收。 /// </summary> protected virtual void OnRecycle() { } /// <summary> /// 界面打开。 /// </summary> /// <param name="userData">用户自定义数据。</param> protected virtual void OnOpen(object userData) { } /// <summary> /// 界面关闭。 /// </summary> /// <param name="isShutdown">是否是关闭界面管理器时触发。</param> /// <param name="userData">用户自定义数据。</param> protected virtual void OnClose(bool isShutdown, object userData) { } /// <summary> /// 界面暂停。 /// </summary> protected virtual void OnPause() { } /// <summary> /// 界面暂停恢复。 /// </summary> protected virtual void OnResume() { }

🎯 UI 组层级

框架预定义了以下 UI 组层级(按深度值排序):

组名深度值描述
System-35系统顶级界面
Notify-30通知界面
Loading-25加载界面
Dialogue-23对话界面
BlackBoard-22黑板界面
Guide-20引导界面
Tip-15提示界面
Window-10窗口界面
Fixed0固定界面
Normal10普通界面
Floor15底板界面
Map20地图界面
Hud22头顶界面
Battle25战斗界面
World27世界界面
Scene30场景界面
Background35背景界面
Hidden40隐藏界面

📡 事件系统

框架提供了完整的 UI 事件系统:

事件类型

  • OpenUIFormSuccessEventArgs - UI 打开成功事件
  • OpenUIFormFailureEventArgs - UI 打开失败事件
  • CloseUIFormCompleteEventArgs - UI 关闭完成事件
  • UIFormVisibleChangedEventArgs - UI 可见性改变事件

事件订阅示例

// 订阅 UI 打开成功事件 GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess); private void OnOpenUIFormSuccess(object sender, GameEventArgs e) { var args = (OpenUIFormSuccessEventArgs)e; Debug.Log($"UI {args.UIForm.UIFormAssetName} 打开成功"); }

💡 最佳实践

1. UI 资源命名规范

// 推荐的命名方式 "UI/MainMenu" // 主菜单 "UI/Battle/HUD" // 战斗 HUD "UI/Shop/ItemList" // 商店物品列表

2. UI 数据传递

// 使用强类型数据类 public class ShopUIData { public int PlayerId { get; set; } public List<Item> Items { get; set; } } // 打开 UI 时传递数据 var shopData = new ShopUIData { PlayerId = 123, Items = itemList }; uiComponent.OpenUIForm("ShopUI", "Normal", userData: shopData); // 在 UI 中接收数据 protected override void OnOpen(object userData) { var shopData = userData as ShopUIData; if (shopData != null) { // 使用数据初始化 UI } }

3. UI 性能优化

// 配置对象池参数 uiComponent.InstanceCapacity = 16; // 对象池容量 uiComponent.InstanceExpireTime = 60f; // 对象过期时间 uiComponent.RecycleInterval = 60; // 回收间隔

📝 示例代码

完整的 UI 窗体示例

using GameFrameX.UI.Runtime; using UnityEngine; using UnityEngine.UI; public class MainMenuUI : UIForm { [SerializeField] private Button startButton; [SerializeField] private Button settingsButton; [SerializeField] private Button exitButton; protected override void OnInit(object userData) { base.OnInit(userData); // 绑定按钮事件 startButton.onClick.AddListener(OnStartButtonClick); settingsButton.onClick.AddListener(OnSettingsButtonClick); exitButton.onClick.AddListener(OnExitButtonClick); } protected override void OnOpen(object userData) { base.OnOpen(userData); // 播放打开动画 PlayOpenAnimation(); } protected override void OnClose(bool isShutdown, object userData) { base.OnClose(isShutdown, userData); // 清理资源 CleanupResources(); } private void OnStartButtonClick() { // 关闭当前 UI 并打开游戏 UI UIComponent.CloseUIForm(this); UIComponent.OpenUIForm("GameUI", "Normal"); } private void OnSettingsButtonClick() { // 打开设置 UI UIComponent.OpenUIForm("SettingsUI", "Window"); } private void OnExitButtonClick() { // 退出游戏 Application.Quit(); } private void PlayOpenAnimation() { // 实现打开动画 } private void CleanupResources() { // 清理资源 } }

UI 管理器使用示例

public class UIManager : MonoBehaviour { private UIComponent uiComponent; private void Start() { uiComponent = GameEntry.GetComponent<UIComponent>(); // 配置 UI 组件 ConfigureUIComponent(); // 打开主菜单 OpenMainMenu(); } private void ConfigureUIComponent() { // 设置对象池参数 uiComponent.InstanceCapacity = 20; uiComponent.InstanceExpireTime = 120f; uiComponent.RecycleInterval = 60; // 订阅事件 GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnUIFormOpenSuccess); GameEntry.Event.Subscribe(OpenUIFormFailureEventArgs.EventId, OnUIFormOpenFailure); } private async void OpenMainMenu() { try { var mainMenuUI = await uiComponent.OpenUIFormAsync("MainMenuUI", "Normal"); Debug.Log("主菜单打开成功"); } catch (System.Exception ex) { Debug.LogError($"主菜单打开失败: {ex.Message}"); } } private void OnUIFormOpenSuccess(object sender, GameEventArgs e) { var args = (OpenUIFormSuccessEventArgs)e; Debug.Log($"UI 打开成功: {args.UIForm.UIFormAssetName}"); } private void OnUIFormOpenFailure(object sender, GameEventArgs e) { var args = (OpenUIFormFailureEventArgs)e; Debug.LogError($"UI 打开失败: {args.UIFormAssetName}, 错误: {args.ErrorMessage}"); } }

🔗 依赖项

此包依赖以下 GameFrameX 组件:

  • com.gameframex.unity (>= 1.1.1) - 核心框架
  • com.gameframex.unity.asset (>= 1.0.6) - 资源管理
  • com.gameframex.unity.event (>= 1.0.0) - 事件系统
  • com.gameframex.unity.localization (>= 1.0.0) - 本地化支持

📋 版本历史

2.0.0 (2025-06-12)

  • 重大版本更新
  • 优化 UI 管理器架构
  • 改进对象池性能

1.2.7 (2025-06-11)

  • 修复 UI 回收后参数重置问题
  • 优化异步加载性能

查看完整的 CHANGELOG.md 了解详细的版本历史。

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE.md 文件了解详情。

🤝 贡献

欢迎提交 Issue 和 Pull Request!

📞 联系方式


Game Frame X - 独立游戏前后端一体化解决方案,独立游戏开发者的圆梦大使。

About

No description, topics, or website provided.
547.00 KiB
0 forks0 stars1 branches30 TagREADMEApache-2.0 license