Skip to content

编辑器发布设置

本文只记录 FairyGUI 编辑器侧真实存在的发布属性与设置文件结构,作为发布相关功能开发时的依据。本文只按编辑器真实属性组织内容。

项目设置 sidecar

工程设置目录支持以下五个 JSON 文件:

文件正式设置字段
Publish.jsonpublish
Common.jsoncommon
Adaptation.jsonadaptation
CustomProperties.jsoncustomProperties,保存 JSON 对象
i18n.jsoni18n,其中 langFiles 保存语言文件的 namepath

五类设置在工程读写与 UAM 往返中保持完整的嵌套 JSON 数据。CustomProperties.jsoni18n.json 是可选文件;源工程不存在对应设置时,规范化和写回不会自行创建它们。updateProjectSettings 以完整设置快照更新工程设置,相同快照以 project_settings_unchanged 拒绝;从快照删除可选字段时,写回会删除已有 sidecar,并要求文件系统提供 unlink()

设置文件与层级

编辑器发布设置至少分为两层:

层级编辑器对象作用
全局发布设置GlobalPublishSettings记录项目级默认发布参数,序列化到 settings/Publish.json
包级发布设置PublishSettings记录单个包的发布参数、图集列表和排除列表

settings/Publish.json 真实属性

顶层属性

以下是 GlobalPublishSettings 中可见的真实发布属性:

属性含义
path发布输出目录
branchPath分支发布路径
fileExtension发布文件扩展名
packageCount默认包数量
compressDesc是否压缩描述数据
binaryFormat是否使用二进制发布格式
jpegQualityJPEG 质量
compressPNG是否压缩 PNG
allowGenCode是否允许生成代码
codePath代码输出路径
classNamePrefix类名前缀
memberNamePrefix成员名前缀
packageName代码生成使用的包名
ignoreNoname是否忽略无名对象
getMemberByName是否按名称获取成员
codeType代码生成类型
includeHighResolution高分辨率资源包含位掩码
branchProcessing分支处理模式
atlasMaxSize图集最大尺寸
atlasPaging是否分页
atlasSizeOption图集尺寸策略
atlasForceSquare是否强制正方形
atlasAllowRotation是否允许旋转
atlasTrimImage是否裁边

codeGeneration

Publish.json 中的代码生成子对象包含以下真实属性:

属性含义
allowGenCode是否允许生成代码
codePath代码输出路径
classNamePrefix类名前缀
memberNamePrefix成员名前缀
packageName目标包名 / 命名空间
ignoreNoname是否忽略无名对象
getMemberByName是否生成按名称获取成员逻辑
codeType代码类型

atlasSetting

Publish.json 中的图集子对象包含以下真实属性:

属性含义
maxSize图集最大尺寸
paging是否允许多页图集
sizeOption图集尺寸策略
forceSquare是否强制方图
allowRotation是否允许旋转
trimImage是否裁边

说明:

  • 编辑器 GlobalPublishSettings 里还存在 atlasMaxSizeatlasPagingatlasSizeOptionatlasForceSquareatlasAllowRotationatlasTrimImage 这些运行时字段,它们对应 Publish.json 里的 atlasSetting 子对象。
  • extractAlpha 不属于全局 Publish.json 的真实属性;它在包级图集设置里出现。

SVG 图像发布

package.xmlimage 资源指向 .svg,并声明了正的 widthheight 时,发布会先按这两个声明尺寸栅格化,再执行可选裁边和图集合成。发布物只包含 PNG 图集;sprite 的原始尺寸保持为工程声明值。

浏览器发布会在栅格化前执行与 UAM source validation 共用的结构化 XML 校验,并拒绝脚本、事件属性、外部资源引用、DTD/实体、样式、非标准命名空间或带前缀元素,以及超出尺寸或复杂度上限的 SVG。createImageBitmap 无法解码已验证 SVG 时,会使用 HTMLImageElement 与 Blob URL 回退;Blob URL 在成功和失败路径都会释放。宿主同时缺少可用 DOM 图像解码能力时,发布失败且不写出产物。

包级发布设置真实属性

PublishSettings 代表单个包的发布设置,真实属性如下:

属性含义
path包级发布路径
fileName发布文件名
branchPath包级分支路径
packageCount包级输出数量
genCode是否为该包生成代码
codePath该包代码输出路径
useGlobalAtlasSettings是否使用全局图集设置
atlasList包级图集设置列表
excludedList发布排除列表

说明:

  • PublishSettings 不是 settings/Publish.json 的顶层结构,而是单个包发布配置对象。
  • 包级设置里可以单独定义图集列表,也可以指定使用全局图集设置。
  • 工程 package.xml 中的 publish 节点正式支持 namepathbranchPathpackageCountgenCodecodePathmaxAtlasSizesizeOptionsquarerotationmultiPageextractAlphamaxAtlasIndexexcluded,以及稀疏的包级图集子节点 <atlas name="Default" index="0" compression="true"/>。缺少 maxAtlasSize 表示使用全局图集设置;maxAtlasIndex 默认是 10,图集子节点只记录实际命名或启用压缩的槽位。
  • 工程 package.xmlpackageDescription 根节点正式支持 compressPNGjpegQuality 与派生的 hasFavorites;未设置的图片压缩选项保持省略,hasFavorites 仅在包内存在收藏资源或资源文件夹时写为 true。UAM 同时承载根节点压缩值与完整包级 publish 快照,lift/materialize 不会丢失这些字段。
  • <publish><atlas> 是工程源配置,与发布/二进制读取后 Package.listAtlases() 中的生成 atlas 分离;ProjectWriter 只从源配置写回 <publish><atlas>,不会把生成 atlas 反写到 package.xml

updatePackageSettings 使用包含 compressPNGjpegQuality 和完整 publish 的单包快照,删除字段通过提交新的完整快照表达;相同快照以 package_settings_unchanged 拒绝。包名和输出路径必须是安全的相对路径,JPEG 质量范围是 1–100,包级 atlas 最大尺寸范围是 1–16384,maxAtlasIndex 范围是 0–255;稀疏 atlas 索引必须唯一且不超过该上限。excludedResourceIds 保存 CSV-safe 的资源 ID,可以保留当前工程中不存在的 ID,读取与写回不会把它误判为悬空引用。

发布时,显式调用参数优先于包级 atlas 设置,包级设置在 useGlobal=false 时优先于全局发布设置;extractAlphamaxAtlasIndex 始终读取包级正式值。包级设置控制最大尺寸、pot / npot / mof、正方形、旋转和分页,Layabox 目标强制禁用旋转。excludedResourceIds 从发布闭包移除对应资源;Unity 的 extractAlpha 输出无 alpha 的主图集与 !a.png alpha 图集。

组件 XML 的列表清理与属性覆盖

组件根扩展、ComboBox 组件实例和 List/Tree 显示节点使用正式的 autoClearItems 布尔属性;缺省值为 false,仅在启用时写出。组件实例与静态列表项的有序 <property target="..." propertyId="..." value="..."/> 子节点由 UAM 正式属性承载,读取、物化、保存和重新加载均保持原顺序与原始字符串值,包括前后空白、纯空白和空字符串。target 必须非空,propertyId 必须是非负安全整数,value 必须存在;无效输入在物化或写回前拒绝。

发布投影会执行清理语义:Loader / Loader3D 的 clearOnPublish 清空 URL,文本的 autoClearText 清空内容,List / Tree 的 autoClearItems 和 ComboBox 实例的 instanceAutoClearItems 清空静态项;资源闭包按清理后的值收集引用,工程源模型保持不变。

组件根的 designImagedesignImageForTestpageControllershowSoundhideSound 作为正式 authoring 属性读写;designImageAlpha 缺省为 50。设计图必须引用 image 资源,出场/退场音效必须引用 sound 资源,pageController 必须指向本组件控制器。Label、ComboBox 和 ProgressBar 组件实例的音效覆盖使用 sound 与百分比 volume,ComboBox 另以 titleColordirectionauto / up / down)保存标题颜色与弹出方向。

组件根的自定义扩展 ID 使用编辑器协议拼写 customExtention;Controller page 的备注使用 <remark page="索引" value="..."/> 子节点;Loader 的错误占位开关使用 errorSign。三者均由正式属性模型、UAM 与工程 XML 读写承载,Controller page 备注不进入运行时二进制。

List/Tree 的 autoItemSize 缺省值随布局变化:single column/row 为 true,flow/pagination 为 false;只有与布局缺省值不同时才写出。Button 根扩展使用 none / dark / scale 字符串枚举保存 downEffect。Transition 使用 frameRate 保存非 24 的帧率。

组件 XML 的整数几何字段

FairyGUI 工程 XML 中由桌面编辑器按有符号 32 位整数读取的几何值,写出时统一向零截断。非有限值或截断后超出 -21474836482147483647 的值会拒绝写出。

整数几何字段包括:

  • 显示节点的 xysizerestrictSize
  • 组件根的 sizerestrictSizemarginscrollBarMarginclipSoftnessdesignImageOffsetX/Y
  • List/Tree 的 marginscrollBarMarginclipSoftness
  • gearXY 的 x/y,以及 gearSize 的 width/height。

pivotscaleskewgearXY 的百分比和 gearSize 的缩放值继续保留小数。

组件根及支持 pivot 的显示标签在 anchor="true" 时保留 pivot="0,0",零坐标不取消锚点语义。.fairy 的工程类型完整写回 UnityVision 的 13 种正式类型;未知类型在写入前拒绝。

UAM 的 XY Gear 状态与默认值使用 x/y 和可选的 px/py;启用 positionsInPercent 时,显式状态值必须提供成对的有限 px/py,比例 0.5 表示 50%。默认值 null 表示未提供默认覆盖,保存时保持省略。每个显示节点的同一种 Gear 只允许绑定一次;需要更换控制器时移除后重新添加,Display 和 Display2 可共存。

Size、Look、Color、Animation 与 FontSize Gear 同样以 defaultValue: null 表示未提供默认覆盖,不以固定状态替代。XML 的 delay 保留为 tweenDelay;关闭补间也保留非默认的 ease、duration 和 delay。组件实例的 controller 属性通过正式 UAM controllerOverrides 保留,含其控制器及页面选择。

Text/Icon Gear 按页保留未覆盖值、空字符串和普通 - 文本,默认值也区分未覆盖与显式清空。工程 XML 的 values| 分隔页面;每页文本含 | 尚无已验证的官方无损表示,ProjectWriter 在任何写入前拒绝该类输出。默认值中的 | 不受此分隔限制;UAM、Document 与二进制保留完整字符串。

发布资源闭包包含组件根的 showSound / hideSound:同包未导出音效会随引用组件发布,跨包音效形成包依赖。

工程资源树元数据

package.xmlpackage_branch.xml 的 component/asset 资源节点使用 exported="true"favorite="true" 记录导出和收藏状态;未导出、未收藏时省略对应属性。SWF 使用正式的 SwfResource 模型读写 <swf> 节点,并通过 UAM swf 资源保留源文件、导出状态与收藏状态。UAM 通过 resource.exportedresource.favorite 承载这些字段,公开事务分别使用幂等的 setResourceExportedsetResourceFavorite 设置目标布尔值。

每个 package 通过正式的 branchNames 顺序记录自身出现的资源分支,并以 package.xml 根节点的同名 JSON 数组属性持久化。工程读取时使用该顺序建立映射;二进制发布时同一顺序定义该 package 的 branchItemIds 槽位,不能按工程根分支顺序重新推导。未显式设置包内表的 Document 调用会从实际分支资源按工程分支顺序推导后再发布。

公开事务 addBranchrenameBranchremoveBranch 维护按名称排序的工程分支注册表。重命名会原子更新资源、资源文件夹和包内分支表,但保持每个包已有槽位位置不变;删除只允许空且没有变体 ID 映射的分支。分支名必须是安全、非保留的单个路径段。编辑器当前激活分支属于本地界面状态,不在这些工程事务中修改。

ProjectWriter 会为每个工程分支保留 assets_<branch>/,并为包内空分支槽位写出空的 package_branch.xml,因此空分支和包内分支子集都能在 ProjectReader reload 后恢复。重命名或删除成功保存后,仅以非递归目录删除清理已移除的受控分支目录。

旧文件与目录清理使用存储适配器提供的现有路径身份;大小写别名解析到当前输出时不删除,大小写敏感存储仍区分不同文件。包和分支的全部图片排序提示在首次文件写入前验证,缺失、跨包、跨分支或循环锚点均拒绝写入。

资源文件夹由 package.folders 正式承载 branch / path / favorite / atlas。文件夹路径使用以 / 开头和结尾的规范形式,根目录是隐式节点;实际 assets[/_<branch>]/<包名>/ 目录是存在性的事实来源,<folder> 节点只写入需要持久化的收藏或图集元数据。setResourceFolderFavorite 可更新既有主分支或资源分支文件夹的收藏状态,且单个操作只修改 selector 指定的文件夹;需要匹配编辑器的后代收藏行为时,调用方应在同一事务中显式提交后代文件夹与资源收藏操作。公开事务 addResourceFolderrenameResourceFoldermoveResourceFolderremoveResourceFolder 只操作空文件夹;父目录必须存在,根目录、路径冲突和非空操作会在提交前拒绝。浏览器存储适配器须提供非递归 rmdir,保存成功后才清理被移除的空目录。

setResourceFolderAtlas 以规范 branch + path selector 更新既有文件夹的 source Atlas 槽位。空字符串清除覆盖;非空值必须是 0..maxAtlasIndex 范围内且没有前导零的十进制字符串,Atlas 名称不作为引用值。addResourceFolder.atlas 使用相同校验,未显式配置 package publish 时上限默认为 10。同一事务需要扩大上限时,必须先提交 updatePackageSettings,再提交文件夹 Atlas 操作;相同赋值以 resource_folder_atlas_unchanged 拒绝。

package.xmlpackageDescription@hasFavorites 由包内资源与资源文件夹的收藏状态派生,不作为独立可编辑状态。收藏状态只影响编辑器工程数据,不进入运行时二进制发布协议。

工程图片资源属性

package.xmlpackage_branch.xmlimage 资源属性由 UAM resource.image 完整快照承载,包括纹理集模式、质量选项与自定义质量、平滑、边缘复制、缩放模式、九宫格和 tile-grid 位掩码。公开事务 setImageResourceProps 只替换这份正式属性快照,不修改图片 source bytes;非图片 selector、不完整快照、非法缩放模式、九宫格或位掩码会在写回前被拒绝。

图片 source bytes 通过 replaceResourceBytes 更新时,当前只支持 PNG 与常见 8-bit Huffman JPEG。preflight 会检查 PNG 的 chunk CRC、zlib/scanline 边界和容器顺序;JPEG 除检查 quantization/Huffman table、frame/scan 顺序及编码约束外,还会完成像素解码。两者都会核对实际格式与操作时、最终文件扩展名;畸形或不匹配返回 invalid_resource_bytes,SVG、WebP、GIF、PSD、TGA 等未支持格式返回 unsupported_resource_mutation。浏览器 backend 通过 applyUamTransactionAsync 在包内 Web Worker 中执行相同的严格校验,browser 环境误用同步入口会直接拒绝而不会在主线程扫描或解码。消费端 bundler 必须把公开入口 @openfairygui/core/image-validation-worker 再打成与主 bundle 相邻的 self-contained ESM image-validation-worker.js;仅重打主入口或只复制 worker 文件不会带上其解码 chunk。Worker 无响应会在 10 秒后终止。浏览器 source 上限为 8 MiB,decoded raster 上限为 8,388,608 pixels;Node/CLI 同步校验的 source/PNG decoded bytes 上限为 128 MiB,JPEG 严格解码另限 8,388,608 pixels 与 64 MiB。

有效替换会从 bytes 派生新的 raster 宽高,并在同一内存 transaction 中原子投影到 UAM 与 Document。后续 Node Backend Save 在同级 staging 中完成全工程写回,并仅在全部成功后切换目录;浏览器 storage 是否具备同等级别的文件系统原子性由 adapter 的 runProjectWriteTransaction 能力决定。ProjectReader 在请求 hydrateResourceBytes 时以可解析且字段合法的 PNG IHDR / JPEG SOF header 覆盖陈旧 XML 尺寸,不在批量水合时扫描完整容器或重复执行像素解码;SVG 继续使用工程声明尺寸。

工程 MovieClip 资源属性与 JTA 事务

package.xmlpackage_branch.xmlmovieclip 资源使用 atlas 记录纹理集模式,并使用 smoothing 记录平滑设置。缺少 smoothing 时按 true 读取;写回时仅为非默认值输出 smoothing="false"。MovieClip 资源使用正式的 UamMovieClipResource.movieClip 快照承载 intervalrepeatDelayswingsmoothing 和逐帧矩形/附加延迟/sprite id,不读取旧式 metadata 属性袋。

ProjectReader 水合 JTA v100-v102 时,以 source bytes 派生尺寸、播放 timing 与帧列表;fps === 0 按 24 归一,负值无效,毫秒字段使用整数截断。无法解析派生模型时仍保留原始 source bytes 和 XML 属性。JTA 不携带的 smoothing 继续以 XML/UAM 为事实来源。

addResource、包含 MovieClip 的 addPackagereplaceResourceBytes 会先完成有边界的 JTA 解析,再在同一个原子 transaction 中替换 bytes 和重建模型。解析失败统一返回 invalid_movie_clip_jta;UAM project、backend revision/dirty 与 storage 均保持不变。MovieClip 不经过图片 raster worker,所以 Browser 与 Node 使用相同的 Core parser 和派生规则。Save/reload 与 inverse/save/reload 都从持久化的 JTA source 重建同一模型。

当前发布输出路径解析

发布时显式传入的输出目录优先于设置文件。未传入时,当前选择顺序如下:

  1. 活跃分支发布的包级 branchPath,再到全局 branchPath
  2. 包级 path
  3. 全局 path

选中的相对路径以工程根目录为基准;若以上都未配置,发布不会隐式选择输出目录。

工程及包级 path / branchPath 先以发布名称替换 {publish_file_name}(不含扩展名),再按 CustomProperties.json 的属性顺序替换 {变量名},最后解析相对路径。未知变量保持原样;显式 output 作为调用方路径直接使用。工程及包级 codePath 同样展开自定义变量。

浏览器 Laya 发布在显式 output 下不会使用工程或包内的桌面输出路径;显式 branchpackagescompressedatlas 也保持调用参数优先。未显式覆盖时,持久化的压缩、图集和安全文件扩展名设置直接驱动输出。当前浏览器宿主不提供代码生成;全局允许且任一选中包启用 genCode 时,发布会在 Canvas 检查和文件写入前以 unsupported_publish_setting(含 settingpath)拒绝。失败结果的 files 只包含已经完成 writeFileRaw 的文件,因此 success=false 且列表非空表示内置输出已部分写入;需要原子发布的宿主必须提供事务式或 staging 输出文件系统。

当前发布完整性要求

位图字体在资源筛选前读取所属分支的 .fnt,由纹理及字形图片建立发布依赖闭包,包含未显式导出的图片;合并分支时字形引用同步映射到发布 ID。assets_<branch> 字体不读取主分支同名 .fnt。TTF/TTC/OTF 是引擎字体:文本写入字体资源名称,不生成空位图 Font 项,也不因该字体 URL 增加包依赖。

同一 Document 重复发布时,图集成功生成后替换旧 Atlas/Sprite,生成失败保留之前完整的图集。发布集合由资源导出状态和依赖重新计算,之前生成的 Sprite 不构成新的发布依据。

这些要求是 OpenFairyGUI 当前发布执行时的能力边界,不是新增的编辑器设置字段:

条件当前行为
已解析到发布输出目录必须提供输出文件系统;缺失时不会把流程当作发布成功
有需要封包的图像或动画帧必须提供 raster encoder、源资源路径和 atlas 输出目录
图集装箱、图像读取或合成失败中止发布,不生成带透明空洞或缺页的成功结果
发布集合包含 MovieClip按 JTA 长度表读取 PNG / JPEG(可混合)纹理;重复 texture index 复用首次引用帧的 sprite,-1 表示空帧。所有选中包会先完成 JTA 解析、严格 PNG/JPEG 校验、引用纹理完整解码与规范化缓存;越界索引、被引用的空纹理、未支持格式、截断数据或解码失败会在创建任何 OpenFairyGUI 内置输出目录或写入内置发布文件前中止整次发布
SoundResourceMiscResourceSpineResourceDragonBonesResource 及其依赖复制失败中止发布,不把缺失的 runtime 资源降级为 warning

未请求任何输出目录时,低层 publish() 可以只计算 layout;这不是文件发布,也不会写出二进制或资源文件。标准 Node 工作流应使用 publishNode()

标准 Node adapter 在显式传入 output 时,会先把该目录复制到同级 staging 目录,完整发布成功后再以目录切换提交;内置 runtime 输出或 onPublishEnd 失败时,原输出目录保持不变。按工程/包设置解析出的多个输出目录、自定义低层文件系统、输出目录外的 codegen,以及插件通过 basePath 或其他路径产生的副作用不在这项目录级保证内,应由宿主或插件提供自己的 staging/回滚策略。

publishNode() 成功返回 { files: [{ path, size }] },记录内置文件系统与图集 writer 实际写入的文件,路径为提交后的绝对路径、size 为字节数;测量在暂存目录提交前完成。清单包含经 publish 文件系统写入的代码,不含旧目录未改动文件、删除项或插件绕开该文件系统的任意 I/O。失败仍抛错,不返回成功清单。CLI publish --json 直接包装这一结果,不自行推测输出文件名;机器输出与退出码见可运行示例。文件命名与二进制协议未因此改变。

代码生成的当前实现范围

OpenFairyGUI 当前已经把“代码生成”接入现有 publish 流程,但实现范围仍是正式收口的一条首发口径,不是编辑器全部模板矩阵。

条件当前行为
全局 codeGeneration.allowGenCode=false不生成代码
包级 publish@genCode=false 或未开启该包不生成代码
包级 publish@codePath 有值优先使用包级代码输出路径
包级 publish@codePath 为空回退到全局 codeGeneration.codePath
Unity 项目,且 codeType 为空字符串生成 Unity 风格 .cs 代码
Laya / Cocos Creator 项目生成共享的 fgui TypeScript 代码
其他项目类型当前未实现,跳过生成

当前正式落地的代码生成口径如下:

包名、组件名和成员名中的汉字转为逐字拼音,ASCII 名称保持原有大小写规则;多音字采用词典默认读音。组件按 ID 排序后分配名称;同一包内重名或仅大小写不同的类名依次加 _2_3,并避开 Binder 名称。成员名冲突也分配唯一后缀。引用类型、文件名和 Binder 使用同一组最终类名。

Lane输出项当前行为
Unity + 空 codeType输出目录codePath/<规范化包名>/
Unity + 空 codeType组件类每个导出组件生成一个 .cs 类文件
Unity + 空 codeTypeBinder每个包生成一个 包名Binder.cs
Unity + 空 codeType清理规则只清理当前包输出目录下、带 FairyGUI 自动生成标记的旧 .cs 文件
共享 fgui TypeScript 模式(Layabox / Cocos Creator)输出目录codePath/<规范化包名>/
共享 fgui TypeScript 模式(Layabox / Cocos Creator)组件类每个导出组件生成一个 .ts 类文件
共享 fgui TypeScript 模式(Layabox / Cocos Creator)Binder每个包生成一个 包名Binder.ts
共享 fgui TypeScript 模式(Layabox / Cocos Creator)运行时口径使用 fguiUIObjectFactory.setExtension(...)
共享 fgui TypeScript 模式(Layabox / Cocos Creator)清理规则只清理当前包输出目录下、带 FairyGUI 自动生成标记的旧 .ts 文件

说明:

  • 这里描述的是 OpenFairyGUI 当前已实现行为,不等同于 FairyGUI 编辑器所有项目类型 / codeType 模板都已支持。
  • 这里的 fgui TypeScript 代码生成口径已经不再依赖 codeType 字段分流;Layabox 与 Cocos Creator 共用 TS 模板,Cocos Creator 生成文件会显式导入 fairygui-cc,Layabox 继续使用宿主提供的全局 fgui
  • publish 流程也支持 OpenFairyGUI publish 插件接管代码生成。插件目录、生命周期、失败降级,以及与 FairyGUI 编辑器插件的关系见 Publish 插件

包级图集设置真实属性

AtlasSettings 是单个图集项的真实属性对象:

属性含义
name图集名称
compression是否压缩
extractAlpha是否提取 alpha
packSettings打包参数对象

其中 packSettingsPackSettings 承载,编辑器通过它控制更细的打包行为。

默认值

以下默认值来自编辑器 GlobalPublishSettings.read() 的真实行为:

属性默认值 / 规则
path空字符串
branchPath空字符串
packageCount2
compressDesctrue
binaryFormattrue
includeHighResolution0
branchProcessing0
classNamePrefixUI_
memberNamePrefixm_
ignoreNonamefalse
codeType空字符串
allowGenCodetrue
atlasSetting.maxSize2048
atlasSetting.pagingtrue
atlasSetting.sizeOptionpot
atlasSetting.forceSquarefalse
atlasSetting.allowRotationfalse
atlasSetting.trimImage项目版本号 >= 500 时默认 true,否则使用旧默认逻辑
jpegQuality80

fileExtension 的当前实现规则

fileExtension 在 OpenFairyGUI 当前实现中不是完整复刻编辑器全部项目类型矩阵,而是基于已落地的发布逻辑生效。当前正式行为如下:

场景结果
Unity 项目固定为 bytes
Cocos Creator 项目,且 Publish.json 显式设置了 fileExtension使用设置值
Cocos Creator 项目,且 Publish.json 未显式设置 fileExtension默认使用 bin
其他非 Unity 项目,且 Publish.json 显式设置了 fileExtension使用设置值
其他非 Unity 项目,且 Publish.json 未显式设置 fileExtension回退为 fui

CLI 显式目标覆盖

ofgui publish --project-type layabox 表示按 Layabox 目标发布,而不只是修改工程类型字段。命令会在读取工程设置后应用以下目标规则:

  • 描述文件扩展名使用 fui
  • atlas 禁止旋转,确保产物可由当前 FairyGUI-Layabox 运行时正确消费

includeHighResolution、压缩、atlas 尺寸、分页和裁边等 Layabox 支持的设置继续使用工程配置。未提供 --project-type 时,仍遵循上表的工程设置规则。

Unity 与 Cocos Creator 运行时不解压二进制描述文件,因此这两个目标始终输出未压缩数据。若 API 或 CLI 对它们显式请求 compressed=true / --compressed,发布会直接报错;工程中持久化的 compressDesc 不会覆盖该目标约束。Layabox 继续使用工程中的压缩设置。

当前仓库已正式覆盖的非 Unity 二进制发布口径包括:

  • Layabox:样例工程使用 binaryFormat=truefileExtension="fui",发布结果为 包名.fui
  • Cocos Creator:未显式设置 fileExtension 时默认发布为 包名.bin

编辑器文档中其他项目类型的默认扩展名矩阵,目前不应直接视为 OpenFairyGUI 已实现行为;若仓库尚未实现对应项目类型发布规则,应从当前实现文档中删除,或明确标注为“未实现”。

fileExtension 的编辑器参考矩阵

下面这张表保留的是 FairyGUI 编辑器侧的项目类型规则,用作后续实现对齐时的参考索引;它不代表当前 OpenFairyGUI 已全部实现这些项目类型的发布行为

项目类型结果
Unity固定为 bytes
Cocos2dx / VisionbinaryFormat=true 时为 fui,否则为 bytes
Cry / Monogame / Corona固定为 fui
CocosCreator未显式设置时默认 bin
H5 项目未显式设置时默认 fui
其他项目未显式设置时默认 zip

高分辨率与分支相关属性

属性含义
includeHighResolution位掩码字段,用于表示是否包含 2x / 3x / 4x 资源
branchProcessing分支处理模式
branchPath分支输出路径
seperatedAtlasForBranch分支 atlas 是否单独输出

includeHighResolution 可以理解为 2x3x4x 资源开关对应的位掩码字段:@2x=1@3x=2@4x=4

发布流程只发现并链接工程中已经存在的同路径、同分支、同类型 @2x / @3x / @4x 资源,例如 icon.png 对应 icon@2x.png。它们会作为独立 image / movieclip package item 写入,再由基础 item 的 high-resolution 列表引用;发布期不会主动把原始位图缩放或放大生成高分辨率资源。

branchProcessing 当前可见语义如下:

编辑器行为
0主干包含所有分支,发布结果保留主干与全部分支内容,输出路径使用 path
1主干合并活跃分支,发布结果只保留主干与当前活跃分支合并后的内容;主干输出到 path,非主干分支输出到 branchPath/<branch>(若 branchPath 有值)

seperatedAtlasForBranch 当前可见语义如下:

条件编辑器行为
branchProcessing=0seperatedAtlasForBranch=false主干与分支资源可以进入同一组 atlas 页
branchProcessing=0seperatedAtlasForBranch=true主干 atlas 与分支 atlas 分开输出;分支 atlas 文件名带 _branchName 后缀,例如 atlas0_dev.png
branchProcessing=1发布结果已完成分支合并,seperatedAtlasForBranch 不再单独生效

编辑器写回行为

编辑器在写回 Publish.json 时,当前规则包括:

项目写回规则
branchPath仅在有值时写出
fileExtension仅项目支持自定义扩展名时写出
includeHighResolution仅大于 0 时写出
branchProcessing仅大于 0 时写出
atlasSetting.maxSize2048 时写出
atlasSetting.pagingtrue 时写出
atlasSetting.forceSquaretrue 时写出
atlasSetting.allowRotationtrue 时写出
atlasSetting.trimImagetrue 时写出
compressPNG / jpegQuality仅项目不支持 atlas 时写出

工程写回联动边界

组件 XML 往返保留受支持的属性值和有序子节点,不承诺保留源文本的属性排列。属性排列不承载语义;Gear、relation、扩展覆盖及列表条目等子节点仍按各自协议顺序处理。

恢复工程中的图片可省略 package.xmlwidthheight,以免把发布资源推导尺寸当作原工程显式声明;图片重建仍保留可用尺寸。该省略规则不改变普通工程中已声明尺寸的写回。

恢复生成的字体纹理和字形图片在相同包与分支中跟随对应字体,纹理先于字形,同类图片按资源 ID 顺序排列;这不改变资源的 ID、引用或图片内容。

工程根 .fairy 文件的 projectDescription.id / type / version 统一通过 XML 属性渲染器写出;引号、 尖括号、换行和 & 等字符会转义,并在再次读取时还原为原属性值,不会形成额外 XML 属性。

发布设置不改变 component.xml 的 authoring 属性语义。工程读写会独立保留组件根属性、根组件 customProperty 定义,以及组件引用的 ButtonLabelComboBoxProgressBarSliderScrollBar 实例扩展覆盖;对应 XML 协议见 Project XML 属性协议

列表与树节点的布局、渲染顺序、滚动区域、静态条目和树行为属性也按该 XML 协议独立读写; 其中 renderOrder="arch" 使用 apex 记录顶点子项,树节点通过 treeViewindentclickToExpand 保留树行为。

文档边界

项目约束
本文关注点只记录编辑器真实属性、默认值和序列化规则
不写内容不引入项目内部类型、字段映射或实现细节
文档边界本页只描述编辑器设置协议本身,不描述具体项目如何消费这些属性

MIT Licensed