六、使用说明
1. 安装
本工具是一个 Unity 编辑器扩展,直接用 Unity 打开所在项目即可,无需额外安装。把 UGUI_to_FairyGUI 文件夹放在 Assets 下任意位置均可被识别(通常放在 Assets/UGUI_to_FairyGUI)。
运行环境:Unity 编辑器内(在 Play 模式外使用)。
菜单入口(均在 SkyLad 菜单下):
- SkyLad / Export to FairyGUI:打开导出设置面板,执行导出。
- SkyLad / Deduplication Editor:打开组件去重编辑器,做结构分析、dup→rep 合并、类型指定等。
2. 前提条件
- 使用 Unity 2018.4 或更高版本(建议 2021 LTS 或 2022 LTS)。
- 已安装 FairyGUI 编辑器(用于打开导出的工程做后续编辑)。从 https://fairygui.com/ 下载。
- 待转换的 Prefab 中,图片资源位于 Assets/ 目录下任意位置即可(不需要放在特定子目录)。
- 若使用 TextMeshPro,确保项目的 TMP 包已导入(转换器会运行时检测 TMP 是否可用)。
3. 完整教程(逐步操作)
- 准备 Prefab 把要转换的 UGUI Prefab 整理到一个目录(例如 Assets/UI/Prefabs)。确保 Prefab 引用的图片在 Assets/ 下可访问。
- 打开设置面板 菜单 SkyLad / Export to FairyGUI,打开「FairyGUI 导出设置」窗口。
- 设置目录与项目类型默认 Prefab 根目录:设置后,每次导出将跳过目录选择步骤,直接使用此路径。
默认导出目录:设置后,导出将默认输出到该目录下的 FairyGUI 工程。
FairyGUI 项目类型:选择目标平台类型,对应 .fairy 文件中 projectDescription 的 type 属性。 也可不设置,导出时再在弹窗中选择目录。
- (可选)配置组件去重 菜单 SkyLad / Deduplication Editor,点击「分析所有组件」,生成去重分析结果(JSON)。在该编辑器里可以:查看并合并结构重复的组件(dup → rep);
为组件指定 FairyGUI 组件类型(如 Button / Slider / ComboBox 等);
设置是否「分析时自动给 Prefab 添加类型标记脚本」;
维护转换类型正则规则与 Prefab 跳过规则。 分析完成后,去重结果会自动作为导出时的权威配置。
- 执行导出 回到设置面板,点击「导出到 FairyGUI」。导出流程会:清理旧的导出目录(如开启了「清理导出的 FairyGUI 目录」);
扫描 Prefab 根目录下的所有 Prefab;
按配置做组件去重与子组件提取;
生成 FairyGUI 包结构与资源文件。 若发现同级同名 GameObject 且未开启「导出时重命名重复节点」,导出会中止并提示先修复重名(可用设置面板「修复重名」按钮)。
- 在 FairyGUI 中打开 用 FairyGUI 编辑器打开导出目录下的工程。由于 FairyGUI 的包名由工具管理生成,首次打开时请用 FairyGUI 生成所有 package 的唯一 id。
4. 资源与引用
- 图片位置:Prefab 引用的图片只需在 Assets/ 目录下任意位置即可,工具会按引用关系收集并拷贝,不要求放在特定目录(如 ResourcesData)。
- Unity 内置资源:来自 Unity 内置的 UI 精灵、默认贴图等虚拟资源不是磁盘真实文件,导出器会按像素渲染为 PNG 自动写出,无需手动替换(压缩纹理 / 图集打包的精灵可再核对导出质量)。
- Packages/ 与外部路径资源:这类资源当前版本不导出 PNG,需要你在 FairyGUI 里手动替换(后续可补自动导出)。
- 嵌套 Prefab:嵌套 Prefab 实例与 Button / Slider 等交互组件一视同仁,都是「组件边界」——递归提取为独立组件,父组件原位置只保留一个 <component src> 引用节点,不把子树内联复制进父组件。同一嵌套 Prefab 无论被多少个父组件引用,都只生成一份组件定义,多个引用指向它,跨实例共享去重;被引用组件内部的交互组件 / 列表也会继续递归提取去重。
七、组件映射
主要 UGUI 组件到 FairyGUI 的对应关系按功能分类如下:
基础显示
- Image → 图片(image)/ 图形(Graph):Simple/Sliced/Filled 分别映射;Sliced 转为 9grid。
- RawImage → 图片(Texture):按纹理引用导出。
- Text (Legacy) → 文本(TextField):含字体、颜色、富文本。
- TextMeshPro → 文本(TextField):运行时检测 TMP,转换为 FairyGUI 文本,字体回退到设置中的字体;描边/阴影按关键词识别。
交互组件
- Button → 按钮(Button):保留过渡效果(ColorTint / SpriteSwap),状态图标命名 icon / bg。
- Toggle → 按钮(Button, mode=Check):选中态图标(selectedIcon)取自 Toggle 的 graphic。
- Slider → 滑块(Slider):把手(grip)按规则定位,进度条(bar)建立关联。
- ScrollBar → 滚动条(ScrollBar):对应 FairyGUI 滚动条。
- ScrollRect → 滚动容器:转换为带 ScrollPane 的组件,不单独抽为组件。
- Dropdown → 下拉框(ComboBox):展开模板(Template)剥离为独立子组件。
- InputField → 文本输入(TextInput):对应 FairyGUI 文本输入。
容器 / 列表
- Horizontal/Vertical/Grid LayoutGroup → list:子项达到阈值时识别为 list,并提取为子组件。
遮罩 / 裁剪
- RectMask2D / Mask → 遮罩(Mask):两者共用同一套逻辑:作为独立组件边界提取(可配置),组件根设 overflow=hidden 近似矩形裁剪。Mask 的遮罩图(自身 Image)仅在 showMaskGraphic=false 时跳渲染。
顶层结构
- Canvas → 包(package):每个顶层 Prefab 对应一个 FairyGUI 组件。
八、导出设置面板配置项
设置面板(SkyLad / Export to FairyGUI)的所有配置以项目内 ScriptableObject 形式持久化在 Assets/UGUI_to_FairyGUI/Editor/FairyGUIExporterSettings.asset,按项目隔离、可进版本控制、团队共享。配置项按用途分组如下,括号内为代码字段名,末尾为默认值。
1. 目录与去重
- 默认 Prefab 根目录 (prefabRoot):设置后导出跳过目录选择,直接使用此路径。(默认:空)
- 默认导出目录 (exportDir):设置后导出默认输出到该目录。(默认:空)
- 清理导出的 FairyGUI 目录 (deleteFolders):每次导出前自动清理导出目录中的 image 和 component 文件夹。(默认:关闭)
- 组件去重 (enableStructuralDedup):启用后把重复 Prefab 合并为可复用组件;冗余实例引用代表组件(未指定时默认引用第一个)。(默认:开启)
- 导出时重命名重复节点 (renameDuplicateNodes):开启后,导出时发现同级同名 GameObject 自动加 _2 _3 后缀,避免导出中止。(默认:开启)
- FairyGUI 项目类型 (fairyProjectType):目标平台类型,对应 .fairy 的 type 属性。(默认:Unity)
- 工作区文件名 (dedupMapFileName):去重编辑器工作区 JSON 的文件名(不含后缀),默认 UGUI_to_FairyGUI_data.json。(默认:UGUI_to_FairyGUI_data)
- 加载去重编辑器工作区去重配置作为权威 (dedupLoadOverride):开启且配置含有效 dup→rep 映射时,直接以 JSON 的合并结果作为映射(跳过自动重算),并加载变体 / 转换类型 / 跳过规则。(默认:关闭)
- 组件去重编辑器导出目录 (dedupExportDir):去重编辑器 JSON 与导出产物的目录。(默认:空)
- Prefab 组件去重级别 (prefabDedupLevel):0=不排重, 1=仅结构, 2=结构+资源, 3=结构+名称, 4=全量。(默认:2,结构+资源)
- List 子项排重级别 (listItemDedupLevel):与 Prefab 组件去重级别逻辑一致。(默认:2)
- 自动检测 LayoutGroup 类型 (listAutoDetectFlags):勾选 Horizontal / Vertical / Grid;对应类型子对象达阈值时识别为 list。(默认:三者全开)
- 最小子对象数 (minListChildCount):子对象数量达到该值才识别为 list;不足时降级为普通 group。(默认:3)
- 启用变体合并 (enableVariantMerge):开启后,同一骨架、仅颜色/图标/内容/可见性/局部尺寸不同的变体组(list 子项 / 去重变体 / 手动分组)合并为单组件 + variant controller 区分表现;关闭则完全回退「每变体一个独立组件」。组内成员数不限。(默认:关闭)
2. 组件与渲染
- FairyGUI 字体名称 (fontName):导出文本使用的字体(如 Microsoft YaHei、Arial)。(默认:Microsoft YaHei)
- 单节点组件坐标归零 (setRootToZero):开启后,仅含一个根节点(无子节点)的组件在 FairyGUI 中 xy 固定为 0,0、尺寸=内容包围盒;关闭则保留原始绝对坐标。(默认:开启)
- 启用公共包提取 (enableCommonPackage):开启后被多包引用的共享资源归入公共包。(默认:关闭)
- 公共包包名 (commonPackageName):公共包的名称。(默认:Common)
- 组件边界提取(可选类型) (extractBoundaryMask):勾选 Slider / Scrollbar / Dropdown / InputField / Toggle / RectMask / Rotation(Z 轴旋转节点)作为独立组件提取。Button / Label / 嵌套组件 / List 强制常开,不可取消。(默认:全开)
- 导出调试日志 (enableDebugLog):开启后向 Unity 控制台打印逐元素/流程调试信息。写文件日志已彻底关闭,不受此开关控制。(默认:关闭)
3. 文本特效(TMP / 描边阴影)
- 文本描边默认宽度 (defaultStrokeSize):文本判定需描边但材质/组件未提供明确宽度时使用的宽度(下限 1)。(默认:1)
- 文本描边默认颜色 (defaultOutlineColor):描边回退色,强制不透明(alpha=255)。(默认:不透明黑)
- 文本阴影默认颜色 (defaultShadowColor):阴影回退色,强制不透明(alpha=255)。(默认:不透明黑)
- TMP 描边识别关键词 (tmpOutlineKeyword):当字体资源名/材质名/着色器名(小写)包含此关键词时,判定文本需要描边。(默认:outline)
- 进度文本自动命名模式 (titleNamingPatterns):逗号/分号分隔的子串列表;含多个文本子节点时按这些模式匹配节点名猜出唯一的 title(如 Slider/ProgressBar 的标题)。(默认:exp,value,progress,hp,mp,fill,num,count,rate,percent,title)
九、组件去重编辑器
菜单 SkyLad / Deduplication Editor 打开。它用于:
- 分析所有组件:扫描 Prefab 根目录,找出结构重复组件,生成去重 JSON(含 dup→rep 合并与组件类型 conversionType)。
- dup→rep 合并:在编辑器里把结构相同的组指定一个代表组件(rep),其余引用它。
- 组件类型指定:为组件设置目标 FairyGUI 类型(Button / Slider / ComboBox 等),可直接下拉选择,也可用下方正则规则批量匹配。
- 转换类型正则规则:一组「正则 → 类型」规则,按节点名批量指定组件类型,美术人员一般不关注(默认折叠)。
- Prefab 跳过规则:一组正则,匹配到的 Prefab(如 Fx_ 开头的特效)在导出时跳过。
- 类型标记机制:每个节点的 FGUI 类型在提取期一次性裁决——Prefab 上挂的 FguiTypeMarker 手动标记优先,否则按结构自动推导;导出阶段只读结果,不再区分 Prefab / Json 两路。可在去重编辑器或 Prefab 上手动指定类型。
- 分析时自动给 prefab 添加 fgui 类型标记脚本:开启后,每次「分析所有组件」会自动给类型决策点节点挂 FguiTypeMarker;关闭则分析不修改任何 Prefab 资产。默认关闭。
- 尺寸纳入去重指纹 (sizeAffectsDedup):关闭(默认)时去重只看结构 / 资源 / 名称,尺寸不同的同构组件仍合并为一个;开启后每个节点尺寸纳入指纹,仅尺寸不同的同构组件不再合并,各自单独导出。该开关同时作用于 Prefab 组件去重与 List 子项去重两条路径。
- 清空所有 FguiTypeMarker:移除 Prefab 上全部类型标记脚本。
分析完成后,去重 JSON 会作为导出时的权威配置(跳过自动重算),并在设置面板自动启用加载。
十、常见问题(FAQ)
Q:转换后是 100% 完美可用的 FairyGUI 工程吗? A:不是。转换器尽力保留布局与交互组件结构,但复杂布局、富文本、动画、事件、自定义 Shader 等需要你在 FairyGUI 编辑器里手动微调。把它当作「省去重建骨架」的起步,而不是最终成品。
Q:为什么要手动干预? A:UGUI 与 FairyGUI 的模型差异导致部分语义无法自动对应(例如 UGUI 的锚点拉伸 vs FairyGUI 的 relation、UnityEvent 事件 vs FairyGUI 事件系统)。这些只能由你在 FairyGUI 里补充。
Q:图片去哪了? A:图片按引用关系拷贝到导出目录的 image 文件夹下。只要原 Sprite 在 Assets/ 下可访问即可,不需放在特定目录。
Q:为什么有些组件没转成我想要的 FairyGUI 类型? A:组件类型默认按结构自动推导;可在 Prefab 上挂 FguiTypeMarker 手动指定,或在去重编辑器里指定类型进行覆写。
Q:转换过程会修改我的原始 Prefab 吗? A:默认不会。除非你开启了「分析时自动给 prefab 添加 fgui 类型标记脚本」,否则分析/导出只读取、不修改原始资产。开启自动标注后,标注器只给决策点节点挂标记、已存在标记不覆盖、不碰 JSON。
十一、注意事项
- 坐标与布局:UGUI 的锚点/偏移会转换为 FairyGUI 的绝对坐标 + relation。某些拉伸布局在转换后可能需要手动调整关联规则。
- 组件类型判定:list 由「LayoutGroup 类型匹配 + 子对象数量达阈值(默认 3)+ 至少有一个直接子节点自身非叶子 + 直接子项同质(结构粗签名一致,默认要求)」共同判定,否则降级为普通 group(如 icon/text/button 各司其职的控件行会因异质降级);如确需强制为 list,可在 Prefab 上用 FguiTypeMarker 标为 List。交互组件(Slider/Scrollbar/Dropdown/InputField/Toggle/RectMask)可配置是否独立提取,Button/Label/嵌套组件/List 强制按固定规则处理。
- 资源路径:图片只需在 Assets/ 下任意位置即可被收集拷贝;内置虚拟资源自动渲染为 PNG 写出;Packages/ 与外部路径资源当前不导出,需手动替换。
- 配置持久化:所有导出设置以项目内 ScriptableObject(FairyGUIExporterSettings.asset)保存,按项目隔离、可进版本控制、团队共享,不会写入机器级注册表、不会跨项目串台。首次使用以代码默认值(不自动标注、单节点归零开启等)开始。
- 调试日志:关闭「导出调试日志」时调试信息完全静默(仅向控制台打印,且不写文件),不会产生额外开销。
- 最低 .NET 4.0(API Compatibility Level ≥ .NET 4.x):本工具的 DLL 以 .NET 4.0 目标编译,要求宿主工程把 Player Settings → Other Settings → Api Compatibility Level 设为 .NET 4.x(而非 .NET 3.5)。若工程为 .NET 3.5,Unity 会拒绝加载该 DLL(报 Plugin targets .NET 4.x ... Editor can only use assemblies targeting .NET 3.5),菜单将不出现。升级到 .NET 4.x 是 Unity 2018.4 起官方推荐的做法,现有代码基本可平滑兼容。
- 多版本 DLL 自动选择(商店分发):商店包内含 3 个版本 DLL(Editor/DLLs/{2018,2019,2022}/Skylad.Core.dll),分别由 Unity 2018.4 / 2019.x / 2022.x 编译产出。导入包后,Editor/VersionSelector.cs 会按当前 Unity 版本自动启用「目录主版本号 ≤ 当前 Unity 主版本号」中最大的那个 DLL、禁用其余,确保 Unity 只加载一个(避免类型重复定义)。若自动选择异常,可手动删除 Editor/DLLs/ 下不匹配自己 Unity 版本的子目录。
十二、已知限制
- 导出并非 100% 完美,复杂界面通常需要在 FairyGUI 编辑器里手动微调。
- 字体:文本导出为 FairyGUI 文本,字体回退到设置中的字体名称;特殊字体特性(如 TMP 的富文本标签子集)会做近似处理。
- 富文本与复杂排版(如自动换行、图文混排)会被简化。
- 动画、事件绑定、脚本逻辑不在转换范围内,需要在 FairyGUI / 运行时侧重新接入。
- 文本换行、对齐方式等按近似规则转换,可能和原 UGUI 有细微差异。
- RectMask2D 近似为普通遮罩,复杂遮罩行为可能不完全一致。
- 自定义 Shader、材质特效、粒子等不被处理。
- TextMeshPro 的特殊功能(如链接、表情、自定义材质)不支持;描边/阴影仅按关键词近似识别。
十三、许可证
本工具以编译后的程序集(DLL)形式分发,授权受 Unity Asset Store 标准 EULA 约束,不单独提供源码修改授权。
十四、更新日志
v1.0.2
- 输出目录名大小写可选项(新功能):设置面板新增「输出目录名大小写」下拉(小写 / 首字母大写 / 全大写),控制导出包目录(Panels/Buttons/Common 等)与内部目录(component/image/subcomponent)的命名大小写,适配不同平台与团队的目录约定。切换后需重新导出,才能让写盘路径、组件引用、package.xml 三处路径一致。
- 纯图标子组件内联:内部仅含单一 loader / image 的纯图标子组件(如 Prev/Next 箭头、纯图标按钮)直接内联为 loader,不再抽成独立子组件再嵌回,避免结构冗余与引用丢失;带 title 文本或 Slider/Toggle 等复合结构的完整 Button/Label 不会被误判为纯图标。
- icon 节点默认命名:Button / Label / Toggle / ComboBox / Graph 转 xml 时,默认按角色、节点名、精灵名、结构顺序启发式寻找并命名为 icon 节点(detector 未识别时自动兜底),避免 icon 节点丢失导致状态图标不生效。
- 坐标位置修复:非拉伸、pivot 居中且 anchoredPosition 非零的多节点根(画廊类组件)内容整体偏移的问题已修复,子节点坐标归零对齐组件原点,避免放进舞台后整体错位。
- 文件名 / 节点名清洗:导出时自动清洗组件名、节点 name、文件名中的 ()[]() 等特殊符号,避免转成代码变量名时非法导致导出失败或命名冲突。
v1.0.1
- 滑块 / 滚动条 / 进度条导出修复:修复进度条填充未被正确识别、内部结构错位等问题,导出结果更符合预期。
- 去重残留清理:重新分析时自动清除已不存在的旧子组件,避免重复或多余导出。
- 列表子项布局优化:LayoutGroup 开启 childControlSize 时,子元素不再附加 sidePair 对齐关系,子项尺寸交由布局自动接管,列表排布更贴合预期。
更早版本日志:
- v1.0.0:变体合并(长得一样的多个组件 → 合成一个,但能实时变脸);
- v0.9.0:最低已经支持Unity 2018.4 .NET 4.0;
- v0.8.0:支持中英文界面;部件角色识别统一;滑块手柄导出为按钮子组件;组件背景自动跟随拉伸;普通 Mask 正确导出;一批列表/嵌套坐标 bug 修复;去重更精细(按资产名细分、尺寸开关);组件提取可配置;描边与阴影可配置。
- v0.7.0:带 Z 轴旋转的节点正确导出(旋转作为独立组件保留)。
- v0.6.0:新增「尺寸纳入去重指纹」开关;优化子节点命名规则;修复嵌套组件/遮罩子项尺寸坐标异常。
- v0.5.0:导出配置保存在项目内(团队共享);新增文本描边/阴影导出;修复字体颜色(含半透明)丢失;按钮命名/Toggle 图标完善;组件 ID 稳定。
- v0.4.0:新增组件去重编辑器(合并重复组件、指定类型);自动检测 TMP 与 Legacy Text;支持公共包提取;嵌套 Prefab 提取复用。
- v0.3.0:完善列表子组件提取与排重;完善 Slider / ScrollBar / Dropdown / InputField 导出。
- v0.2.0:基础 UGUI → FairyGUI 结构映射;Button / Toggle 状态与过渡效果导出。
- v0.1.0:初始版本,支持基础 Prefab 扫描与图片收集。