AnimaFlow UI

一个功能强大、易于使用的Unity UI管理和动画框架

目录

框架概述

AnimaFlow UI是一个专为Unity开发的UI管理框架,提供完整的UI生命周期管理、丰富的动画效果和性能优化。

主要特性

  • 双模式管理: 支持单例UI和多重实例UI
  • 丰富动画: 位移、缩放、透明度、旋转四种动画类型
  • 智能资源管理: 集成Addressables,支持对象池
  • 层级管理: 完善的UI层级系统,支持等待动画
  • 性能优化: 异步加载、内存管理、防重复加载

依赖项

  • Unity 2020.3+
  • DOTween (HOTween v2)(require)
  • Addressables (require)
  • TextMesh Pro (require)

快速开始

1. 环境配置

确保项目中已安装以下包:

1
2
3
// Package Manager中安装
- Addressables (1.19.19+),安装好后,创建好Addressable配置文件(否则提示:未找到Addressable Asset Settings!请确保项目已正确配置Addressables)
- DOTween (HOTween v2)

2. 场景设置(自动化)

AnimaFlow UI提供了自动化的场景设置工具,可以一键创建完整的UI结构。

方法:使用编辑器菜单(推荐),也可手动

  1. 创建Canvas结构

    1
    菜单栏 → Tools → AnimaFlow UI → Create Canvas Structure
  2. 创建示例UI面板

    1
    菜单栏 → Tools → AnimaFlow UI → Create UI Panel Object
  3. 检查Addressable配置

    1
    菜单栏 → Tools → AnimaFlow UI → Check Addressable Assets
  4. 修复Addressable配置(如果需要)

    1
    菜单栏 → Tools → AnimaFlow UI → Fix Addressable Assets

自动创建的功能包括:

完整的Canvas层级结构

  • Screen Space Overlay渲染模式
  • Canvas Scaler适配不同分辨率
  • Graphic Raycaster用于UI交互

9个标准UI层级

  • MultipleBase/MultipleTop(多实例层)
  • SingleNormal/SingleTop(单例层)
  • SingleMessageBox/SingleTips(消息提示层)
  • SingleGuide/SingleLoading(引导加载层)
  • SingleAlert(最高紧急层)
  • WaitAnimation(等待动画层)

EventSystem自动创建

  • 完整的输入事件系统
  • 支持鼠标、触摸、键盘输入

Addressable资源检查

  • 自动验证UILoginAnimation配置
  • 支持一键修复配置问题
  • 编辑器启动时自动检查

3. 基本使用

UIMainPanel、UITipPanel为面板的绑定脚本

MainPanel、TipPanel为Addressable中的Key

1
2
3
4
5
// 显示单例UI
UISingletonManager.Instance.ShowUI<UIMainPanel>("MainPanel", UILayer.SingleNormal);

// 显示多实例UI
UIMultiInstanceManager.Instance.ShowUI<UITipPanel>("TipPanel", 1, UILayer.MultipleTop);

核心功能

1. UI层级系统 (UILayer)

1
2
3
4
5
6
7
8
9
10
11
12
13
public enum UILayer
{
MultipleBase,// 多层基础UI
MultipleTop,// 多层顶层UI
SingleNormal, // 基础UI层(最低层级)
SingleMessageBox, // 消息对话框
SingleTop, // 常驻顶层UI
SingleTips, // 临时提示
SingleGuide, // 新手引导
SingleLoading, // 加载界面
SingleAlert, // 最高层级(紧急通知)
WaitAnimation, // 显示加载动画
}

2. UI动画系统配置

2.1 添加面板动画组件

步骤

  1. 在Hierarchy中选择UI面板
  2. 点击Inspector中的Add Component按钮
  3. 选择路径:AnimaFlow UI → UIAnimation

功能

  • 配置面板的进入/退出动画
  • 支持位移、缩放、透明度、旋转四种动画类型
  • 提供5种预设动画效果(Smooth/Bouncy/Elastic/Fast/Dramatic)

2.2 添加动画事件监听器

步骤

  1. 确保已添加UIAnimation组件
  2. 点击Add Component
  3. 选择路径:AnimaFlow UI → UIAnimationEvent

功能

  • 监听动画开始/结束事件
  • 可绑定自定义逻辑(如:播放音效、触发后续动画)

事件类型

1
2
3
4
5
6
7
8
9
10
11
// 进入动画开始
public UnityEvent OnEnterStart;

// 进入动画完成
public UnityEvent OnEnterComplete;

// 退出动画开始
public UnityEvent OnExitStart;

// 退出动画完成
public UnityEvent OnExitComplete;

2.3 添加子组件动画

步骤

  1. 在Hierarchy中选择UI子对象(如Button/Text)
  2. 点击Add Component
  3. 选择路径:AnimaFlow UI → UIComponentAnimation

功能

  • 为子对象单独配置动画效果
  • 子对象可以通过配置调用
  • 子对象动画也可以主动调用
  • 支持父组件控制(通过Parent Component Control设置)
  • 支持Canvas Group交互控制

调用示例

1
2
3
4
5
6
7
8
// 进入动画定义
UIComponentAnimationConfig.PlayEnterAnimation();
//调用:
gameObject.GetComponent<UIComponentAnimation>().PlayEnterAnimation();
// 退出动画定义
UIComponentAnimationConfig.PlayExitAnimation();
//调用:
gameObject.GetComponent<UIComponentAnimation>().PlayExitAnimation();

父组件控制触发时机

1
2
3
4
5
6
7
public enum UIParentAnimationTrigger
{
OnEnterStart, // 面板进入动画开始时触发
OnEnterCompleted, // 面板进入动画完成时触发
OnExitStart, // 面板退出动画开始时触发
OnExitCompleted // 面板退出动画完成时触发
}

2.4 动画组件关系图

1
2
3
4
5
6
7
8
9
10
11
12
13
┌──────────────────────┐
│ UI面板 (GameObject) │
│ │
│ ● UIAnimation │ ← 面板主动画
│ ● UIAnimationEvent │ ← 面板动画事件
│ │
│ ┌──────────────────┐ │
│ │ Button子对象 │ │
│ │ │ │
│ │ ● UIComponent │ │ ← 子组件独立动画
│ │ Animation │ │
│ └──────────────────┘ │
└───────────────────────┘

动画系统

预设动画类型

  • Simple: 简单动画(位移+缩放)
  • Smooth: 平滑过渡
  • Bouncy: 弹性效果
  • Elastic: 弹性动画
  • Fast: 快速动画
  • Dramatic: 戏剧化效果
  • Slide: 滑动效果
  • FadeSlide: 渐变滑动效果
  • NoAnimation: 无动画

API文档

UISingletonManager - 单例UI管理器

显示UI

1
2
3
4
5
6
// 基本显示
ShowUI<T>(string key, UILayer layer)

// 完整参数
ShowUI<T>(string key, UILayer layer, Action<T> onLoadedAction,
bool isLoadedActionFirst = false, bool isOnce = true)

关闭UI

1
2
3
4
5
6
// 关闭UI
CloseUI<T>(string key, bool isOnce = true)

// 切换UI显示状态
SwitchUI<T>(string key, UILayer layer, Action<T> onLoadedAction = null,
bool isLoadedActionFirst = false)

销毁UI

1
2
3
4
5
// 销毁单个UI
DestroyUI(string key)

// 销毁所有UI
DestroyAllUI()

UIMultiInstanceManager - 多实例UI管理器

显示多实例UI

1
2
3
4
5
6
7
// 显示单个实例
ShowUI<T>(string key, int id, UILayer layer, Action<T> onLoadedAction = null,
bool isLoadedActionFirst = false, bool isOnce = true)

// 批量显示实例
ShowMultipleUI<T>(string key, IEnumerable<int> ids, UILayer layer,
Action<T, int> onLoadedAction = null)

实例管理

1
2
3
4
5
6
// 获取实例
GetUI<T>(string key, int id)
TryGetUI<T>(string key, int id, out T uiBase)

// 检查实例
HasInstance(string key, int id)

UIBase - UI抽象基类(不能直接继承)

UIBase类是一个抽象基类,提供了UI的核心动画功能和生命周期管理。重要:不能直接继承UIBase类,必须选择继承UIBaseMultiple或UIBaseSingleton。

继承关系说明

1
2
3
4
5
6
7
8
// 错误:直接继承UIBase
public class MyUI : UIBase { } // 不允许!

// 正确:继承UIBaseMultiple(多实例UI)
public class MyMultiUI : UIBaseMultiple { }

// 正确:继承UIBaseSingleton<T>(单例UI)
public class MySingletonUI : UIBaseSingleton<MySingletonUI> { }

新增功能

可见性属性

1
2
public bool GetVisibility { get; }
// 返回UI是否真正可见(基于CanvasGroup.alpha或activeSelf)

简单显示/隐藏方法

1
2
3
4
5
// 简单显示(无动画)
protected void SetSimpleShow()

// 简单隐藏(无动画)
protected void SetSimpleClose()

动画回调

1
2
3
4
5
6
7
// 退出动画完成回调
protected System.Action onExitComplete;

// 使用示例:
OnExitAction(() => {
Debug.Log("退出动画完成");
});

基础功能

1
2
3
4
5
6
7
8
// 显示UI
public void OnEnterAction()

// 隐藏UI(支持完成回调)
public void OnExitAction(System.Action onComplete = null)

// 刷新UI
public virtual void Refresh(string strMsg = null)

动画控制

1
2
3
4
5
6
7
// 预设动画
protected void DirectionToCenter(UIAnimationDirection direction)
protected void CenterToDirection(UIAnimationDirection direction)

// 自定义动画
protected void CustomToCenter(UIAnimationParameter animationParameter)
protected void CenterToCustom(UIAnimationParameter animationParameter)

UIAnimation - 动画配置组件

属性配置

1
2
3
4
5
6
7
8
// 预设
public AnimationPreset Preset { get; set; }

// 动画参数
public float OffsetX { get; }
public float OffsetY { get; }
public bool EnablePositionEnterAnimation { get; }
// ... 更多属性

公共方法

1
2
3
4
5
// 应用预设
public void ApplyPreset(AnimationPreset preset)

// 停止动画
public void StopAnimation()

示例代码

基本UI使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class GameManager : MonoBehaviour
{
private void Start()
{
// 显示主菜单
UISingletonManager.Instance.ShowUI<UIMainPanel>("MainPanel", UILayer.SingleNormal);
}

private void ShowTip()
{
// 显示提示框(多实例)
UIMultiInstanceManager.Instance.ShowUI<UITipPanel>("TipPanel", 1, UILayer.MultipleTop,
(ui) => ui.SetMessage("Hello World!"));
}

private void CloseTip()
{
// 关闭提示框
UIMultilnstanceManager.Instance.CloseUI("TipPanel", 1);
}
}

自定义UI类

单例UI示例(继承UIBaseSingleton)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class UIMainPanel : UIBaseSingleton<UIMainPanel>
{
[SerializeField] private Text titleText;
[SerializeField] private Button startButton;

protected override void Start()
{
base.Start();

// 设置按钮事件
startButton.onClick.AddListener(OnStartClicked);
}

private void OnStartClicked()
{
// 隐藏当前面板
OnExitAction();

// 显示游戏界面
UISingletonManager.Instance.ShowUI<UIGamePanel>("GamePanel", UILayer.SingleNormal);
}

public override void Refresh(string strMsg = null)
{
if (!string.IsNullOrEmpty(strMsg))
{
titleText.text = strMsg;
}
}

protected override void PlayAppearAnimation()
{
// 自定义进入动画
DirectionToCenter(UIAnimationDirection.Top);
}
}

多实例UI示例(继承UIBaseMultiple)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class UITipPanel : UIBaseMultiple
{
[SerializeField] private Text tipText;
[SerializeField] private Button closeButton;

public override void InitializeComponent()
{
base.InitializeComponent();

// 设置关闭按钮事件
closeButton.onClick.AddListener(() => OnExitAction());
}

public void SetMessage(string message)
{
if (tipText != null)
{
tipText.text = message;
}
}

public override void Refresh(string strMsg = null)
{
if (!string.IsNullOrEmpty(strMsg))
{
SetMessage(strMsg);
}
}

protected override void PlayAppearAnimation()
{
// 多实例UI使用弹性动画
DirectionToCenter(UIAnimationDirection.Top);
}
}

动画配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class CustomAnimationUI : UIBaseSingleton<CustomAnimationUI>
{
protected override void PlayAppearAnimation()
{
// 创建自定义动画参数
var animParams = new UIAnimationParameter
{
EnablePositionEnterAnimation = true,
AppearDirection = UIAnimationDirection.Random,
AppearEase = AnimaFlowEase.OutBack,

EnableScaleEnterAnimation = true,
ScaleFrom = 0.5f,
ScaleTo = 1f,
AppearScaleEase = AnimaFlowEase.OutElastic,

AppearDuration = 1.0f
};

// 应用自定义动画
CustomToCenter(animParams);
}
}

使用自定义位置动画

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CustomPositionUI : UIBaseSingleton<CustomPositionUI>
{
protected override void PlayAppearAnimation()
{
// 创建自定义位置动画参数
var animParams = new UIAnimationParameter
{
UseCustomPositions = true,
EnterPosition = new Vector2(-500, 0), // 从左侧进入
DisplayPosition = Vector2.zero, // 显示在中心
ExitPosition = new Vector2(500, 0), // 向右侧退出

EnablePositionEnterAnimation = true,
EnablePositionExitAnimation = true,
AppearDuration = 0.5f,
DisappearDuration = 0.5f
};

// 应用自定义位置动画
CustomToCenter(animParams);
}
}

使用自定义缓动曲线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class CustomCurveUI : UIBaseSingleton<CustomCurveUI>
{
protected override void PlayAppearAnimation()
{
// 创建自定义动画曲线
AnimationCurve customCurve = new AnimationCurve(
new Keyframe(0, 0, 0, 2),
new Keyframe(0.5f, 0.8f, 2, -1),
new Keyframe(1, 1, -1, 0)
);

// 创建使用自定义曲线的动画参数
var animParams = new UIAnimationParameter
{
EnablePositionEnterAnimation = true,
AppearDirection = UIAnimationDirection.Top,
AppearEase = AnimaFlowEase.Custom, // 必须设置为Custom
AppearCurve = customCurve, // 提供自定义曲线

EnableScaleEnterAnimation = true,
ScaleFrom = 0.1f,
ScaleTo = 1f,
AppearScaleEase = AnimaFlowEase.Custom,
AppearScaleCurve = customCurve,

AppearDuration = 0.75f
};

CustomToCenter(animParams);
}
}

世界空间UI跟踪示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class WorldTrackingExample : MonoBehaviour
{
public Transform targetObject;
public RectTransform canvasRect;
private Camera uiCamera;

void Start()
{
uiCamera = Camera.main;
}

public void ShowTrackingUI()
{
// 将3D世界坐标转换为屏幕坐标
Vector3 screenPos = uiCamera.WorldToScreenPoint(targetObject.position);

if (screenPos.z > 0) // 确保物体在相机前方
{
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
canvasRect, screenPos, null, out Vector2 localPos))
{
// 使用自定义位置参数显示UI
UIMultiInstanceManager.Instance.ShowUI<WorldTrackingUIPanel>(
"WorldTrackingUIPanel",
"TrackID",
UILayer.MultipleTop,
ui =>
{
ui.worldTarget = targetObject;
ui.canvasRectTrans = canvasRect;
ui.CustomAheadParmater(localPos, localPos); // 设置进入和退出位置
},
true); // isLoadedActionFirst=true确保位置设置后再播放动画
}
}
}
}

最佳实践

1. 资源管理

1
2
3
4
5
6
7
8
9
10
// 正确使用Addressables
public class GameManager : MonoBehaviour
{
private void OnDestroy()
{
// 清理UI资源
UISingletonManager.Instance.DestroyAllUI();
UIMultilnstanceManager.Instance.DestroyAllUI();
}
}

2. 性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 使用对象池管理频繁显示的UI
public class TipManager : MonoBehaviour
{
private void ShowTemporaryTip(string message)
{
// 使用对象池显示提示
UIMultiInstanceManager.Instance.ShowUI<UITipPanel>("TipPanel", GetNextId(),
UILayer.SingleTips, (ui) => ui.SetMessage(message));
}

private int GetNextId()
{
// 实现ID生成逻辑
return Time.frameCount % 1000;
}
}

3. 错误处理

1
2
3
4
5
6
7
8
9
10
11
12
// 安全的UI操作
public void SafeShowUI(string key)
{
try
{
UISingletonManager.Instance.ShowUI<UIBase>(key, UILayer.SingleNormal);
}
catch (Exception e)
{
Debug.LogError($"Failed to show UI {key}: {e.Message}");
}
}

编辑器工具详解

1. Check Addressable AssetsFix

功能

  • 检查场景中UILoginAnimation预设体的Addressable配置
  • 自动修复配置问题(Key=”UILoginAnimation”)

使用方法

1
2
3
4
5
6
7
// 代码调用
UIAddressableAssetChecker.CheckAddressableAssets();
UIAddressableAssetChecker.FixAddressableAssets();

// 菜单路径
AnimaFlow UI → Check Addressable Assets
AnimaFlow UI → Fix Addressable Assets

2. Create Canvas Structure

功能

  • 在新场景中创建标准Canvas层级结构
  • 包含9个预设层级(UILayer枚举)
  • 自动配置Canvas Scaler和EventSystem

使用方法

1
2
3
4
5
// 代码调用
CreateCanvasStructureEditor.CreateCanvasStructure();

// 菜单路径
AnimaFlow UI → Create Canvas Structure

3. Create UI Panel Object

功能

  • 在指定层级创建示例UI面板
  • 自动添加RectTransform、CanvasGroup等组件

使用方法

1
2
3
4
5
// 代码调用
CreateCanvasStructureEditor.CreateUIPanelExample();

// 菜单路径
AnimaFlow UI → Create UI Panel Object

4. Create UI Panel Script

功能

  • 生成UI脚本模板(支持单例/多实例)
  • 自动添加基础生命周期方法

代码模板示例

1
2
3
4
5
6
7
8
9
// 单例UI模板
public class NewUIPanel : UIBaseSingleton<NewUIPanel>
{
protected override void Start()
{
base.Start();
// 添加你的初始化代码
}
}

5. Path UI Crawler V1.0

功能

  • 可视化拖拽绑定UI组件
  • 生成组件引用代码(在多人协同开发中,热更新开发中,大部分使用代码绑定事件)

示例

1
2
3
// 自动生成的绑定代码
[SerializeField] private Button submitButton;
[SerializeField] private Text titleText;

6. Sample Setup Panel Addressables

功能

  • 批量设置示例场景中预设体的Addressable Key
  • 确保所有示例资源可正确加载

配置规则

  • 关键资源Key=”UILoginAnimation”
  • 其他资源Key=文件名

示例场景使用指南

可用示例场景

  1. SingleAndMultiple - 单例和多实例UI示例

    • 演示基本的单例UI和多实例UI使用
    • 展示不同层级的UI管理
  2. No Components - 无组件动画示例

    • 演示不使用动画组件的UI面板
    • 纯代码驱动的动画效果
  3. SubcomponentAnim - 子组件动画示例

    • 演示子组件独立动画
    • 展示父组件控制子组件动画的时机
  4. AnimationEvent - 动画事件示例

    • 演示动画事件监听
    • 展示在动画开始/完成时触发自定义逻辑
  5. WorldTracking - 世界空间UI跟踪示例

    • 演示UI跟随3D物体的功能
    • 支持固定位置和跟踪模式

配置步骤

  1. 导入示例包

    • 从Samples目录导入示例场景
  2. 配置Addressables

    • 运行菜单:
    • 1.Tools →AnimaFlow UI → Check Addressable Assets`
    • 2.Tools → AnimaFlow UI → Fix Addressable Assets`
    • 3.Tools → AnimaFlow UI → Sample Setup Panel Addressables
  3. 测试功能

    • 运行示例场景验证UI加载和动画效果
  4. 自定义修改

    • 通过Path UI Crawler调整组件绑定
    • 修改UIAnimationConfig调整动画效果

世界空间UI跟踪功能详解

WorldTrackingUIPanel 提供了UI跟随3D物体的功能,适用于:

  • 角色头顶名称显示
  • 物体选中高亮
  • NPC对话提示框

核心功能

1
2
3
4
5
6
7
8
9
// 设置UI跟随目标
ui.worldTarget = targetTransform;
ui.canvasRectTrans = canvasRect;

// 使用自定义位置参数(isLoadedActionFirst=true确保动画播放前设置位置)
UIMultiInstanceManager.Instance.ShowUI<WorldTrackingUIPanel>("WorldTrackingUIPanel", "A", UILayer.MultipleTop, ui =>
{
ui.CustomAheadParmater(enterPos, exitPos);
}, true);

两种模式

  1. 跟踪模式:UI实时跟随3D物体移动
  2. 固定模式:UI在固定位置显示

注意事项

  • 需要正确设置UI Camera
  • Canvas使用Screen Space Overlay模式
  • 物体必须在相机前方(z > 0)

智能特性

  • 自动检测现有Canvas:如果场景中已有Canvas,会询问是否使用现有Canvas
  • 完整的UI层级创建:基于UILAYER枚举自动创建所有层级
  • EventSystem自动设置:确保输入系统正常工作
  • Canvas优化配置
    • Screen Space Overlay渲染模式
    • Canvas Scaler自适应分辨率(1920×1080基准)
    • Graphic Raycaster UI交互支持

UIAddressableAssetChecker 类

功能:检查和修复Addressable资源配置

使用方法

1
2
3
4
5
// 检查配置
UIAddressableAssetChecker.CheckAddressableAssets();

// 修复配置
UIAddressableAssetChecker.FixAddressableAssets();

检查项目

  • UILoginAnimation预设体存在性:确保关键资源存在
  • Addressable Key验证:检查”UILoginAnimation” key是否正确
  • 资源类型检查:确保配置为本地资源而非远程资源
  • 自动修复功能:支持一键修复配置问题

自动启动检查

框架会在编辑器启动时自动检查关键配置:

1
2
3
4
5
6
[InitializeOnLoadMethod]
private static void AutoCheckOnStartup()
{
// 自动检查UILoginAnimation配置
// 发现问题时会给出修复建议
}

高级配置选项

自定义Canvas创建

如果你需要自定义Canvas配置,可以修改源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static Canvas CreateNewCanvas()
{
GameObject canvasGO = new GameObject("Canvas");
Canvas canvas = canvasGO.AddComponent<Canvas>();

// 自定义渲染模式
canvas.renderMode = RenderMode.ScreenSpaceCamera; // 可以修改

// 自定义CanvasScaler
CanvasScaler scaler = canvasGO.AddComponent<CanvasScaler>();
scaler.referenceResolution = new Vector2(1334, 750); // 自定义分辨率

return canvas;
}

自定义UI层级

要添加自定义UI层级,需要修改UILAYER枚举:

1
2
3
4
5
6
7
8
public enum UILAYER
{
// 原有层级...

// 添加自定义层级
CustomLayer1, // 自定义层级1
CustomLayer2, // 自定义层级2
}

常见问题

Q: 如何解决UI重复加载的问题?

A: 框架内置了防重复加载机制,使用isOnce参数控制:

1
2
3
// 确保UI只显示一次
UISingletonManager.Instance.ShowUI<UIMainPanel>("MainPanel", UILayer.SingleNormal,
null, false, true); // isOnce = true

Q: 如何自定义UI动画?

A: 有两种方式:

  1. 使用UIAnimationConfig组件在Inspector中配置
  2. 在代码中创建UIAnimationParameter对象

Q: 如何处理UI层级冲突?

A: 框架会自动处理同层级UI的互斥显示,你也可以手动控制:

1
2
// 手动设置层级
uiBase.transform.SetAsLastSibling();

Q: 如何优化UI性能?

A:

  • 使用对象池管理频繁显示的UI
  • 合理设置UI层级,避免不必要的重绘
  • 利用异步加载和等待动画
  • 及时销毁不使用的UI
  • 使用SetSimpleShow/SetSimpleClose避免动画开销
  • 子组件动画支持独立控制,可按需启用

Q: 子组件动画如何工作?

A:

  1. 添加UIComponentAnimation组件到子对象
  2. 设置EnableParentControl为true启用父组件控制
  3. 选择触发时机(OnEnterStart/OnEnterCompleted/OnExitStart/OnExitCompleted)
  4. 可以通过Parent Component Control控制自动禁用/启用交互
  5. 子组件动画可以独立调用PlayEnterAnimation/PlayExitAnimation

Q: 编辑器工具无法正常工作怎么办?

A:

  1. 检查Unity版本:确保使用Unity 2020.3+版本
  2. 检查Addressables包:确保已安装Addressables包
  3. 重新导入包:删除并重新导入AnimaFlow UI包
  4. 检查菜单项:确保Unity菜单栏出现”AnimaFlow UI”菜单项
  5. 查看控制台日志:编辑器工具会输出详细的调试信息

Q: UILoginAnimation配置失败怎么办?

A:

  1. 运行菜单:”AnimaFlow UI → Fix Addressable Assets”
  2. 手动检查:确保UILoginAnimation预设体存在
  3. Addressables配置:确认预设体已添加到Addressables,key为”UILoginAnimation”
  4. 资源类型:确保配置为本地资源而非远程资源

Q: Canvas创建失败或层级错误怎么办?

A:

  1. 删除现有Canvas:先删除场景中的Canvas和EventSystem
  2. 重新创建:运行”AnimaFlow UI → Create Canvas Structure”
  3. 层级检查:确认所有UILAYER枚举值对应的层级都已创建
  4. 手动修复:如果自动创建失败,可以手动创建Canvas和层级

Q: 编辑器启动时检查失败怎么办?

A:

  1. 忽略警告:如果项目配置正确,可以忽略启动检查警告
  2. 手动修复:运行”AnimaFlow UI → Fix Addressable Assets”
  3. 禁用自动检查:如果需要,可以注释掉AutoCheckOnStartup方法

技术支持

快速入门流程

1
2
3
4
5
6
7
8
9
10
// 第一步:在项目初始化时调用
[InitializeOnLoadMethod]
public static void InitializeAnimaFlowUI()
{
// 1. 创建Canvas结构
CreateCanvasStructureEditor.CreateCanvasStructure();

// 2. 检查Addressables配置
UIAddressableAssetChecker.CheckAddressableAssets();
}

批量操作示例

1
2
3
4
5
6
7
8
// 批量创建UI面板示例
public static void CreateMultipleUIPanels()
{
// 创建主菜单面板
CreateCanvasStructureEditor.CreateUIPanelExample();

// 可以继续创建其他面板...
}

自定义配置修改

如果你需要修改默认配置,可以直接编辑相应的编辑器脚本:

  • 修改Canvas分辨率:编辑CreateCanvasStructureEditor.cs中的referenceResolution
  • 修改UI层级:编辑UILAYER.cs枚举定义
  • 修改动画预设:编辑UIAnimation.cs中的预设参数

调试技巧

  1. 查看控制台日志:所有编辑器操作都有详细的日志输出
  2. 使用断点调试:可以在编辑器脚本中设置断点进行调试
  3. 验证配置:使用”AnimaFlow UI → Check Addressable Assets”验证配置
  4. 手动测试:创建测试场景验证UI功能正常

Q: 编辑器工具无法正常工作怎么办?

A:

  1. 检查Unity版本:确保使用Unity 2020.3+版本
  2. 检查Addressables包:确保已安装Addressables包
  3. 重新导入包:删除并重新导入AnimaFlow UI包
  4. 检查菜单项:确保Unity菜单栏出现”AnimaFlow UI”菜单项
  5. 查看控制台日志:编辑器工具会输出详细的调试信息

Q: UILoginAnimation配置失败怎么办?

A:

  1. 运行菜单:”AnimaFlow UI → Fix Addressable Assets”
  2. 手动检查:确保UILoginAnimation预设体存在
  3. Addressables配置:确认预设体已添加到Addressables,key为”UILoginAnimation”
  4. 资源类型:确保配置为本地资源而非远程资源

Q: Canvas创建失败或层级错误怎么办?

A:

  1. 删除现有Canvas:先删除场景中的Canvas和EventSystem
  2. 重新创建:运行”AnimaFlow UI → Create Canvas Structure”
  3. 层级检查:确认所有UILAYER枚举值对应的层级都已创建
  4. 手动修复:如果自动创建失败,可以手动创建Canvas和层级

Q: 编辑器启动时检查失败怎么办?

A:

  1. 忽略警告:如果项目配置正确,可以忽略启动检查警告
  2. 手动修复:运行”AnimaFlow UI → Fix Addressable Assets”
  3. 禁用自动检查:如果需要,可以注释掉AutoCheckOnStartup方法

技术支持

如果你在使用过程中遇到问题,可以通过以下方式获取帮助:

  1. 查看示例场景: 在Assets/AnimaFlowUI/Samples/中查看完整示例
  2. API文档: 参考本文档的API部分
  3. 作者博客: https://iamzhai.github.io/
  4. 联系邮箱: zhaijianwei502@163.com

AnimaFlow UI - 让UI开发变得更简单!