C# SDK Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.20.1] - 2026-10-18
Section titled “[0.20.1] - 2026-10-18”- Godot: The Inspector now rebuilds when the editor plugin is enabled or disabled, so the config ID dropdowns appear or disappear without reopening the scene.
[0.20.0] - 2026-10-07
Section titled “[0.20.0] - 2026-10-07”- SDK: Added the
Clonemethod toWeightedPool<T>.
Changed
Section titled “Changed”- SDK:
I18n.Textnow returns the key instead of throwingArchmageExceptionwhen no translation is found.
[0.19.0] - 2026-10-01
Section titled “[0.19.0] - 2026-10-01”- Godot: Added the
Shadop.Archmage.Godotpackage withGodotFileAccessFS,GodotAtlasLogger,GodotJsonSettingsFactory, and conversions to Godot types. - Godot: Added the
ArchmageDevproject with integration tests, aConfLoaderdemo, and demos of config ID dropdowns in the Inspector. - SDK: Added
UnityAddressablesGreedyFS, which caches all files of a bundle on the first read to avoid one frame per file on WebGL. - SDK: Added
AtlasOptions.WithMainThreadParsing. When enabled, each atlas item is parsed on the main thread after its read completes, rather than on a thread pool thread. Unity WebGL builds always parse this way. - SDK: Added
workerThreadLoadingtoLoadAtlasAsync, which runs the whole load on the thread pool and onlyOnLoadedon the caller’s context. - SDK: Added
IFS.MainThreadOnly, which indicates whether a file system is restricted to the main thread and therefore cannot run on worker threads. - SDK: Added
ValueWrapperTypeConverter.Register, which the generatedConfigAtlascalls so thatCfgIddictionary keys can be read in Godot.
Changed
Section titled “Changed”- SDK: The loader calls
IFSon the caller’s context, withoutConfigureAwait(false), so Unity file systems use main-thread-only APIs directly. - SDK: Atlas items load concurrently: the files of an item are read together, then the item is deserialized on the thread pool while reading continues.
WithMaxConcurrency(default 32) limits the items in flight. - SDK:
IFS.FileExistsandIFS.DirectoryExistsmay return true for a missing path; the loader skips override files that turn out to be missing.ReadAllBytesandReadAllBytesAsyncmust throwFileNotFoundExceptionfor a missing file. - SDK:
MergeL10nFileAsyncparses l10n files on the thread pool. - Unity:
UnityAddressablesFSresolves the location before loading, so a missing override file no longer logs anInvalidKeyException, andUnityAddressablesFSreads the result directly from a completed handle instead of resuming a frame later. - Unity:
UnityStreamingAssetsFStreats a 404 response as a missing file, and any other failure as a load failure.
Removed
Section titled “Removed”- SDK: Removed
WithLoadStrategyandWithAsyncLoadStrategy.
- SDK: Loading no longer mutates the caller’s
JsonSerializerSettingsorAtlasOptions. - SDK: On Unity WebGL,
LoadAtlasno longer hangs andLoadAtlasAsynccompletes.
[0.18.0] - 2026-09-24
Section titled “[0.18.0] - 2026-09-24”Changed
Section titled “Changed”- Tests: Rebuilt the integration tests on the self-contained SDK test data shared with the Go SDK, and check every
XRefbinding after each golden scenario. - Unity:
ArchmageDevnow uses the SDK test data, with its scripts moved into theArchmageDevCoreassembly.
- SDK: Dumped enum-keyed dictionaries now use numeric keys, matching the exported JSON and the Go SDK, instead of Newtonsoft’s enum names.
[0.17.0] - 2026-09-09
Section titled “[0.17.0] - 2026-09-09”- Added
AtlasOptions.WithVariant(key, variant)for non-default variant selection. - MinMax: Added
Durationsupport toMinMax<T>, includingSampleextension methods for .NET and Unity.
[0.16.0] - 2026-07-31
Section titled “[0.16.0] - 2026-07-31”Changed
Section titled “Changed”- SDK: Renamed the
single/multiplemapping strategies tovariant/manyinatlas.json. - Unity Editor:
ArchmageEditorToolsnow bindsCfgIddrawers to the runtime atlas once it appears instead of loading a separate editor copy.
[0.15.2] - 2026-07-12
Section titled “[0.15.2] - 2026-07-12”- SDK: Added
SampleWithandSampleIndexWithmethods toWeightedPool<T>.
[0.15.0] - 2026-06-11
Section titled “[0.15.0] - 2026-06-11”- SDK: Added
WeightedPool<T>for weighted random sampling, withWeightedPoolExtensions.
Changed
Section titled “Changed”- I18n: Annotated
GetTextout parameter with[NotNullWhen(true)].
[0.14.0] - 2026-05-31
Section titled “[0.14.0] - 2026-05-31”- SDK: Added
MinMax<T>struct for representing a numeric range withMinandMaxvalues. - SDK: Added
MinMaxExtensionscontainingSystem.Random-basedSampleoverloads for all numeric types. - Unity: Added
UnityMinMaxExtensionscontainingSampleoverloads using Unity’s globalRandomgenerator.
Changed
Section titled “Changed”- Unity: Renamed
RgbaExtensionstoUnityRgbaExtensionsandVecExtensionstoUnityVecExtensionsfor consistency.
[0.13.1] - 2026-05-24
Section titled “[0.13.1] - 2026-05-24”Changed
Section titled “Changed”- SDK: Made
Tup1–7mutable by restoring setters ({ get; }→{ get; set; }) to allItemXproperties. - SDK: Removed
IEquatableinterface implementation fromTup1throughTup7classes. - SDK: Deleted custom
Equals,GetHashCode, and equality operator overloads inTup1throughTup7.
[0.13.0] - 2026-05-24
Section titled “[0.13.0] - 2026-05-24”Changed
Section titled “Changed”- SDK: Made
Tup1–7item properties read-only ({ get; set; }→{ get; }). - SDK: Replaced custom Newtonsoft.Json converters for
Vec2/3/4with[JsonProperty]attributes. - Unity: Simplified
UnityVector2/3/4JsonConverterto delegate serialization throughVec2/3/4, removing manual property-by-property read/write logic.
[0.12.0] - 2026-05-07
Section titled “[0.12.0] - 2026-05-07”- Logger: Implement
ARCHMAGE_DISABLE_DEFAULT_LOGGERconditional compilation symbol to allow manual suppression of default console logging (automatically disabled in Unity environments).
Changed
Section titled “Changed”- SDK: Changed vector (
Vec2/3/4) and Unity vector types to use object-based JSON serialization instead of arrays, ensuring null deserializes to zero vectors. - SDK: Added
unmanagedconstraint to vector types and optimized equality comparisons.
[0.11.0] - 2026-04-24
Section titled “[0.11.0] - 2026-04-24”- Unity:
Vec2/3/4extension methods to convert toUnityEngine.Vector2/3/4andVector2/3Intwith zero-allocation support for 10 numeric types. - Docs: Documentation for Unity Inspector dropdowns and
ArchmageEditorTools.csexamples.
[0.10.0] - 2026-04-10
Section titled “[0.10.0] - 2026-04-10”- Unity Editor:
CfgIdDrawer<TValue>abstract base,IntCfgIdDrawer<TId, TValue>,StrCfgIdDrawer<TId>property drawers, andEasyDropdown<TValue>IMGUI dropdown for config ID selection. AtlasLoadEvent.ItemsQueuedstage to report total item count before loading begins.WithOverrideFS: optionalrootPathparameter to resolve override files relative to a subdirectory within a custom filesystem.
Changed
Section titled “Changed”- Unity: flattened SDK files from
Runtime/Sdk/toRuntime/.
[0.9.0] - 2026-04-07
Section titled “[0.9.0] - 2026-04-07”Rgbastruct with hex string parsing (#RRGGBB/#RRGGBBAA), equality,IZerosupport, andRgbaJsonConverterfor Newtonsoft.Json; alpha is omitted from output whenA == 0xFF.- Unity:
RgbaExtensions.ToColor()mapsRgbachannels [0, 255] toUnityEngine.Color[0, 1].
[0.8.0] - 2026-04-06
Section titled “[0.8.0] - 2026-04-06”Changed
Section titled “Changed”- Renamed namespace and assembly from
Shadop.ArchmagetoShadop.Archmage.Sdk.
[0.7.0] - 2026-04-01
Section titled “[0.7.0] - 2026-04-01”- Docs: GitHub Package Manager git URL as primary Unity install method.
Changed
Section titled “Changed”- Renamed
XRef.RawValuetoXRef.CfgId.
[0.6.0] - 2026-03-29
Section titled “[0.6.0] - 2026-03-29”Changed
Section titled “Changed”- Unity: Removed
Samples~directory; integration adapters are now first-class Runtime assemblies. - Config tables now include
idin JSON serialization output.
[0.5.0] - 2026-03-22
Section titled “[0.5.0] - 2026-03-22”- Added
NullLoggerthat discards all log output.
[0.4.0] - 2026-03-18
Section titled “[0.4.0] - 2026-03-18”- Added
UnityJsonSettingsFactoryfor JSON serialization of Unity types.
Changed
Section titled “Changed”- Refactored JSON settings handling: renamed
CreateJsonSerializerSettings()toCreateJsonDumpSettings().
[0.3.1] - 2026-03-17
Section titled “[0.3.1] - 2026-03-17”- Fixed typo
GetPreferredLangugetoGetPreferredLanguageinL10n.
[0.3.0] - 2026-03-17
Section titled “[0.3.0] - 2026-03-17”- Added
IZerointerface andValueWrapperJsonConverter/ValueWrapperTypeConverterfor better primitive wrapper support. - Added
IFSsupport andMergeL10nFileAsyncvariant toMergeL10nFileinI18n. - New documentation site built with Astro and Starlight.
Changed
Section titled “Changed”- Improved
L10nAPI: replacedText(lang)with aTextproperty that usesGetPreferredLanguage. - Removed
[Archmage]prefix fromUnityAtlasLoggerfor cleaner logs.
[0.2.0] - 2026-03-14
Section titled “[0.2.0] - 2026-03-14”- Unity:
Resources,StreamingAssets, andAddressablesfile system implementations - Unity: Integration samples and
changelogUrladded topackage.json
[0.1.1] - 2026-03-12
Section titled “[0.1.1] - 2026-03-12”- NuGet package publishing support: package metadata, Source Link, and XML documentation generation
Changed
Section titled “Changed”- Clarified override merge rules in documentation
- Updated OpenUPM scoped registry configuration in installation docs
[0.1.0] - 2026-03-11
Section titled “[0.1.0] - 2026-03-11”- Initial release
- Atlas loading system with sync/async support, layered overrides, and whitelist/blacklist filtering
- JSON serialization via Newtonsoft.Json (com.unity.nuget.newtonsoft-json)
- Duration type with nanosecond precision
- Vec2, Vec3, Vec4 typed vectors
- Tup1–Tup7 heterogeneous tuples
- XRef type for cross-table references
- I18n internationalization with language fallback
- DateTimeOffset JSON converter