Skip to content

Editor Publish Settings

This document records only the publish properties and settings-file structures that actually exist in FairyGUI Editor. It is a reference for publish-related development and is organized strictly around real editor properties.

Project settings sidecars

The project settings directory supports five JSON files:

FileFormal settings field
Publish.jsonpublish
Common.jsoncommon
Adaptation.jsonadaptation
CustomProperties.jsoncustomProperties, containing a JSON object
i18n.jsoni18n, whose langFiles stores each language file's name and path

All five settings categories preserve their complete nested JSON data through project I/O and UAM round trips. CustomProperties.json and i18n.json are optional; normalization and write-back do not create them when the source project has no corresponding settings. updateProjectSettings replaces project settings with a complete snapshot and rejects an identical snapshot as project_settings_unchanged. Removing an optional field from the snapshot deletes an existing sidecar during write-back and requires the filesystem to provide unlink().

Settings files and levels

Editor publish settings have at least two levels:

LevelEditor objectPurpose
Global publish settingsGlobalPublishSettingsStores project-wide defaults in settings/Publish.json
Package publish settingsPublishSettingsStores the publish parameters, atlas list, and exclusions for one package

Actual properties in settings/Publish.json

Top-level properties

The following real publish properties are visible on GlobalPublishSettings:

PropertyMeaning
pathPublish output directory
branchPathBranch publish path
fileExtensionPublished file extension
packageCountDefault package count
compressDescWhether to compress descriptor data
binaryFormatWhether to use the binary publish format
jpegQualityJPEG quality
compressPNGWhether to compress PNG
allowGenCodeWhether code generation is allowed
codePathGenerated-code output path
classNamePrefixClass-name prefix
memberNamePrefixMember-name prefix
packageNamePackage name used for code generation
ignoreNonameWhether unnamed objects are ignored
getMemberByNameWhether members are retrieved by name
codeTypeCode-generation type
includeHighResolutionBitmask for included high-resolution resources
branchProcessingBranch-processing mode
atlasMaxSizeMaximum atlas size
atlasPagingWhether pagination is enabled
atlasSizeOptionAtlas-size strategy
atlasForceSquareWhether atlases are forced square
atlasAllowRotationWhether rotation is allowed
atlasTrimImageWhether images are trimmed

codeGeneration

The code-generation child object in Publish.json contains these real properties:

PropertyMeaning
allowGenCodeWhether code generation is allowed
codePathGenerated-code output path
classNamePrefixClass-name prefix
memberNamePrefixMember-name prefix
packageNameTarget package name or namespace
ignoreNonameWhether unnamed objects are ignored
getMemberByNameWhether member-by-name lookup code is generated
codeTypeCode type

atlasSetting

The atlas child object in Publish.json contains these real properties:

PropertyMeaning
maxSizeMaximum atlas size
pagingWhether multiple atlas pages are allowed
sizeOptionAtlas-size strategy
forceSquareWhether atlases are forced square
allowRotationWhether rotation is allowed
trimImageWhether images are trimmed

Notes:

  • Editor GlobalPublishSettings also contains the runtime fields atlasMaxSize, atlasPaging, atlasSizeOption, atlasForceSquare, atlasAllowRotation, and atlasTrimImage. They correspond to the atlasSetting child object in Publish.json.
  • extractAlpha is not a real global Publish.json property; it appears in package-level atlas settings.

Publishing SVG images

When an image resource in package.xml points to an .svg file and declares positive width and height, publishing rasterizes it at those declared dimensions before optional trimming and atlas composition. The output contains only PNG atlases, while the sprite's original dimensions remain the project-declared values.

Before rasterization, browser publishing uses the same structured XML validation as UAM source validation and rejects SVG with scripts, event attributes, external resource references, DTD/entities, styles, non-standard namespaces or prefixed elements, or dimensions and complexity beyond the defined limits. If createImageBitmap cannot decode a validated SVG, it falls back to HTMLImageElement with a Blob URL; the Blob URL is released on both success and failure paths. Publishing fails without writing output when the host has no usable DOM image-decoding capability.

Actual package-level publish properties

PublishSettings represents one package's publish settings:

PropertyMeaning
pathPackage publish path
fileNamePublished filename
branchPathPackage branch path
packageCountPackage-level output count
genCodeWhether code is generated for this package
codePathCode-output path for this package
useGlobalAtlasSettingsWhether global atlas settings are used
atlasListPackage atlas-settings list
excludedListPublish-exclusion list

Notes:

  • PublishSettings is not the top-level structure of settings/Publish.json; it is the publish configuration for one package.
  • A package can define its own atlas list or use global atlas settings.
  • The publish node in project package.xml formally supports name, path, branchPath, packageCount, genCode, codePath, maxAtlasSize, sizeOption, square, rotation, multiPage, extractAlpha, maxAtlasIndex, excluded, and sparse package-atlas children such as <atlas name="Default" index="0" compression="true"/>. Missing maxAtlasSize means global atlas settings are used. maxAtlasIndex defaults to 10, and an atlas child is stored only for a slot that has an actual name or compression enabled.
  • The packageDescription root in project package.xml formally supports compressPNG, jpegQuality, and derived hasFavorites. Unset image-compression options remain omitted; hasFavorites is written as true only when the package contains a favorite resource or resource folder. UAM stores both the root compression values and the complete package publish snapshot, so lift/materialize retains these fields.
  • <publish><atlas> is source project configuration and is separate from the generated atlases returned by Package.listAtlases() after publishing or binary reads. ProjectWriter writes <publish><atlas> only from source configuration and never writes generated atlases back to package.xml.

updatePackageSettings accepts a complete single-package snapshot containing compressPNG, jpegQuality, and the complete publish object. Fields are removed by submitting a new complete snapshot, and an identical snapshot is rejected as package_settings_unchanged. Package names and output paths must be safe relative paths. JPEG quality is limited to 1-100, package atlas maximum size to 1-16384, and maxAtlasIndex to 0-255. Sparse atlas indices must be unique and no greater than that limit. excludedResourceIds stores CSV-safe resource IDs and may retain IDs absent from the current project; reads and writes do not misclassify them as dangling references.

List cleanup and property overrides in component XML

Component root extensions, ComboBox component instances, and List/Tree display nodes use the formal boolean autoClearItems property. Its default is false, and it is written only when enabled. Ordered <property target="..." propertyId="..." value="..."/> children for component instances and static list items are stored in formal UAM properties. Reads, materialization, saves, and reloads preserve their original order and raw string values, including leading/trailing whitespace, whitespace-only values, and empty strings. target must be non-empty, propertyId must be a non-negative safe integer, and value must be present; invalid input is rejected before materialization or write-back.

List/Tree autoItemSize defaults by layout: true for single column/row and false for flow/pagination, and it is written only when it differs from that layout default. Button root extensions store downEffect with the none / dark / scale string enum. Transitions store non-24 frame rates in frameRate.

Integer geometry fields in component XML

Geometry values that the FairyGUI desktop editor reads as signed 32-bit integers are truncated toward zero when written to Project XML. Non-finite values and values outside -2147483648 to 2147483647 after truncation are rejected.

Integer geometry fields include:

  • Display-node xy, size, and restrictSize.
  • Component-root size, restrictSize, margin, scrollBarMargin, clipSoftness, and designImageOffsetX/Y.
  • List/Tree margin, scrollBarMargin, and clipSoftness.
  • The x/y values of gearXY and the width/height values of gearSize.

pivot, scale, skew, percentage values in gearXY, and scale values in gearSize continue to preserve decimals.

Component roots and display tags supporting pivots preserve pivot="0,0" when anchor="true"; zero coordinates do not cancel anchor semantics. .fairy writing preserves all 13 formal project types from Unity through Vision, rejecting unknown types before writing.

UAM XY Gear states and defaults use x/y and optional px/py. Enabling positionsInPercent requires paired finite px/py coordinates in explicit values; 0.5 means 50%. A null default means no default override and remains omitted on save. Each display node allows one binding per Gear type. Rebind a controller by removing the gear and adding it again; Display and Display2 may coexist.

Text/Icon Gear page values preserve absent overrides, empty strings, and literal - text. Defaults also distinguish an absent override from explicit clearing. Project XML separates page values with |; no verified official lossless representation is available for a page value containing |, so ProjectWriter rejects that output before any write. A default containing | has no such delimiter restriction; UAM, Document, and binary retain complete strings.

Size, Look, Color, Animation, and FontSize gears also use defaultValue: null for an absent override, without substituting a fixed state. XML delay is preserved as tweenDelay; disabling tweening still preserves non-default ease, duration, and delay. A component instance's controller attribute is retained in the formal UAM controllerOverrides field, including controller and page selections.

The published resource closure includes component-root showSound / hideSound: referenced unexported sounds in the same package are published with the component, and sounds in other packages create package dependencies.

Project resource-tree metadata

Component and asset resource nodes in package.xml and package_branch.xml use exported="true" and favorite="true" to store export and favorite state. The corresponding attribute is omitted when disabled. SWF uses the formal SwfResource model for <swf> nodes, and the UAM swf resource preserves its source file, export state, and favorite state. UAM stores these values as resource.exported and resource.favorite; public transactions set the target Boolean idempotently through setResourceExported and setResourceFavorite.

Each package records its own resource branches in the formal ordered branchNames list, persisted as the same-named JSON-array attribute on the package.xml root. Project reads use that order to establish mappings; binary publishing uses the same order to define that package's branchItemIds slots and must not derive them again from root project branch order. Document calls that do not explicitly set a package-local table derive it from actual branch resources in project branch order before publishing.

The public addBranch, renameBranch, and removeBranch transactions maintain the project branch registry sorted by name. Rename atomically updates resources, resource folders, and package-local branch tables while preserving each package's existing slot positions. Removal is allowed only for an empty branch with no variant-ID mapping. A branch name must be a safe, non-reserved single path segment. The branch currently active in the editor is local UI state and is not changed by these project transactions.

ProjectWriter preserves assets_<branch>/ for every project branch and writes an empty package_branch.xml for each empty package-local branch slot. Empty branches and package-local branch subsets therefore survive a ProjectReader reload. After a rename or removal is saved successfully, only the removed controlled branch directories are cleaned up with non-recursive directory deletion.

Stale-file and directory cleanup uses the storage adapter's existing-path identities. Case aliases resolving to a current output are retained, while case-sensitive storage still distinguishes separate files. All image ordering hints are checked before the first file write: missing, cross-package, cross-branch and cyclic anchors reject writing.

Resource folders are formally represented by package.folders with branch / path / favorite / atlas. Folder paths use canonical leading and trailing /, and the root is implicit. Actual assets[/_<branch>]/<package-name>/ directories are the source of truth for existence; <folder> nodes store only favorite or atlas metadata that needs persistence. setResourceFolderFavorite updates a known folder in the main branch or a resource branch, and one operation changes only the selected folder. To match editor behavior that favorites descendants, callers should explicitly submit favorite operations for descendant folders and resources in the same transaction. Public addResourceFolder, renameResourceFolder, moveResourceFolder, and removeResourceFolder transactions operate only on empty folders. The parent must exist, and root, path conflicts, or non-empty operations are rejected before commit. Browser storage adapters must provide non-recursive rmdir; removed empty directories are cleaned up only after a successful save.

setResourceFolderAtlas updates the source Atlas slot of an existing folder selected by canonical branch + path. An empty string clears the override; a non-empty value must be a decimal string without leading zeroes in the 0..maxAtlasIndex range, and Atlas names are not reference values. addResourceFolder.atlas uses the same validation, and the limit defaults to 10 when package publish settings are absent. To expand the range in the same transaction, submit updatePackageSettings before the folder Atlas operation. Assigning the current value is rejected as resource_folder_atlas_unchanged.

packageDescription@hasFavorites in the main package.xml is derived from favorite resources and resource folders in the package and is not independently editable. Favorite state affects editor project data only and does not enter the runtime binary publish protocol.

Project image-resource properties

Image-resource attributes in package.xml and package_branch.xml are represented by the complete UAM resource.image snapshot, including texture-set mode, quality option and custom quality, smoothing, edge duplication, scale mode, nine-slice grid, and tile-grid bitmask. The public setImageResourceProps transaction replaces only that formal property snapshot and does not change image source bytes. A non-image selector, incomplete snapshot, invalid scale mode, nine-slice grid, or bitmask is rejected before write-back.

Updating image source bytes through replaceResourceBytes currently supports PNG and common 8-bit Huffman JPEG only. Preflight checks PNG chunk CRCs, zlib/scanline boundaries, and container order. For JPEG it checks quantization/Huffman tables, frame/scan order, and encoding constraints and also completes pixel decoding. Both paths compare the actual format with the filename extension at operation time and in the final state. Malformed or mismatched data returns invalid_resource_bytes; unsupported formats such as SVG, WebP, GIF, PSD, and TGA return unsupported_resource_mutation. The browser backend performs the same strict validation through applyUamTransactionAsync in the packaged Web Worker. Calling the synchronous entry in a browser is rejected immediately rather than scanning or decoding on the main thread. Consumer bundlers must package the public @openfairygui/core/image-validation-worker entry as a self-contained ESM image-validation-worker.js beside the main bundle; rebundling only the main entry or merely copying the worker file omits its decoder chunks. An unresponsive worker is terminated after ten seconds. Browser source input is limited to 8 MiB and decoded raster size to 8,388,608 pixels. Node/CLI synchronous validation limits source and decoded PNG bytes to 128 MiB; strict JPEG decoding is additionally limited to 8,388,608 pixels and 64 MiB.

A valid replacement derives new raster width and height from the bytes and projects them atomically into UAM and Document in the same in-memory transaction. A later Node Backend save writes the complete project in a sibling staging directory and switches directories only after every write succeeds. Browser storage provides equivalent filesystem atomicity only when its adapter supplies runProjectWriteTransaction. When hydrateResourceBytes is requested, ProjectReader replaces stale XML dimensions from a parseable PNG IHDR or JPEG SOF header with valid fields. It does not scan the complete container or repeat pixel decoding during batch hydration; SVG continues to use project-declared dimensions.

Project MovieClip properties and JTA transactions

MovieClip resources in package.xml and package_branch.xml use atlas for texture-set mode and smoothing for smoothing. Missing smoothing reads as true; write-back emits smoothing="false" only for the non-default value. A MovieClip uses the formal UamMovieClipResource.movieClip snapshot for interval, repeatDelay, swing, smoothing, and each frame's rectangle, additional delay, and sprite ID. The legacy metadata property bag is not read.

When ProjectReader hydrates JTA v100-v102, it derives dimensions, playback timing, and the frame list from source bytes. fps === 0 normalizes to 24, negative values are invalid, and millisecond fields use integer truncation. If the derived model cannot be parsed, raw source bytes and XML attributes are still retained. smoothing, which JTA does not carry, continues to use XML/UAM as its source of truth.

addResource, addPackage containing a MovieClip, and replaceResourceBytes complete bounded JTA parsing before atomically replacing the bytes and rebuilding the model in the same transaction. Parse failure returns invalid_movie_clip_jta; the UAM project, backend revision/dirty state, and storage remain unchanged. MovieClips do not enter the image raster worker, so browser and Node use the same Core parser and derivation rules. Save/reload and inverse/save/reload rebuild the same model from persisted JTA source data.

Current publish output-path resolution

An explicitly supplied output directory takes priority over settings. Without one, the current selection order is:

  1. Package-level branchPath for an active branch, then global branchPath.
  2. Package-level path.
  3. Global path.

The selected relative path resolves against the project root. If none is configured, publishing does not implicitly choose an output directory.

Project and package path / branchPath first replace {publish_file_name} with the publish name without its extension, then replace {name} in CustomProperties.json property order before resolving relative paths. Unknown variables remain literal; explicit output is used directly as the caller's path. Project and package codePath also expand custom variables.

Browser Laya publishing never uses project or package desktop output paths beneath an explicit output. Explicit branch, packages, compressed, and atlas parameters also remain authoritative. Without an explicit override, persisted compression, atlas, and safe file-extension settings directly drive output. The current browser host does not provide code generation. If global settings allow it and any selected package enables genCode, publishing rejects with unsupported_publish_setting, including setting and path, before Canvas checks or file writes. On failure, files contains only files whose writeFileRaw completed. Therefore, success=false with a non-empty list means built-in output was written partially; hosts requiring atomic publication must provide a transactional or staging output filesystem.

Current publish completeness requirements

Bitmap fonts load their branch's .fnt before resource selection. Texture and glyph images form the publication dependency closure, including images not explicitly exported; merged branches remap glyph references to published IDs. Fonts in assets_<branch> do not read the main branch's same-named .fnt. TTF/TTC/OTF resources are engine fonts: text stores the font resource name, without an empty bitmap Font item or a package dependency caused by that font URL.

Republishing the same Document replaces old Atlas/Sprite nodes after successful generation and retains the previous complete atlas model on generation failure. The publication set is recomputed from export flags and dependencies; previously generated sprites do not become new publication inputs.

These are OpenFairyGUI's current execution boundaries, not new editor setting fields:

ConditionCurrent behavior
A publish output directory resolvedAn output filesystem is required; its absence is not reported as a successful publish
Images or animation frames need packingA raster encoder, source-resource path, and atlas output directory are required
Atlas packing, image reads, or composition failPublishing aborts instead of returning a successful result with transparent holes or missing pages
The publish set contains a MovieClipReads mixed PNG/JPEG textures through the JTA length table. Duplicate texture indices reuse the first referenced frame's sprite, and -1 means an empty frame. All selected packages finish JTA parsing, strict PNG/JPEG validation, complete decoding of referenced textures, and normalized caching before any built-in OpenFairyGUI output directory or file is created. Out-of-range indices, referenced empty textures, unsupported formats, truncated data, or decode failure abort the entire publish.
Copying a SoundResource, MiscResource, SwfResource, SpineResource, DragonBonesResource, or one of their dependencies failsPublishing aborts instead of downgrading a missing runtime resource to a warning

When no output directory is requested, low-level publish() may calculate layout only. That is not a file publish and writes no binary or resource files. Standard Node workflows should use publishNode().

When the standard Node adapter receives an explicit output, it copies that directory to a sibling staging directory and commits it with a directory switch only after the complete publish succeeds. The original output remains unchanged if built-in runtime output or onPublishEnd fails. Multiple output directories resolved from project/package settings, custom low-level filesystems, code generation outside the output directory, and plugin side effects through basePath or other paths remain outside this directory-level guarantee and require host- or plugin-owned staging and rollback.

Current code-generation scope

OpenFairyGUI has integrated code generation into the existing publish workflow, but the supported range is a deliberately closed initial contract rather than the editor's complete template matrix.

ConditionCurrent behavior
Global codeGeneration.allowGenCode=falseNo code is generated
Package publish@genCode=false or omittedNo code is generated for that package
Package publish@codePath is setUses the package code-output path
Package publish@codePath is emptyFalls back to global codeGeneration.codePath
Unity project with an empty codeTypeGenerates Unity-style .cs code
Laya / Cocos Creator projectGenerates shared fgui TypeScript code
Other project typesCurrently unimplemented; generation is skipped

The current formal code-generation contract is:

Chinese characters in package, component, and member names become character-by-character pinyin; ASCII names retain the existing case rules, and polyphonic characters use the dictionary's default reading. Components receive names in ID order. Class names that collide within a package, including case-only collisions or the Binder name, receive _2, _3, and further suffixes. Member collisions also receive unique suffixes. Referenced types, filenames, and the Binder share the same final class names.

LaneOutput itemCurrent behavior
Unity + empty codeTypeOutput directorycodePath/<normalized-package-name>/
Unity + empty codeTypeComponent classesOne .cs class per exported component
Unity + empty codeTypeBinderOne <PackageName>Binder.cs per package
Unity + empty codeTypeCleanupRemoves only old .cs files carrying the FairyGUI generated marker from the current package output directory
Shared fgui TypeScript (Layabox / Cocos Creator)Output directorycodePath/<normalized-package-name>/
Shared fgui TypeScript (Layabox / Cocos Creator)Component classesOne .ts class per exported component
Shared fgui TypeScript (Layabox / Cocos Creator)BinderOne <PackageName>Binder.ts per package
Shared fgui TypeScript (Layabox / Cocos Creator)Runtime contractUses fgui and UIObjectFactory.setExtension(...)
Shared fgui TypeScript (Layabox / Cocos Creator)CleanupRemoves only old .ts files carrying the FairyGUI generated marker from the current package output directory

Notes:

  • This is the behavior currently implemented by OpenFairyGUI, not support for every project type and codeType template available in FairyGUI Editor.
  • The fgui TypeScript generation path no longer branches on codeType; Layabox and Cocos Creator share this TS lane.
  • The publish workflow also allows OpenFairyGUI publish plugins to take over code generation. See Publish Plugins for plugin directories, lifecycle, failure fallback, and the distinction from FairyGUI Editor plugins.

Actual package atlas properties

AtlasSettings is the real property object for one atlas entry:

PropertyMeaning
nameAtlas name
compressionWhether compression is enabled
extractAlphaWhether alpha is extracted
packSettingsPacking-parameter object

packSettings is represented by PackSettings, which the editor uses for finer packing control.

Defaults

These defaults come from the actual behavior of editor GlobalPublishSettings.read():

PropertyDefault / rule
pathEmpty string
branchPathEmpty string
packageCount2
compressDesctrue
binaryFormattrue
includeHighResolution0
branchProcessing0
classNamePrefixUI_
memberNamePrefixm_
ignoreNonamefalse
codeTypeEmpty string
allowGenCodetrue
atlasSetting.maxSize2048
atlasSetting.pagingtrue
atlasSetting.sizeOptionpot
atlasSetting.forceSquarefalse
atlasSetting.allowRotationfalse
atlasSetting.trimImageDefaults to true for project version >= 500; otherwise uses the legacy default logic
jpegQuality80

Current fileExtension rules

The current OpenFairyGUI implementation of fileExtension does not reproduce the editor's full project-type matrix. Its formal behavior is:

ScenarioResult
Unity projectAlways bytes
Cocos Creator project with explicit fileExtension in Publish.jsonUses the configured value
Cocos Creator project without explicit fileExtensionDefaults to bin
Other non-Unity project with explicit fileExtensionUses the configured value
Other non-Unity project without explicit fileExtensionFalls back to fui

Explicit CLI target overrides

ofgui publish --project-type layabox publishes for the Layabox target instead of only changing the project-type field. After reading the project settings, the command applies these target rules:

  • the descriptor extension is fui
  • atlas rotation is disabled so the output remains consumable by the current FairyGUI-Layabox runtime

Layabox-supported settings such as includeHighResolution, compression, atlas size, paging, and trimming remain project-configured. Without --project-type, the project-setting rules in the table above remain unchanged.

The Unity and Cocos Creator runtimes do not inflate binary descriptors, so those targets always emit uncompressed data. An explicit API or CLI request for compressed=true / --compressed fails publishing, and persisted compressDesc cannot override this target constraint. Layabox continues to use the project's compression setting.

The non-Unity binary publish contracts formally covered by the repository include:

  • Layabox: sample projects use binaryFormat=true and fileExtension="fui", producing <package-name>.fui.
  • Cocos Creator: without explicit fileExtension, publishing defaults to <package-name>.bin.

Default extensions for other project types documented by the editor must not be treated as implemented OpenFairyGUI behavior. If a project-type rule is not implemented in the repository, it should be absent from the current implementation documentation or explicitly marked unimplemented.

Editor reference matrix for fileExtension

This table preserves FairyGUI Editor's project-type rules as an index for future alignment. It does not mean OpenFairyGUI currently implements publishing for every listed project type.

Project typeResult
UnityAlways bytes
Cocos2dx / Visionfui when binaryFormat=true, otherwise bytes
Cry / Monogame / CoronaAlways fui
CocosCreatorDefaults to bin when unset
H5 projectDefaults to fui when unset
Other projectsDefaults to zip when unset
PropertyMeaning
includeHighResolutionBitmask selecting 2x / 3x / 4x resources
branchProcessingBranch-processing mode
branchPathBranch output path
seperatedAtlasForBranchWhether branch atlases are output separately

includeHighResolution is the bitmask for 2x, 3x, and 4x resource switches: @2x=1, @3x=2, and @4x=4.

Publishing only discovers and links existing @2x / @3x / @4x resources with the same path, branch, and type, such as icon@2x.png corresponding to icon.png. They are emitted as independent image or movieclip package items and referenced by the base item's high-resolution list. Publishing does not scale or enlarge the source bitmap to generate high-resolution resources.

The visible meanings of branchProcessing are:

ValueEditor behavior
0Main includes every branch. Output retains the main branch and all branch content and uses path.
1Merge active branch into main. Output retains only the merged main and currently active branch. Main output uses path; non-main output uses branchPath/<branch> when branchPath is set.

The visible meanings of seperatedAtlasForBranch are:

ConditionEditor behavior
branchProcessing=0 and seperatedAtlasForBranch=falseMain and branch resources may share the same atlas pages
branchProcessing=0 and seperatedAtlasForBranch=trueMain and branch atlases are output separately; branch atlas names receive an _branchName suffix, such as atlas0_dev.png
branchProcessing=1Branches are already merged in the output, so seperatedAtlasForBranch has no separate effect

Editor write-back behavior

When the editor writes Publish.json, current rules include:

ItemWrite-back rule
branchPathWritten only when non-empty
fileExtensionWritten only when the project supports a custom extension
includeHighResolutionWritten only when greater than 0
branchProcessingWritten only when greater than 0
atlasSetting.maxSizeWritten when not 2048
atlasSetting.pagingWritten when true
atlasSetting.forceSquareWritten when true
atlasSetting.allowRotationWritten when true
atlasSetting.trimImageWritten when true
compressPNG / jpegQualityWritten only for projects that do not support atlases

Project write-back boundary

Component XML round-trips preserve supported attribute values and ordered child nodes without promising the source text's attribute arrangement. Attribute order carries no semantics; Gear, relation, extension overrides and list items still follow their respective child-order rules.

Restored images may omit width and height in package.xml so dimensions inferred from published resources are not presented as original declarations. Image reconstruction retains usable dimensions. This omission does not change write-back of declared dimensions in ordinary projects.

Generated font textures and glyph images follow their font within the same package and branch, with textures before glyphs and resource-ID ordering within each group. This does not change resource IDs, references or image contents.

Publish settings do not change the authoring-property semantics of component.xml. Project I/O independently preserves component root properties, root-component customProperty definitions, and Button, Label, ComboBox, ProgressBar, Slider, and ScrollBar instance-extension overrides on component references. See Project XML Attribute Protocol for the corresponding XML contract.

The root designImage, designImageForTest, pageController, showSound, and hideSound fields are formal authoring properties; designImageAlpha defaults to 50. The design reference must target an image resource, show/hide sounds must target sound resources, and pageController must name a controller in the same component. Label, ComboBox, and ProgressBar instance sounds use sound plus percentage volume; ComboBox also stores title color and popup direction through titleColor and direction (auto / up / down).

Layout, render order, scroll area, static items, and tree-behavior attributes for list and tree nodes are also read and written independently according to that XML contract. renderOrder="arch" uses apex for the apex child, while tree nodes preserve behavior through treeView, indent, and clickToExpand.

Documentation boundary

ItemConstraint
FocusReal editor properties, defaults, and serialization rules only
Excluded contentNo internal project types, field mappings, or implementation details
BoundaryThis page describes the editor settings protocol itself, not how a particular project consumes those properties

MIT Licensed