Skip to content

Releases: wallstop/unity-helpers

3.2.1

27 Feb 02:51
c922594

Choose a tag to compare

Changelog

Fixed

  • WValueDropDown empty rows in dropdown: Fixed WValueDropDown and StringInList dropdowns showing empty/blank rows at the top of the dropdown list, particularly on Linux. Clamped invalid -1 selected indices to 0 in WValueDropDownDrawer and StringInListDrawer, 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

Contributors

@Copilot, @dependabot[bot], @wallstop, copilot-swe-agent[bot] and dependabot[bot]

3.2.0

15 Feb 02:40
c400a15

Choose a tag to compare

Changelog

Fixes

  • Animation Creator creating corrupted animations
  • "Destroying assets is not permitted to avoid data loss" on Asset Domain Reload issue

Pull Requests

Contributors

@Copilot, @wallstop and copilot-swe-agent[bot]

3.1.8

07 Feb 21:00

Choose a tag to compare

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 CustomEditor attribute's editorForChildClasses parameter. This change is backward compatible with Unity 2022 and earlier versions.

Pull Requests

Contributors

@Copilot, @dependabot[bot], @github-actions[bot], @wallstop, copilot-swe-agent[bot], dependabot[bot] and github-actions[bot]

3.1.7

01 Feb 05:02
5da6a5b

Choose a tag to compare

Changelog

Pull Requests

Contributors

@dependabot[bot], @wallstop and dependabot[bot]

3.1.6

26 Jan 17:05
23c10b6

Choose a tag to compare

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

Contributors

@dependabot[bot], @wallstop and dependabot[bot]

3.1.5

21 Jan 01:44
bd1ed72

Choose a tag to compare

What's Changed

Contributors

@wallstop

ScriptableObjectSingleton Linux Potential Fix

18 Jan 05:52
9898ea8

Choose a tag to compare

[3.1.4]

Added

  • ScriptableObjectSingletonMetadata Sync Button: Added a Sync button to ScriptableObjectSingletonMetadata inspector that re-scans all assemblies for ScriptableObjectSingleton<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 LoadAssetAtPath returned null before Unity's AssetDatabase had indexed the file. The fix adds a synchronous import after CreateAsset and avoids deleting on-disk files when the file exists but isn't visible to the AssetDatabase yet.

3.1.3

17 Jan 00:17
1143a07

Choose a tag to compare

[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.json in 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
  • 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)

14 Jan 01:54
ac2b722

Choose a tag to compare

[3.1.2]

Fixed

  • Updated npmignore to align more closely with gitignore. The scripts/tests meta file error when sourcing from npm should be gone.

[3.1.1]

Fixed

  • WInLineEditorOdinDrawer now compiles.

3.1.0: Maybe Fix GitHub Pages (#140)

12 Jan 03:29
005a1d7

Choose a tag to compare

[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 ExpireAfterWrite and ExpireAfterAccess
    • Weight-based sizing for entries of varying cost
    • Dynamic growth with configurable thrash detection
    • Loading cache support with GetOrAdd and custom loader functions
    • Thread-safe by default (single-threaded mode via SINGLE_THREADED define)
    • 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 FramerateMode enum (Constant or Curve) for choosing timing mode
    • Per-animation framesPerSecondCurve allows 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
  • 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 cycleOffset property (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
    • MaxPoolSize limits pool capacity with automatic eviction of excess items
    • IdleTimeoutSeconds purges items that have been idle too long
    • PurgeTrigger flags control when purging occurs: OnRent, OnReturn, Periodic, or Explicit
    • OnPurge callback with PurgeReason (IdleTimeout, CapacityExceeded, Explicit) for monitoring
    • Intelligent purging mode tracks usage patterns to avoid purge-allocate cycles
    • MinRetainCount ensures a minimum number of items are always kept
  • Application Lifecycle Hooks for Pool Purging: Automatic pool purging in response to system events
    • Application.lowMemory triggers emergency purge (ignores hysteresis, purges to MinRetainCount)
    • Application.focusChanged triggers purge when app backgrounds (mobile platforms)
    • New PurgeReason values: MemoryPressure, AppBackgrounded, SceneUnloaded (reserved)
    • Configurable via PoolPurgeSettings.PurgeOnLowMemory and PoolPurgeSettings.PurgeOnAppBackground
    • GlobalPoolRegistry tracks all pool instances for cross-pool operations
    • PoolPurgeSettings.PurgeAllPools() method for manual global purge
    • Lifecycle hooks automatically registered via RuntimeInitializeOnLoadMethod
  • RandomExtensions NextOfExcept: New extension methods for selecting random elements with exclusions
    • NextOfExcept(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

    • GlobalEnabled defaults to true (was false)
    • DefaultBufferMultiplier defaults to 2.0 (was 1.5)
    • DefaultHysteresisSeconds defaults to 120 (was 60)
    • DefaultSpikeThresholdMultiplier defaults to 2.5 (was 2.0)
    • Use PoolPurgeSettings.DisableGlobally() to restore previous behavior
    • UnityMainThreadDispatcher auto-load behavior has changed from auto-loading to not auto-loading.
    • UnityMainThreadDispatcher hide flags have been changed to None.
  • DictionaryExtensions ToDictionary: Now uses last-wins semantics for duplicate keys instead of throwing ArgumentException

    • Aligns with common dictionary initialization patterns
    • Applies to both KeyValuePair<K,V> and tuple (K, V) overloads
  • IEnumerableExtensions return types: OrderBy, Ordered, and Shuffled methods now return List<T> instead of IEnumerable<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 to IEnumerable<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.AddToBoundedCache and new TryGetFromBoundedLRUCache method
    • Applied to InLineEditorShared, WShowIfPropertyDrawer, and other bounded editor caches
  • Shuffled performance: IEnumerableExtensions.Shuffled now 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
  • 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 to MaximumSize instead of using a small initial capacity
    • Creating a cache with MaximumSize = int.MaxValue now works correctly instead of throwing OutOfMemoryException
    • New InitialCapacity option allows explicit control over starting allocation size (default 16)
    • Cache grows dynamically from InitialCapacity toward MaximumSize as items are added
    • CacheBuilder<TKey, TValue>.InitialCapacity(int) method for fluent configuration
    • Cache<TKey, TValue>.MaximumSize property added to expose configured maximum (distinct from Capacity)
    • Large InitialCapacity values are clamped to MaxReasonableInitialCapacity (65536) to prevent excessive allocations
  • Pool MinRetainCount not respected during gradual explicit purges: Fixed MinRetainCount being ignored when using MaxPurgesPerOperation with explicit purges
    • Gradual purges now correctly stop when pool size reaches MinRetainCount
    • Added _pool.Count > effectiveMinRetain check to the purge loop condition in both thread-safe and non-thread-safe pool implementations
  • 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 hasIdleTimeout to 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