An open API service indexing awesome lists of open source software.

https://github.com/gameframex/com.gameframex.unity.ui


https://github.com/gameframex/com.gameframex.unity.ui

Last synced: about 2 months ago
JSON representation

Awesome Lists containing this project

README

          

# Game Frame X UI

[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.md)
[![Unity Version](https://img.shields.io/badge/unity-2019.4+-green.svg)](https://unity3d.com/get-unity/download)
[![Version](https://img.shields.io/badge/version-2.0.0-orange.svg)](package.json)

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

## 📋 目录

- [特性](#特性)
- [安装](#安装)
- [快速开始](#快速开始)
- [核心概念](#核心概念)
- [API 文档](#api-文档)
- [UI 组层级](#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` 文件中添加:

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

### 方式三:本地安装

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

## 🚀 快速开始

### 1. 添加 UI 组件

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

```csharp
// 获取 UI 组件
var uiComponent = GameEntry.GetComponent();
```

### 2. 创建 UI 窗体

```csharp
// 继承 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

```csharp
// 打开 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 窗体

```csharp
///
/// 打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 加载界面资源的优先级。
/// 是否暂停被覆盖的界面。
/// 用户自定义数据。
/// 界面的序列编号。
public int OpenUIForm(string uiFormAssetName, string uiGroupName, int priority = 0, bool pauseCoveredUIForm = true, object userData = null)

///
/// 异步打开界面。
///
/// 界面资源名称。
/// 界面组名称。
/// 加载界面资源的优先级。
/// 是否暂停被覆盖的界面。
/// 用户自定义数据。
/// 界面实例。
public Task OpenUIFormAsync(string uiFormAssetName, string uiGroupName, int priority = 0, bool pauseCoveredUIForm = true, object userData = null)
```

#### 关闭 UI 窗体

```csharp
///
/// 关闭界面。
///
/// 要关闭界面的序列编号。
/// 用户自定义数据。
public void CloseUIForm(int serialId, object userData = null)

///
/// 关闭界面。
///
/// 要关闭的界面。
/// 用户自定义数据。
public void CloseUIForm(IUIForm uiForm, object userData = null)
```

#### 获取 UI 窗体

```csharp
///
/// 获取界面。
///
/// 要获取界面的序列编号。
/// 要获取的界面。
public IUIForm GetUIForm(int serialId)

///
/// 获取界面。
///
/// 要获取界面的资源名称。
/// 要获取的界面。
public IUIForm GetUIForm(string uiFormAssetName)
```

### UIForm 生命周期方法

```csharp
///
/// 界面初始化。
///
/// 用户自定义数据。
protected virtual void OnInit(object userData) { }

///
/// 界面回收。
///
protected virtual void OnRecycle() { }

///
/// 界面打开。
///
/// 用户自定义数据。
protected virtual void OnOpen(object userData) { }

///
/// 界面关闭。
///
/// 是否是关闭界面管理器时触发。
/// 用户自定义数据。
protected virtual void OnClose(bool isShutdown, object userData) { }

///
/// 界面暂停。
///
protected virtual void OnPause() { }

///
/// 界面暂停恢复。
///
protected virtual void OnResume() { }
```

## 🎯 UI 组层级

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

| 组名 | 深度值 | 描述 |
|------|--------|------|
| System | -35 | 系统顶级界面 |
| Notify | -30 | 通知界面 |
| Loading | -25 | 加载界面 |
| Dialogue | -23 | 对话界面 |
| BlackBoard | -22 | 黑板界面 |
| Guide | -20 | 引导界面 |
| Tip | -15 | 提示界面 |
| Window | -10 | 窗口界面 |
| Fixed | 0 | 固定界面 |
| Normal | 10 | 普通界面 |
| Floor | 15 | 底板界面 |
| Map | 20 | 地图界面 |
| Hud | 22 | 头顶界面 |
| Battle | 25 | 战斗界面 |
| World | 27 | 世界界面 |
| Scene | 30 | 场景界面 |
| Background | 35 | 背景界面 |
| Hidden | 40 | 隐藏界面 |

## 📡 事件系统

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

### 事件类型

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

### 事件订阅示例

```csharp
// 订阅 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 资源命名规范

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

### 2. UI 数据传递

```csharp
// 使用强类型数据类
public class ShopUIData
{
public int PlayerId { get; set; }
public List 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 性能优化

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

## 📝 示例代码

### 完整的 UI 窗体示例

```csharp
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 管理器使用示例

```csharp
public class UIManager : MonoBehaviour
{
private UIComponent uiComponent;

private void Start()
{
uiComponent = GameEntry.GetComponent();

// 配置 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](CHANGELOG.md) 了解详细的版本历史。

## 📄 许可证

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

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📞 联系方式

- 文档地址: https://gameframex.doc.alianblank.com
- 作者: Blank (alianblank@outlook.com)
- 仓库地址: https://github.com/gameframex/com.gameframex.unity.ui

---

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