Releases: wallstop/unity-helpers
Releases · wallstop/unity-helpers
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) @wallstop
- Update issue template (#211) @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[bot], @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) @wallstop
- Dev/wallstop/scriptable object fixes (#202) @wallstop
- Fix: Release drafter uses auto-calculated next version instead of package.json (#198) @copilot-swe-agent[bot]
Contributors
@Copilot, @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) @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[bot], @github-actions[bot], @wallstop, copilot-swe-agent[bot], dependabot[bot] and github-actions[bot]
3.1.7
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) @wallstop
- Fix list formatting (#177) @wallstop
- Potential github pages fixes (#174) @wallstop
- Banner SVG fixes (#173) @wallstop
- Less LLM-ified Documentation (#170) @wallstop
- GH Pages overhaul (#169) @wallstop
- Update release drafter to be more aligned with repo vision (#165) @wallstop
Contributors
@dependabot[bot], @wallstop and dependabot[bot]
3.1.5
ScriptableObjectSingleton Linux Potential Fix
[3.1.4]
Added
- ScriptableObjectSingletonMetadata Sync Button: Added a
Syncbutton toScriptableObjectSingletonMetadatainspector that re-scans all assemblies forScriptableObjectSingleton<T>types and updates their metadata entries. This allows manually refreshing singleton metadata when assets are added, moved, or renamed.
Fixed
- ScriptableObjectSingletonCreator race condition: Fixed issue where newly created singleton assets were immediately deleted because
LoadAssetAtPathreturned null before Unity's AssetDatabase had indexed the file. The fix adds a synchronous import afterCreateAssetand avoids deleting on-disk files when the file exists but isn't visible to the AssetDatabase yet.
3.1.3
[3.1.3]
Added
- AnimationCreator Configuration Persistence: Save and load AnimationCreator settings to JSON files alongside sprite source folders.
- Configurations are automatically saved as
.animation-creator.jsonin sprite source directories - Auto-loads existing configurations when source folders are selected
- Save individual or all configurations with dedicated UI buttons
- Reset to defaults with optional config file deletion
- Preserves all settings including animation data, framerate curves, regex patterns, and grouping options
- Configurations are automatically saved as
- AnimationCreator Pagination: Animation data list now uses pagination (20 items per page) for better performance with large animation sets
Fixed
- AnimationCreator editor performance: Significantly improved scrolling and editing responsiveness when working with animation data.
- ScriptableObjectSingletonCreator retry exhaustion: Fixed issue where new singleton assets would fail to create with "Maximum automatic retry attempts reached" even when specifying paths.
- Animation Copier diff detection: Fixed issue where copied animations were incorrectly detected as "changed" instead of "unchanged" after copy operations.
3.1.2: Fix `scripts/tests.meta` file issue in npm package (#145)
[3.1.2]
Fixed
- Updated npmignore to align more closely with gitignore. The
scripts/testsmeta file error when sourcing from npm should be gone.
[3.1.1]
Fixed
- WInLineEditorOdinDrawer now compiles.
3.1.0: Maybe Fix GitHub Pages (#140)
[3.1.0]
Added
- Pool Access Frequency Tracking: Intelligent purge decisions based on pool usage patterns
- Memory Pressure Detection: Proactive memory monitoring for intelligent pool purging
- Cross-Pool Global Memory Budget: Prevents aggregate memory bloat across all pools
- Size-Aware Purge Policies: Large objects (above LOH threshold) get stricter purge policies
WallstopGenericPool<T>automatically uses size-aware options during construction
- SpriteSheetExtractor: New editor tool for extracting individual sprites from sprite sheet textures.
- This is an ALPHA feature, much functionality is currently broken.
- Cache Data Structure: New high-performance, configurable
Cache<TKey, TValue>with fluent builder API- Multiple eviction policies: LRU, Segmented LRU (SLRU), LFU, FIFO, and Random
- Time-based expiration with
ExpireAfterWriteandExpireAfterAccess - Weight-based sizing for entries of varying cost
- Dynamic growth with configurable thrash detection
- Loading cache support with
GetOrAddand custom loader functions - Thread-safe by default (single-threaded mode via
SINGLE_THREADEDdefine) - Eviction, get, and set callbacks for monitoring cache behavior
- Statistics tracking with hit/miss counts
- CachePresets: Factory methods for creating pre-configured caches optimized for common gamedev scenarios
- AnimationCreator Variable Framerate: AnimationCreatorWindow now supports variable framerate animations using AnimationCurve
- New
FramerateModeenum (ConstantorCurve) for choosing timing mode - Per-animation
framesPerSecondCurveallows custom timing across animation progress - Curve presets: Flat, Ease In, Ease Out, and Sync with constant FPS
- Frame timing preview shows per-frame durations before generation
- New
- AnimationCreator Live Preview: Real-time animation preview panel
- Play/pause/stop transport controls for preview playback
- Frame scrubber for manual frame navigation
- Respects variable framerate curves during preview
- Shows current frame index and FPS in preview panel
- AnimationData Cycle Offset: New
cycleOffsetproperty (0-1) sets animation loop start point - Pool Auto-Purging:
WallstopGenericPool<T>now supports configurable auto-purging and eviction- New
PoolOptions<T>class for configuring pool behavior at construction MaxPoolSizelimits pool capacity with automatic eviction of excess itemsIdleTimeoutSecondspurges items that have been idle too longPurgeTriggerflags control when purging occurs:OnRent,OnReturn,Periodic, orExplicitOnPurgecallback withPurgeReason(IdleTimeout, CapacityExceeded, Explicit) for monitoring- Intelligent purging mode tracks usage patterns to avoid purge-allocate cycles
MinRetainCountensures a minimum number of items are always kept
- New
- Application Lifecycle Hooks for Pool Purging: Automatic pool purging in response to system events
Application.lowMemorytriggers emergency purge (ignores hysteresis, purges toMinRetainCount)Application.focusChangedtriggers purge when app backgrounds (mobile platforms)- New
PurgeReasonvalues:MemoryPressure,AppBackgrounded,SceneUnloaded(reserved) - Configurable via
PoolPurgeSettings.PurgeOnLowMemoryandPoolPurgeSettings.PurgeOnAppBackground GlobalPoolRegistrytracks all pool instances for cross-pool operationsPoolPurgeSettings.PurgeAllPools()method for manual global purge- Lifecycle hooks automatically registered via
RuntimeInitializeOnLoadMethod
- RandomExtensions
NextOfExcept: New extension methods for selecting random elements with exclusionsNextOfExcept(values)- no exclusions (convenience overload)NextOfExcept(values, exception1...)- exclude values- Zero-allocation using pooled collections internally
Changed
-
BREAKING: Pool purging now enabled by default with conservative settings
GlobalEnableddefaults totrue(wasfalse)DefaultBufferMultiplierdefaults to2.0(was1.5)DefaultHysteresisSecondsdefaults to120(was60)DefaultSpikeThresholdMultiplierdefaults to2.5(was2.0)- Use
PoolPurgeSettings.DisableGlobally()to restore previous behavior UnityMainThreadDispatcherauto-load behavior has changed from auto-loading to not auto-loading.UnityMainThreadDispatcherhide flags have been changed toNone.
-
DictionaryExtensions
ToDictionary: Now uses last-wins semantics for duplicate keys instead of throwingArgumentException- Aligns with common dictionary initialization patterns
- Applies to both
KeyValuePair<K,V>and tuple(K, V)overloads
-
IEnumerableExtensions return types:
OrderBy,Ordered, andShuffledmethods now returnList<T>instead ofIEnumerable<T>for improved usability (indexable, known count)- Note: These methods now use eager evaluation (execute immediately) instead of deferred evaluation
- Source code remains compatible—
List<T>is assignable toIEnumerable<T>
Improved
- LRU cache eviction: Bounded editor caches now use LRU (Least Recently Used) eviction instead of FIFO
- Frequently-accessed cache entries are retained longer, improving cache hit rates
- Both reads and writes update an item's "recency", preventing hot items from being evicted
- Affects
EditorCacheHelper.AddToBoundedCacheand newTryGetFromBoundedLRUCachemethod - Applied to
InLineEditorShared,WShowIfPropertyDrawer, and other bounded editor caches
- Shuffled performance:
IEnumerableExtensions.Shufflednow uses O(n) Fisher-Yates shuffle instead of O(n log n) sort-based approach - LINQ elimination: Removed LINQ usage across runtime code for reduced allocations and improved performance
- Affects
Trie,Geometry,Serializer,ValidateAssignmentAttribute,WShowIfAttribute, relational component attributes, and more - Uses pooled collections and explicit loops instead of LINQ methods
- Zero-allocation patterns applied throughout
- Affects
- GlobalPoolRegistry.EnforceBudget() zero-allocation: Replaced per-call
List<IPoolStatistics>allocation with static reusable list protected by existing lock
Fixed
- Cache pre-allocation OutOfMemoryException: Fixed production bug where
Cache<TKey, TValue>would pre-allocate internal storage toMaximumSizeinstead of using a small initial capacity- Creating a cache with
MaximumSize = int.MaxValuenow works correctly instead of throwingOutOfMemoryException - New
InitialCapacityoption allows explicit control over starting allocation size (default 16) - Cache grows dynamically from
InitialCapacitytowardMaximumSizeas items are added CacheBuilder<TKey, TValue>.InitialCapacity(int)method for fluent configurationCache<TKey, TValue>.MaximumSizeproperty added to expose configured maximum (distinct fromCapacity)- Large
InitialCapacityvalues are clamped toMaxReasonableInitialCapacity(65536) to prevent excessive allocations
- Creating a cache with
- Pool MinRetainCount not respected during gradual explicit purges: Fixed
MinRetainCountbeing ignored when usingMaxPurgesPerOperationwith explicit purges- Gradual purges now correctly stop when pool size reaches
MinRetainCount - Added
_pool.Count > effectiveMinRetaincheck to the purge loop condition in both thread-safe and non-thread-safe pool implementations
- Gradual purges now correctly stop when pool size reaches
- Pool idle timeout purges blocked by comfortable size: Fixed idle timeout purges not occurring when pool size was at or below comfortable size
- Idle timeout purges now proceed regardless of comfortable size, as they represent essential pool hygiene
- Added
hasIdleTimeoutto loop entry condition to allow idle timeout evaluation independent of size
- Pool hysteresis incorrectly blocking idle timeout purges: Fixed hysteresis protection blocking all purge types including idle timeout
- Idle timeout purges now proceed during hysteresis since they only remove items unused for extended periods
- Capacity and explicit purges remain blocked during hysteresis to prevent thrashing
- ScriptableObjectSingletonCreator race condition creating numbered duplicate folders: Fixed race condition where parallel operations could cause Unity to create numbered duplicate folders like "Resources 1", "Resources 2", etc.
- Added detection for Unity's numbered duplicate folder creation pattern
- Automatically deletes duplicate folders and uses the intended folder path
- Logs warning if duplicate folder deletion fails, alerting user to manual cleanup needed