一个功能强大、易于使用的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
| - Addressables (1.19.19+),安装好后,创建好Addressable配置文件(否则提示:未找到Addressable Asset Settings!请确保项目已正确配置Addressables) - DOTween (HOTween v2)
|
2. 场景设置(自动化)
AnimaFlow UI提供了自动化的场景设置工具,可以一键创建完整的UI结构。
方法:使用编辑器菜单(推荐),也可手动
创建Canvas结构
1
| 菜单栏 → Tools → AnimaFlow UI → Create Canvas Structure
|
创建示例UI面板
1
| 菜单栏 → Tools → AnimaFlow UI → Create UI Panel Object
|
检查Addressable配置
1
| 菜单栏 → Tools → AnimaFlow UI → Check Addressable Assets
|
修复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
| UISingletonManager.Instance.ShowUI<UIMainPanel>("MainPanel", UILayer.SingleNormal);
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, MultipleTop, SingleNormal, SingleMessageBox, SingleTop, SingleTips, SingleGuide, SingleLoading, SingleAlert, WaitAnimation, }
|
2. UI动画系统配置
2.1 添加面板动画组件
步骤:
- 在Hierarchy中选择UI面板
- 点击Inspector中的
Add Component按钮
- 选择路径:
AnimaFlow UI → UIAnimation
功能:
- 配置面板的进入/退出动画
- 支持位移、缩放、透明度、旋转四种动画类型
- 提供5种预设动画效果(Smooth/Bouncy/Elastic/Fast/Dramatic)
2.2 添加动画事件监听器
步骤:
- 确保已添加UIAnimation组件
- 点击
Add Component
- 选择路径:
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 添加子组件动画
步骤:
- 在Hierarchy中选择UI子对象(如Button/Text)
- 点击
Add Component
- 选择路径:
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
| CloseUI<T>(string key, bool isOnce = true)
SwitchUI<T>(string key, UILayer layer, Action<T> onLoadedAction = null, bool isLoadedActionFirst = false)
|
销毁UI
1 2 3 4 5
| DestroyUI(string key)
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
| public class MyUI : UIBase { }
public class MyMultiUI : UIBaseMultiple { }
public class MySingletonUI : UIBaseSingleton<MySingletonUI> { }
|
新增功能
可见性属性:
1 2
| public bool GetVisibility { get; }
|
简单显示/隐藏方法:
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
| public void OnEnterAction()
public void OnExitAction(System.Action onComplete = null)
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() { 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, 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() { Vector3 screenPos = uiCamera.WorldToScreenPoint(targetObject.position); if (screenPos.z > 0) { if (RectTransformUtility.ScreenPointToLocalPointInRectangle( canvasRect, screenPos, null, out Vector2 localPos)) { UIMultiInstanceManager.Instance.ShowUI<WorldTrackingUIPanel>( "WorldTrackingUIPanel", "TrackID", UILayer.MultipleTop, ui => { ui.worldTarget = targetObject; ui.canvasRectTrans = canvasRect; ui.CustomAheadParmater(localPos, localPos); }, true); } } } }
|
最佳实践
1. 资源管理
1 2 3 4 5 6 7 8 9 10
| public class GameManager : MonoBehaviour { private void OnDestroy() { UISingletonManager.Instance.DestroyAllUI(); UIMultilnstanceManager.Instance.DestroyAllUI(); } }
|
2. 性能优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class TipManager : MonoBehaviour { private void ShowTemporaryTip(string message) { UIMultiInstanceManager.Instance.ShowUI<UITipPanel>("TipPanel", GetNextId(), UILayer.SingleTips, (ui) => ui.SetMessage(message)); } private int GetNextId() { return Time.frameCount % 1000; } }
|
3. 错误处理
1 2 3 4 5 6 7 8 9 10 11 12
| 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
| 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=文件名
示例场景使用指南
可用示例场景
SingleAndMultiple - 单例和多实例UI示例
- 演示基本的单例UI和多实例UI使用
- 展示不同层级的UI管理
No Components - 无组件动画示例
- 演示不使用动画组件的UI面板
- 纯代码驱动的动画效果
SubcomponentAnim - 子组件动画示例
- 演示子组件独立动画
- 展示父组件控制子组件动画的时机
AnimationEvent - 动画事件示例
- 演示动画事件监听
- 展示在动画开始/完成时触发自定义逻辑
WorldTracking - 世界空间UI跟踪示例
- 演示UI跟随3D物体的功能
- 支持固定位置和跟踪模式
配置步骤
导入示例包:
配置Addressables:
- 运行菜单:
- 1.Tools →AnimaFlow UI → Check Addressable Assets`
- 2.Tools → AnimaFlow UI → Fix Addressable Assets`
- 3.Tools →
AnimaFlow UI → Sample Setup Panel Addressables
测试功能:
自定义修改:
- 通过Path UI Crawler调整组件绑定
- 修改UIAnimationConfig调整动画效果
世界空间UI跟踪功能详解
WorldTrackingUIPanel 提供了UI跟随3D物体的功能,适用于:
核心功能:
1 2 3 4 5 6 7 8 9
| ui.worldTarget = targetTransform; ui.canvasRectTrans = canvasRect;
UIMultiInstanceManager.Instance.ShowUI<WorldTrackingUIPanel>("WorldTrackingUIPanel", "A", UILayer.MultipleTop, ui => { ui.CustomAheadParmater(enterPos, exitPos); }, true);
|
两种模式:
- 跟踪模式:UI实时跟随3D物体移动
- 固定模式: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() { }
|
高级配置选项
自定义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 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, CustomLayer2, }
|
常见问题
Q: 如何解决UI重复加载的问题?
A: 框架内置了防重复加载机制,使用isOnce参数控制:
1 2 3
| UISingletonManager.Instance.ShowUI<UIMainPanel>("MainPanel", UILayer.SingleNormal, null, false, true);
|
Q: 如何自定义UI动画?
A: 有两种方式:
- 使用UIAnimationConfig组件在Inspector中配置
- 在代码中创建UIAnimationParameter对象
Q: 如何处理UI层级冲突?
A: 框架会自动处理同层级UI的互斥显示,你也可以手动控制:
1 2
| uiBase.transform.SetAsLastSibling();
|
Q: 如何优化UI性能?
A:
- 使用对象池管理频繁显示的UI
- 合理设置UI层级,避免不必要的重绘
- 利用异步加载和等待动画
- 及时销毁不使用的UI
- 使用SetSimpleShow/SetSimpleClose避免动画开销
- 子组件动画支持独立控制,可按需启用
Q: 子组件动画如何工作?
A:
- 添加UIComponentAnimation组件到子对象
- 设置EnableParentControl为true启用父组件控制
- 选择触发时机(OnEnterStart/OnEnterCompleted/OnExitStart/OnExitCompleted)
- 可以通过Parent Component Control控制自动禁用/启用交互
- 子组件动画可以独立调用PlayEnterAnimation/PlayExitAnimation
Q: 编辑器工具无法正常工作怎么办?
A:
- 检查Unity版本:确保使用Unity 2020.3+版本
- 检查Addressables包:确保已安装Addressables包
- 重新导入包:删除并重新导入AnimaFlow UI包
- 检查菜单项:确保Unity菜单栏出现”AnimaFlow UI”菜单项
- 查看控制台日志:编辑器工具会输出详细的调试信息
Q: UILoginAnimation配置失败怎么办?
A:
- 运行菜单:”AnimaFlow UI → Fix Addressable Assets”
- 手动检查:确保UILoginAnimation预设体存在
- Addressables配置:确认预设体已添加到Addressables,key为”UILoginAnimation”
- 资源类型:确保配置为本地资源而非远程资源
Q: Canvas创建失败或层级错误怎么办?
A:
- 删除现有Canvas:先删除场景中的Canvas和EventSystem
- 重新创建:运行”AnimaFlow UI → Create Canvas Structure”
- 层级检查:确认所有UILAYER枚举值对应的层级都已创建
- 手动修复:如果自动创建失败,可以手动创建Canvas和层级
Q: 编辑器启动时检查失败怎么办?
A:
- 忽略警告:如果项目配置正确,可以忽略启动检查警告
- 手动修复:运行”AnimaFlow UI → Fix Addressable Assets”
- 禁用自动检查:如果需要,可以注释掉AutoCheckOnStartup方法
技术支持
快速入门流程
1 2 3 4 5 6 7 8 9 10
| [InitializeOnLoadMethod] public static void InitializeAnimaFlowUI() { CreateCanvasStructureEditor.CreateCanvasStructure(); UIAddressableAssetChecker.CheckAddressableAssets(); }
|
批量操作示例
1 2 3 4 5 6 7 8
| public static void CreateMultipleUIPanels() { CreateCanvasStructureEditor.CreateUIPanelExample(); }
|
自定义配置修改
如果你需要修改默认配置,可以直接编辑相应的编辑器脚本:
- 修改Canvas分辨率:编辑
CreateCanvasStructureEditor.cs中的referenceResolution
- 修改UI层级:编辑
UILAYER.cs枚举定义
- 修改动画预设:编辑
UIAnimation.cs中的预设参数
调试技巧
- 查看控制台日志:所有编辑器操作都有详细的日志输出
- 使用断点调试:可以在编辑器脚本中设置断点进行调试
- 验证配置:使用”AnimaFlow UI → Check Addressable Assets”验证配置
- 手动测试:创建测试场景验证UI功能正常
Q: 编辑器工具无法正常工作怎么办?
A:
- 检查Unity版本:确保使用Unity 2020.3+版本
- 检查Addressables包:确保已安装Addressables包
- 重新导入包:删除并重新导入AnimaFlow UI包
- 检查菜单项:确保Unity菜单栏出现”AnimaFlow UI”菜单项
- 查看控制台日志:编辑器工具会输出详细的调试信息
Q: UILoginAnimation配置失败怎么办?
A:
- 运行菜单:”AnimaFlow UI → Fix Addressable Assets”
- 手动检查:确保UILoginAnimation预设体存在
- Addressables配置:确认预设体已添加到Addressables,key为”UILoginAnimation”
- 资源类型:确保配置为本地资源而非远程资源
Q: Canvas创建失败或层级错误怎么办?
A:
- 删除现有Canvas:先删除场景中的Canvas和EventSystem
- 重新创建:运行”AnimaFlow UI → Create Canvas Structure”
- 层级检查:确认所有UILAYER枚举值对应的层级都已创建
- 手动修复:如果自动创建失败,可以手动创建Canvas和层级
Q: 编辑器启动时检查失败怎么办?
A:
- 忽略警告:如果项目配置正确,可以忽略启动检查警告
- 手动修复:运行”AnimaFlow UI → Fix Addressable Assets”
- 禁用自动检查:如果需要,可以注释掉AutoCheckOnStartup方法
技术支持
如果你在使用过程中遇到问题,可以通过以下方式获取帮助:
- 查看示例场景: 在
Assets/AnimaFlowUI/Samples/中查看完整示例
- API文档: 参考本文档的API部分
- 作者博客: https://iamzhai.github.io/
- 联系邮箱: zhaijianwei502@163.com
AnimaFlow UI - 让UI开发变得更简单!