Releases: Ambiguous-Interactive/unity-helpers
Release list
3.6.0
Added
- Add
WallMath.Median,Percentile,MeanandStandardDeviationoverIReadOnlyList<float>,<double>,<int>and<long>, sorting pooled copies so the caller's list is never reordered. See Descriptive Statistics (#742). - Add
SpriteHelpers.RotateTexture90,RotateTexture180andExtractSpriteRect, which produce new textures and leave the source untouched, returning null with a logged reason instead of throwing on unreadable or write-protected textures. See Helper Utilities (#742). - Add
Objects.Sha256Hexfor text (UTF-8) and byte payloads, andObjects.TrySha256HexOfFile, which reports a missing or unreadable file withfalseinstead of throwing. The sprite sheet tooling's private file hash now calls it. See SHA-256 Digests (#742). - Add
EditorUtilities.IsInvokedByTestRunner(), so an editor window can skip fixture-consumingOnEnablework during a test run instead of re-deriving it. Answersfalserather than throwing where the command line is unreadable, and replaces seven private copies. See Editor Utilities (#742). - Fix
ColorExtensionsaveraging (GetAverageColor, dominant and weighted variants) reading channel-swapped pixels fromARGB32andBGRA32textures through the raw fast path; those formats now take the sameGetPixels32path as every other format (#749). - Enforce one member ordering across the codebase: const, events, delegates, static properties, static fields, properties, fields, constructors, static methods, methods, nested types last, each tier public → protected → internal → private including const.
npm run lint:nested-type-placementenforces it (#672). - Add a JesseSort adaptation with linear monotone-input handling and contiguous pile storage, credited to Jesse Lew. See JesseSort (#747).
- Add runtime-length exclusion arrays to
NextEnumExceptfor interface and concrete generators. See Random Generators (#742). - Add
BitOps, a public home for popcount, trailing zero count, floor log2, highest-bit isolation, power-of-two detection and power-of-two ceiling; the private copies inBitSet,ImmutableBitSet, the sorters and the sprite/enum tools now call it. See Helper Utilities (#742). - Add reusable protobuf read limits for encoded bytes, length-delimited fields, tag counts, nesting and cumulative packed-element counts across nested messages. See Serialization (#647).
- Add reusable JSON read limits for nesting, per-container element counts and string or property-name lengths, with a parameterless constructor for generic factories. New
Serializer.JsonDeserializeoverloads refuse an over-budget document before decoding it. See Serialization (#647). - Add
WUH017warnings for a same-objectGetComponentcompared against null, whereTryGetComponentanswers the same question without Unity's Editor allocation. See Analyzers (#741). - Add opt-in exact sprite-art colliders, reusable alpha-mask reading and pixel-boundary tracing, with alpha and minimum-area controls. See Sprite Colliders (#715).
- Add editor-only sprite keyframe times and threshold-based last-motion detection, with renderer-path filtering and selectable bounds edges. See Sprite Animation Motion (#717).
- Add cross-assembly WallstopProto subtypes with static dispatch, inherited private-member support, and collision checks at compilation, project assembly and startup (#612).
- Add malformed-state checks to WallstopProto raw remainder reads; failed reads leave an empty span and preserve the reader position (#647).
- Add unbounded retention, custom key comparers and opt-in removal ownership transfer to
Cache<TKey, TValue>. Shared cache limits now resize existing entries immediately (#703). - Add
WUH015warnings for invalid Unity callback signatures andWUH016warnings for hidden inherited callbacks, using resolved types and inheritance (#654). - Add
Helpers.ClearTagCache(), which drops every cachedHelpers.Find(tag)lookup. A miss costs oneGameObject.FindGameObjectWithTag(#643). - Add
Buffers.ComparerPoolMaxDistinctEntries, which bounds how many distinct comparers the set and dictionary pool caches retain; the least recently used is evicted past it. See Comparer-Keyed Pools (#689). - Add
StringWrapper.MaxCachedWrappersandStringWrapper.CachedCount, which bound and report how many distinct strings the wrapper cache retains; the least recently requested is evicted past it (#694). - Add
SerializableTypeCatalog.MaxCachedFilterResults, which bounds how many distinct type-picker search terms are cached; the least recently used is evicted past it (#694). - Add
PoolTypeResolver.MaxCachedTypeNames, which bounds how many distinct type-name spellings the pool type resolver retains (#643). - Add
PoolStatistics.ApproximatelyEquals(other, tolerance), matching the overloadPoolFrequencyStatisticsalready carries now thatEqualsis exact (#639). - Add
RestorableGlobal<T>, which lends a global for ausingblock and takes it back exactly once, at any nesting depth and in any disposal order, so a copied scope can no longer restore a stale value.WUH014reports the disposable structs that still assign inDispose. See Restorable Globals (#627). - Add Tools > Wallstop Studios > Unity Helpers > Run EditMode/PlayMode Tests With Summary, which starts a test run and writes a pollable summary file to
Temp/for a script driving the editor from outside. See Test Run Reporter (#625). - Ship four validation rules with the package -- unfilled
[WNotNull]slots, broken serializable dictionaries, empty animation keyframes, and script files that misname what they bind -- so the Asset Validation window and CI batch mode have something to check out of the box. See Asset Validation (#675). - Extend
WUH003tois nullandis not nullon aUnityEngine.Object. Both are CLR null tests, so a destroyed object reads as alive exactly as it does through?.. A type pattern is not reported, because it is not a null test at all. See Analyzers (#621). - Add Tools > Wallstop Studios > Unity Helpers > Authored Assets, reports for a type nothing can author, an unfilled
[WNotNull]slot, aSerializableDictionarythat lost its pairing, and an empty keyframe. Reading is never destructive. A file a scan cannot read is named. See Authored Asset Validation (#618, #619, #620, #624, #631, #670). - Add Report Stale Serialized Keys and Repair Stale Serialized Keys In Selection, for keys an asset still records that n...
3.5.1
Fixed
- Unity license lock handoff after CI cleanup: final Unity license returns now emit fail-closed cleanup proof to the organization build lock. Cleanup is bounded and non-masking, failed or cancelled acquisitions still release queued/owned lock state, and only a successful return command or exact allowlisted Unity responses permit the activation slot to enter cooldown instead of quarantine.
Install
- Import the attached
.unitypackageinto a Unity project, or - install
com.wallstop-studios.unity-helpers@3.5.1from npm / OpenUPM through Unity Package Manager.
The release includes the npm tarball and the .unitypackage, each with a .sha256 checksum.
3.5.0
Added
- Asset change detection loop reset utility: Added
AssetChangeDetectionUtility.ResetLoopProtection()so editor tooling can resume[DetectAssetChanged]dispatch after a recursive callback has tripped loop protection, without requiring a domain reload. - Feel-good randomness helpers: Added
ExactAveragePrd,BadLuckProtection, andWeightedShuffleBag<T>for player-facing randomness that reduces streak frustration while keeping deterministic, testable behavior.ExactAveragePrdsolves the pseudo-random distribution coefficient for a configured long-run average,BadLuckProtectionimplements pity-timer chance ramps and optional hard guarantees, andWeightedShuffleBag<T>emits exact weighted ticket counts before repeating. The helpers expose explicit restore APIs so save/load systems can persist pity/deck state.
Fixed
- Optional Odin Inspector integration without unguarded Odin assemblies:
RuntimeSingleton<T>,ScriptableObjectSingleton<T>, andAttributeEffectnow use Odin serialized base classes only when theodininspectorpackage is installed and the package-ownedWALLSTOP_UNITY_HELPERS_ODIN_INSPECTORdefine is active; otherwise they fall back to Unity base classes. Projects that still define the globalODIN_INSPECTORsymbol without shipping Sirenix assemblies no longer fail package compilation, while Odin projects keep the serialized base behavior automatically.
Install
- Import the attached
.unitypackageinto a Unity project, or - install
com.wallstop-studios.unity-helpers@3.5.0from npm / OpenUPM through Unity Package Manager.
The release includes the npm tarball and the .unitypackage, each with a .sha256 checksum.
3.4.0
See the roadmap for details
Added
AssetDatabaseBatchHelper.EnsureAssetFolder/EnsureAssetParentFolder: batch-safe helpers that register every missing folder segment with theAssetDatabase(never via raw disk, which can leave the database out of sync and spawn numbered duplicate folders) and pause any openStartAssetEditingbatch first, so a subsequentAssetDatabase.CreateAssetcannot fail with "Parent directory must exist".
Changed
[WValueDropDown]provider-misconfiguration is now logged as a Warning, not an Error: a null/empty/missing/throwing or wrong-return-type dropdown value provider is a handled condition — the dropdown falls back to an empty option list — soWValueDropDownAttribute/DropDownValueProvidernow log these diagnostics atWarningseverity instead ofError. The message text is unchanged. This better reflects that the feature degrades gracefully, and (as a side effect) stops these editor-tooling diagnostics from failing PlayMode tests that incidentally exercise the dropdown path.DirectoryHelper.EnsureDirectoryExistsno longer logs an error before throwing: passing a path outsideAssets/in the editor previously emitted aDebug.LogErrorand threw anArgumentException(a redundant double signal that polluted the console and could fail unrelated tests that did not expect the log). It now throws theArgumentExceptiononly, and the exception message names the offending path (for example,Cannot create directory 'SomeFolder/SubFolder' outside the Assets folder: AssetDatabase only manages paths under 'Assets/'.). Callers that already catch the exception are unaffected; callers that relied on the console log should read the thrown exception instead.
Fixed
- Unity 6000.3 compatibility for runtime helpers:
Object.GetUnityObjectId,UnityObjectExtensions.FindObjectsOfTypeShim,SceneHelper.EnsureOneComponent, and theRigidbody2Dvelocity helpers now gate Unity 6 APIs by the specific version that introduced them instead of treating every Unity 6000.x editor as equivalent. Unity 6000.3 and earlier supported matrix versions compile through the older overloads while Unity 6000.4+ continues to use the newer no-sort object lookup andEntityId.ToULongpaths. EffectHandlerperiodic catch-up after a long frame: missed periodic ticks now advance on their scheduled interval instead of sliding from the current frame, and unlimited periodic effects are capped per update so a large frame hitch cannot monopolize the player loop. Remaining due ticks continue catching up on subsequent updates.- Protobuf abstract-root deserialization reporting corrupt data instead of a registration error: abstract
[ProtoContract]roots without[ProtoInclude]metadata now require an explicitRegisterProtobufRootmapping before deserialize, so ambiguous abstract roots fail with the documented type-resolution exception instead of falling through to protobuf-net's version-specific corrupt-data / constructor errors. Explicit registrations also take precedence over abstract root heuristics. - Background logging using a stale Unity main-thread capture:
WallstopStudiosLoggernow sharesUnityMainThreadGuard's captured main-thread state, preventing background log calls from being misclassified after test/player lifecycle resets. - Protobuf serialization of an EMPTY
SerializableHashSet/SerializableSortedSet/SerializableDictionary/SerializableSortedDictionarythrowingSerializationInputException("data is empty") on deserialize: an empty collection serializes to a zero-byte payload (the wrapper carries only repeated fields), butProtoDeserializeran its generic empty-payload guard before the collection-wrapper interception, so a valid empty collection could not round-trip. The collection interception now runs first, so an empty collection round-trips to an empty collection; the empty-payload guard still rejects empty input for ordinary (non-collection) message types. Wire format for non-empty payloads is unchanged. - Serialization crashing or silently corrupting data on IL2CPP/AOT standalone players:
Serializernow serializes the affected types through AOT-safe paths instead of protobuf-net's reflection /Reflection.Emitmodel, which under IL2CPP hit the unsupportedGetTypeModifiersicall or bound immutable structs to empty values.Deque<T>,CyclicBuffer<T>, andSparseSetroute through plain array/scalar protobuf wrappers (also fixing a spurious[ProtoAfterDeserialization]ArgumentOutOfRangeException);FastVector2Int,FastVector3Int,ImmutableBitSet, andParabolaroute through mutable protobuf surrogates.Serializer.JsonStringify/JsonSerializeof anonymous types (and other types lacking a public parameterless constructor) now use a reflection-light writer instead of System.Text.Json's parameterized-constructor converter, which has no AOT code under IL2CPP. A packagelink.xmlpreserves the serialization assemblies. JSON output and protobuf round-trip values are unchanged on mono / editor. The package pre-registers the common element specializations (int,long,float,double,bool,string,Vector2,Vector3,Vector2Int,Vector3Int,FastVector2Int,FastVector3Int); consumers that store a custom value-type element in aDeque<T>orCyclicBuffer<T>must register thatTfor AOT themselves (reference-type elements share a single generic specialization and need no registration). - Relational component attributes (
[SiblingComponent]/[ChildComponent]/[ParentComponent]) crashing or resolving the wrong components on IL2CPP/AOT players: the collection fast-path built a runtime generic accessor viaExpression.Compile(), which IL2CPP cannot service (it threw at runtime). It now uses the AOT-safe non-genericGetComponents/GetComponentsInChildren/GetComponentsInParent(Type, …)overloads. Include-inactive filtering also wrongly treated every component as enabled on IL2CPP (a reflection delegate path that silently failed), so disabled components were not filtered out; the enabled state is now read AOT-safely. Behavior on mono / editor is unchanged. [WNotNull]validation (this.CheckForNulls()) silently doing nothing in player builds: the null check was compiled only into the editor, so it never threwArgumentNullExceptionfor a null[WNotNull]field in a built player. It now runs in every build (AOT-safe) exactly as the API documents, so missing required references fail fast at runtime instead of being silently ignored.[ValidateAssignment]validation (this.ValidateAssignments()) silently doing nothing in player builds: likeCheckForNulls, the warning pass was compiled only into the editor (while the siblingAreAnyAssignmentsInvalidalready ran everywhere), so unassigned fields were never reported in a built player. It now runs in every build (AOT-safe), consistent withAreAnyAssignmentsInvalid.ScriptableObjectSingletonassets not regenerating on Unity 6 after the asset file was deleted: when a singleton's.assetwas removed but its.metaremained, Unity 6000.3+ retains the path-to-GUID mapping, whichScriptableObjectSingletonCreatortreated as "path already occupied" and skipped recreation. Creation decisions now key on the asset body file, so the singleton is recreated on every Unity version.AssetDatabase.CreateAssetfailing with "Parent directory must exist" / "Creating asset at path … failed": editor utilities that create assets —ScriptableObjectSingletonCreator,ScriptableObjectSingletonMetadataUtility,AttributeMetadataCacheGenerator,PersistentDirectorySettings, and the sprite/atlas/animation creator windows — now ensure the parent folder is registered with theAssetDatabasebefore creating the asset, including while anAssetDatabasebatch is open (common under-batchmode). Previously, creating an asset in a not-yet-registered folder could fail or be skipped.- Unity 6 deprecation warnings from
Object.FindObjectsOfType/FindObjectOfType: runtime DI-integration code (Reflex / VContainer / Zenject) now routes object lookups through a version-gated shim that usesFindObjectsByType/FindFirstObjectByTypeon Unity 2022.2+ (including Unity 6) and the legacy API below it, eliminating the deprecation warnings while preserving behavior. MonoBehaviour.ExecuteFunctionAfterFramecallback never firing in headless/batch mode: the helper yieldedWaitForEndOfFrame, which never resumes under-batchmode -nographics(no end-of-frame render signal), so the queued callback was silently dropped on headless players, dedicated servers, and CI. It now advances a single frame in batch mode (the headless-safe equivalent) and continues to useWaitForEndOfFramein interactive/graphical sessions, so the callback runs in every environment.
Install
- Import the attached
.unitypackageinto a Unity project, or - install
com.wallstop-studios.unity-helpers@3.4.0from npm / OpenUPM through Unity Package Manager.
The release includes the npm tarball and the .unitypackage, each with a .sha256 checksum.
3.3.0
Changelog
Added
- Failed Tests Exporter: New editor utility that hooks into the Unity Test Runner to automatically capture test failures and export them to timestamped text files
- Automatically records test name, failure message, and stack trace for each failed test
- Configurable output directory with a visual folder picker — defaults to the project root if not set
- Path validation on every use: falls back to the project root if the configured directory is missing, invalid, or outside the project
- Menu items under
Tools > Wallstop Studios > Unity Helpersto export or clear captured failures - Disabled by default — enable via
Project Settings > Wallstop Studios > Unity Helpers
Fixed
- Editor asset import-loop pressure from unchanged metadata saves:
ScriptableObjectSingletonMetadataandAttributeMetadataCachenow skipSetDirty/SaveAssetswork when regenerated metadata is unchanged. This prevents initialize-on-load and explicit singleton ensure passes from repeatedly re-saving identical assets during Unity test runs or editor refreshes, reducing the chance of Unity's "infinite import loop" detector tripping on native runs. AssetPostprocessorDeferraldedup regressing structurally-equal-but-distinct drains:AssetPostprocessorDeferral.Schedulenow dedups pending drains viaReferenceEqualsinstead ofList<Action>.Contains(which invokesDelegate.Equals). The prior structural-equality behavior silently coalesced two distinct delegates that shared the sameMethod+Target-- common when a local helper returns a lambda that captures only outer-method variables -- so a self-rescheduling drain could be dropped entirely. Matches the documented intent in the AssetPostprocessor safety skill and is pinned by the newScheduleStructurallyEqualButDistinctDelegatesAreNotDeduplicatedregression test- WButton conflict warnings hidden in collapsed foldouts: Fixed group conflict warnings (placement, priority, and draw order) not rendering when foldout groups are collapsed. Conflict warnings now render in the group header area regardless of foldout expansion state, and warning cache population is validated across collapsed, expanded, and always-open foldout behavior.
- Spurious "SendMessage cannot be called..." warnings from asset processors: Eliminated spurious "SendMessage cannot be called during Awake, CheckConsistency, or OnValidate" warnings from
DetectAssetChangeProcessorand related editor processors (LlmArtifactCleaner,SpriteLabelProcessor) by deferring callback invocation out of Unity's asset-import phase via a sharedAssetPostprocessorDeferralhelper backed byEditorApplication.delayCall. The prior synchronous path calledAssetDatabase.LoadAllAssetsAtPath/GetComponentsInChildren/ user callbacks during the import phase, which triggered Unity's internal sprite/renderer lifecycle relays and produced per-import warning storms. A new opt-out setting (Project Settings > Wallstop Studios > Unity Helpers > Detect Asset Changes, option Defer Post-process Callbacks, default on) restores the old synchronous behavior for users who require it. (#234) - Pool auto-purge throttle dropping real purges: Fixed
WallstopGenericPool<T>.PurgeInternalCoreletting the 1-secondMinAutoPurgeIntervalSecondsthrottle blockMaxPoolSizeenforcement. A Rent/Return that advanced_lastAutoPurgeTimeon a healthy-pool scan would block a subsequent same-tick call that pushed the pool pastMaxPoolSize, silently skipping theCapacityExceededpurge and dropping the matchingOnPurgenotification. The throttle now has two orthogonal rules: (1) when the pool is observably overMaxPoolSize, the throttle is bypassed entirely so a burst of returns cannot accumulate beyond capacity within a single clock tick; (2) otherwise the throttle still rate-limits scans (preserving the O(1) amortized fast path for healthy pools under contention). The multithreaded variant also guards the timestamp advance with CAS max-semantics so concurrent out-of-order writes cannot regress the throttle clock. Applies to both the multithreaded and SINGLE_THREADED pool variants - Pool performance regression from O(n) usage tracking: Fixed
RollingHighWaterMark(used by pool purge system) performing O(n) operations on every pool rent/return, causing 100x slowdowns under sustained load. ReplacedList<Sample>withCyclicBuffer<Sample>for O(1) add/remove, added incremental running sum for O(1) average computation, and added a monotonic deque for O(1) amortized peak tracking. Previously, 100K rent/return cycles took 20+ seconds; now completes within 200ms budget - TexturePlatformOverrideEntryDrawer render-phase mutations: Fixed
OnGUIwriting toSerializedPropertyvalues every frame withoutBeginChangeCheck/EndChangeCheckguards. Direct assignments likeapply.boolValue = EditorGUI.ToggleLeft(...)andnameProp.stringValue = EditorGUI.TextField(...)dirtied theSerializedObjecton every repaint, corrupting undo history. Also removed a redundant render-phase writeback of the computed display label to the platform name property - TexturePlatformOverrideEntryDrawer GenericMenu undo and Custom handling: Fixed
GenericMenucallback not callingUndo.RecordObjectsbefore mutation and not handling the "Custom" menu option. Selecting "Custom" from the dropdown now correctly sets the platform name tostring.Empty(triggering custom mode), and all selections are undoable - SourceFolderEntryDrawer render-phase mutation: Fixed
EnumFlagsFieldfor selection mode writing tomodeProp.intValueevery frame without aBeginChangeCheck/EndChangeCheckguard - AttributeMetadataCache generator path mismatch: Fixed
AttributeMetadataCacheGenerator.GetOrCreateCache()using hardcoded asset paths that did not match the[ScriptableSingletonPath("Wallstop Studios/Unity Helpers")]attribute onAttributeMetadataCache. The generator was creating and loading the cache asset fromAssets/Resources/Wallstop Studios/instead of the correctAssets/Resources/Wallstop Studios/Unity Helpers/path, causing cache generation to silently fail when the singleton was already loaded at the correct path - IntDropDown invalid value handling: Fixed
IntDropDownDrawerto properly handle property values that fall outside the configured options. Invalid values (values not in the options array) are now preserved without modification during render and clearly displayed with an "(Invalid)" suffix. Previously, invalid values were displayed as-is without any visual indication. The UI ToolkitIntDropDownSelector.GetDefaultValue()now returns the first option instead of 0 - Linux dropdown rendering phantom rows: Replaced all
EditorGUI.Popupusage withGenericMenu-based dropdowns to eliminate phantom empty rows when selected index is -1 on Linux. Affected drawers:WValueDropDownDrawer,IntDropDownDrawer,StringInListDrawer,TexturePlatformOverrideEntryDrawer(standard variants), andWValueDropDownOdinDrawer,IntDropDownOdinDrawer,StringInListOdinDrawer(Odin Inspector variants). Odin drawers now always useGenericMenuregardless of the page limit setting, sinceGenericMenuhandles all list sizes correctly without the rendering issues that required the threshold (#209) - Multi-object editing for WValueDropDown: Added typed
SerializedPropertysetters for Unity-native types (Vector2,Vector3,Vector4,Color,Rect,Bounds,Quaternion,AnimationCurve,Hash128, and theirIntvariants) inWValueDropDownDrawer.ApplyOptionto avoid the reflection fallback for known property types. The generic reflection path now iterates over allserializedObject.targetObjectsfor proper multi-object editing support instead of only updating the first selected object - SerializableSet undo not working for add, clear, sort, and commit operations: Fixed
TryClearSet,TryAddNewElement,TryCommitPendingEntry,AppendNullPlaceholderEntry, andTrySortElementsinSerializableSetPropertyDrawernot callingUndo.FlushUndoRecordObjects()after direct object mutation. These methods usedUndo.RecordObjectsto snapshot pre-change state but never finalized the undo record, causingUndo.PerformUndo()to silently do nothing - GUIContent GC pressure in drawer OnGUI: Fixed per-frame
GUIContentallocations inIntDropDownDrawer.DrawGenericMenuDropDownandPoolTypeConfigurationDrawer.OnGUIthat created avoidable garbage collection pressure in the Inspector. Both drawers now reuse staticGUIContentinstances (consistent withWValueDropDownDrawerandStringInListDrawerwhich already followed this pattern)
Pull Requests
- 3.3.0 Release (#252) Eli Pinkerton (@wallstop)
- Show WButton group conflict warnings when foldouts are collapsed (#251) @copilot-swe-agent[bot]
- Fix release-drafter auto-tag to use normalized semver version instead of hash (#250) @copilot-swe-agent[bot]
- Fix semantic sorting for benchmark Speed/Quality columns on GitHub Pages (#249) @copilot-swe-agent[bot]
- Fix SendMessage Warnings (#248) Eli Pinkerton (@wallstop)
- Various Bug Fixes (Undo, Pool Auto-Purge) (#247) Eli Pinkerton (@wallstop)
- Enable UPM inline changelog rendering, fix meta-lint CI regression, and harden changelog packaging contract test (#241) @copilot-swe-agent[bot]
- Add explicit unsigned UPM signature metadata and enforce it via regression test (#240) @copilot-swe-agent[bot]
- Fix devcontainer publish failures on arm64 and harden regression contract checks (#239) @[copilo...
3.2.1
Changelog
Fixed
- WValueDropDown empty rows in dropdown: Fixed
WValueDropDownandStringInListdropdowns showing empty/blank rows at the top of the dropdown list, particularly on Linux. Clamped invalid-1selected indices to0inWValueDropDownDrawerandStringInListDrawer, and hardened dropdown display logic to replace empty labels with descriptive fallback text (#209) - Dropdown display label normalization: Fixed search, filter, suggestion, and selected-value display in
WValueDropDown,StringInList, and popup dropdown windows not applying the(Option N)fallback label consistently, causing items with empty display labels to be unsearchable and the wrong option to appear selected (#213)
Pull Requests
- Fix WValueDropDown + Documentation List Rendering Issues (#213) Eli Pinkerton (@wallstop)
- Update issue template (#211) Eli Pinkerton (@wallstop)
- Add NPM package validation to CI/CD (#206) @copilot-swe-agent[bot]
- Fix changelog visibility in Unity Package Manager (#205) @copilot-swe-agent[bot]
Contributors
@Copilot, Dependabot (@dependabot)[bot], Eli Pinkerton (@wallstop), copilot-swe-agent[bot] and dependabot[bot]
3.2.0
Changelog
Fixes
- Animation Creator creating corrupted animations
- "Destroying assets is not permitted to avoid data loss" on Asset Domain Reload issue
Pull Requests
- Fix Editor Tooling (#204) Eli Pinkerton (@wallstop)
- Dev/wallstop/scriptable object fixes (#202) Eli Pinkerton (@wallstop)
- Fix: Release drafter uses auto-calculated next version instead of package.json (#198) @copilot-swe-agent[bot]
Contributors
@Copilot, Eli Pinkerton (@wallstop) and copilot-swe-agent[bot]
3.1.8
Changelog
Fixed
- Unity 6.3 unsigned package warning: Added
"signature": "unsigned"field to package.json to explicitly mark the package as unsigned for Unity 6.3+. This prevents Unity from showing a warning that the package is missing a signature. The change is backwards compatible with older Unity versions and works with OpenUPM, npm, and git URL installations. - WGroup not working in Unity 6000.x: Fixed WGroup attributes not rendering in Unity 6 by using named parameter syntax for
CustomEditorattribute'seditorForChildClassesparameter. This change is backward compatible with Unity 2022 and earlier versions.
Pull Requests
- Fix formatting (#194) Eli Pinkerton (@wallstop)
- Fix RuntimeInitializeOnLoadMethod for generic singletons in Unity 6.3 (#191) @copilot-swe-agent[bot]
- Fix WNotNull duplicate warnings in Odin Inspector (#192) @copilot-swe-agent[bot]
- Fix WGroup not rendering in Unity 6000.x (#193) @copilot-swe-agent[bot]
Contributors
@Copilot, Dependabot (@dependabot)[bot], @github-actions[bot], Eli Pinkerton (@wallstop), copilot-swe-agent[bot], dependabot[bot] and github-actions[bot]
3.1.7
Changelog
Pull Requests
- DetectAssetChangeProcessor bug fix (#182) Eli Pinkerton (@wallstop)
Contributors
Dependabot (@dependabot)[bot], Eli Pinkerton (@wallstop) and dependabot[bot]
3.1.6
Changelog
Fixed
- Banner SVG Issues: Various issues relating to Unity Helpers banner SVG rendering
- Documentation nested list rendering: Fixed GitHub Pages rendering where nested bullet lists appeared flat without proper indentation (#175)
- Documentation too self-congratulatory: Toned down the documentation to be more realistic and less LLM-speak
Pull Requests
- Bump version (#178) Eli Pinkerton (@wallstop)
- Fix list formatting (#177) Eli Pinkerton (@wallstop)
- Potential github pages fixes (#174) Eli Pinkerton (@wallstop)
- Banner SVG fixes (#173) Eli Pinkerton (@wallstop)
- Less LLM-ified Documentation (#170) Eli Pinkerton (@wallstop)
- GH Pages overhaul (#169) Eli Pinkerton (@wallstop)
- Update release drafter to be more aligned with repo vision (#165) Eli Pinkerton (@wallstop)
Contributors
Dependabot (@dependabot)[bot], Eli Pinkerton (@wallstop) and dependabot[bot]