Skip to content

Releases: brunomikoski/ScriptableObjectCollection

Bitmask-Accelerated Queries & API Cleanup

16 May 12:41
b80ef5a

Choose a tag to compare

Added

  • New PreviewMode enum (Default/Inline/PropertyEditorWindow) on SOCItemEditorOptionsAttribute, plus a matching project-wide default in SOCSettings (Project Settings > Scriptable Object Collection > Item Inspector). When set to PropertyEditorWindow, the per-field Edit button opens Unity's floating Property Editor via EditorUtility.OpenPropertyEditor instead of the inline preview panel — fixes rendering issues with third-party inspectors (e.g. Odin) that don't draw correctly in the inline IMGUI drawer. Default on the attribute defers to the project setting; project setting defaults to Inline so existing behavior is unchanged.
  • New CollectionItemMask64 static helper plus IEnumerable<T>.ToItemMask64<T>() and List<T>.FromItemMask64<T>() extension methods. Provides a 64-bit bitmask representation of a set of collection items keyed on ScriptableObjectCollectionItem.Index, with Bit/Has/Add/Remove/Overlaps/IsSubsetOf helpers and a From<T>(items, out bool fits) builder that flags when any item's Index >= 64. Bit positions are per-collection — callers are responsible for only comparing masks built from items of the same collection.
  • CollectionItemPicker<T> now exposes a cached bitmask (CachedMask) and a CanUseBitmask gate (combines MaskFitsIn64 with every item collection's SupportsBitmaskIndexing flag), plus CountMatchesIn(ulong) and CountMatchesIn(IEnumerable<T>) overloads backed by a SWAR PopCount. The mask is rebuilt on OnAfterDeserialize, on every mutating operation (Add/Clear/Remove/Insert/RemoveAt/indexer set), and lazily in Edit Mode; reused without rebuild in Play Mode.
  • ScriptableObjectCollection virtual SupportsBitmaskIndexing (default true). Override to false on collections whose item ordering can change at runtime (e.g. CDN-delivered content) so the bitmask fast path is skipped — each item's Index is cached on first access and would otherwise go stale after a reorder.
  • CollectionItemPicker<T>.ToString() override returning [item1, item2, ...] (empty collection renders as []; null entries render as <null>). Uses StringBuilder to avoid per-call allocations on long pickers.
  • CollectionItemQuery<T>.IsEmpty() returns true when every QuerySet's picker contains zero items — useful for skipping the Matches evaluation on default-constructed queries.
  • CollectionItemPickerPropertyDrawer now writes itemLastKnownName and collectionLastKnownName when an entry is added to a picker, so newly added items have populated cache names immediately instead of empty strings.

Changed

  • Reverted CollectionItemQuery.MatchType enum values: SomeNotNotAny, NoneNotAll. The new names mirror Any/All and describe the actual semantics (target has none of the picker items / target is missing at least one of them). Integer values are preserved (2 and 3), so existing serialized QuerySet data deserializes unchanged.
  • Added XML documentation on MatchType values and the Matches method to surface the semantics in IntelliSense.
  • CollectionItemQuery<T>.Matches now selects between a bitmask fast path (MatchesViaBitmask) and the existing GUID-based path (MatchesViaGuids) at the start of each call. The bitmask path is used only when every QuerySet's picker reports CanUseBitmask == true; otherwise the call falls back to the original GUID comparison. Match results are unchanged — only the evaluation strategy.
  • CollectionItemPicker<T> events renamed: OnItemTypeAddedEventOnItemAddedEvent, OnItemTypeRemovedEventOnItemRemovedEvent. The old names are preserved as [Obsolete] shims with explicit add/remove accessors that forward subscriptions to the new events, so existing +=/-= call sites keep compiling with a deprecation warning pointing to the new name. The shims will be removed in a future major version. OnChangedEvent is unchanged.
  • CollectionItemIndirectReference.itemLastKnownName and collectionLastKnownName are now wrapped in #if UNITY_EDITOR and no longer compiled into player builds. Runtime resolution relies exclusively on GUIDs.
  • CollectionItemQuery<T>.Matches(IEnumerable<T> targetItems, out int) now tolerates a null targetItems — treated as empty, so Any/All sets fail and NotAny/NotAll sets pass.

Fixed

  • CollectionItemQueryPropertyDrawer.IsCombinationImpossible no longer reports false positives for Any + NotAny and All + NotAll rule pairs. Impossibility for these now requires the stricter subset relationship between pickers (not just any intersection), matching the real-world satisfiability. All + NotAny continues to be flagged on any intersection, which is correct.
  • CollectionItemPicker and CollectionItemIndirectReference<T> now implement ISerializationCallbackReceiver to invalidate their runtime caches on deserialization, so inspector edits to a picker during Play Mode take effect immediately instead of returning the stale cached Items/Ref.
  • CollectionItemIndirectReferencePropertyDrawer now re-syncs stale itemLastKnownName/collectionLastKnownName from the live asset and collection names on every draw (via ApplyModifiedPropertiesWithoutUndo), preventing the cached names from drifting when an asset is renamed outside the inspector.

Removed

  • Removed the runtime fallback in CollectionItemIndirectReference.TryGetCollectionItem that, when the stored GUIDs failed to resolve, attempted to look the collection and item back up by collectionLastKnownName/itemLastKnownName. With the names now editor-only, GUID is the single runtime lookup path; rename recovery is handled at edit time by the drawer instead.
  • Removed long-deprecated [Obsolete] API surface that has been carrying compile warnings across prior releases:
    • SOCSettings.SetDefaultNamespace(string) — use SetNamespacePrefix(string) instead.
    • The four ScriptableObjectCollectionUtility.CreateScriptableObjectOfType(...) overloads that took a parentFolder / parentFolderPath plus a createFolderForThisCollection bool. Use the overloads that take a complete path; build the path with Path.Combine at the call site if you previously relied on the auto-folder behavior.
    • DrawAsSOCItemAttribute — no longer needed since Unity 2022.2 supports PropertyDrawer on interfaces directly.
    • CollectionItemEditorOptions class — use SOCItemEditorOptionsAttribute instead.
    • CollectionsRegistry.GetCollectionByGUID(string) — use the LongGuid overload (regenerate your collection's static access class to pick up the new GUID type).
    • ScriptableObjectCollection.GetItemByGUID(string) — use the LongGuid overload (same: regenerate the static access class).

New Processor and more QoL changes and improvements

06 Apr 17:30
e496352

Choose a tag to compare

Added

  • New SOCItemGuidProcessor asset postprocessor that enforces valid and unique GUIDs on collection items at import time, replacing the inline validation in CollectionsAssetsPostProcessor
  • Custom CollectionItemQueryPropertyDrawer with foldout UI, rule editing, match type constraint filtering, impossible-rule detection, and human-readable query summaries
  • GUID-based lookup caching for collections (CollectionsRegistry) and items (ScriptableObjectCollection) for faster retrieval
  • CollectionItemIndirectReference now caches resolved references with a hasCachedRef flag to avoid repeated resolution attempts
  • Enhanced error logging in CollectionItemPickerPropertyDrawer with last known names and property paths
  • DrawAdditionalIMGUI() extension point in CollectionCustomEditor for subclass customization
  • GitHub Copilot review instructions (.github/instructions.md)

Changed

  • Renamed CollectionItemQuery.MatchType enum values: NotAnySomeNot, NotAllNone
  • Reduced GC allocations in CollectionItemQuery.Matches() by reusing a HashSet instead of creating a new one per call (by @emtony)
  • CollectionItemDropdown now redirects to the collection when the item type has derived types, instead of immediately creating an item
  • Code generation now outputs UTF-8 without BOM and handles both \r\n and \n line endings
  • Refactored new modifier detection logic in code generation with improved base type filtering
  • CollectionItemPicker now uses reverse iteration for safe removal during enumeration
  • Refactored CollectionsRegistry.ValidateCollections() to validate items within collections using HashSets for duplicate detection
  • Improved bidirectional type assignability check in CollectionsRegistry.GetCollectionsByItemType()
  • Robust UXML asset loading in CollectionCustomEditor with error handling for missing visual tree assets

Fixed

  • ScriptableObjectCollection<T>.ClearCachedValues() now calls base.ClearCachedValues() to properly clear name/GUID lookup dictionaries
  • GUID cache lookups (TryGetItemByGUID, GetCollectionByGUID) now validate the cached entry's GUID still matches before returning, evicting stale entries
  • SOCItemGuidProcessor deleted asset handling: entries are now removed by path matching instead of attempting to load already-deleted assets
  • Removed UTF-8 BOM from SOCItemGuidProcessor.cs and its .meta file
  • Fixed typo IsKnowCollectionIsKnownCollection across multiple files
  • Fixed typo collectionLastKnowNamecollectionLastKnownName with FormerlySerializedAs for backward compatibility
  • Fixed method name SetUsingBaseClassForItemsSetUseBaseClassForItems
  • Improved null/destroyed Unity object equality checks in ScriptableObjectCollectionItem
  • Removed OnValidate() auto-GUID generation from ScriptableObjectCollectionItem (now handled by the processor)

v2.5.0 - Bug Fixes and QoT Improvements

04 Dec 21:21

Choose a tag to compare

What's Changed

Changed

  • Fixed issue with the TreeView and the unity version compatibility by @RoyTheunissen #182
  • LongGuids are now displayed via their base64 string by @RoyTheunissen #184
  • IndirectReferences are not generated per item type, so it can filter what type of items can be displayed on the picker
  • Fixed issue where renaming one asset on the CollectionEditor could cause some issues
  • Fixed IndirectReference not properly saving items from the dropdown when used inside arrays
  • Fixed overall issues with the CollectionItemQuery.cs
  • Fixed Item picker not respecting the inheritance of items when displayin the picker
  • GUID are now not serialized when invalid, so it doesn't get reserialized in invalid states (#183)

Added

  • Added the option to omit labels in arrays and lists by @RoyTheunissen #181
  • Added indirect conversion between IndirectReference and Item type so they can used as regular SOCItem
  • Menu for generating Static Access for all the collection under the Tools/ScriptableObjectCollection menu
  • Menu for generating Indirect Reference file for all the collection under the Tools/ScriptableObjectCollection menu
  • Added extra validation for valid filenames when creating new collections/items

Pull Requests

Full Changelog: v2.4.2...v2.5.0

Bug fixes and improvements

07 Oct 19:24

Choose a tag to compare

What's Changed

Full Changelog: v2.4.1...v2.4.2

Bug Fixes and Improvements

21 Aug 10:48

Choose a tag to compare

What's Changed

  • Fixed issue when creating multiple items without renaming it would cause a null reference.
  • Removed Synchronize Assets button from the Collection Editor, this is already happening multiple times
  • Renamed Generator button to Run Generator instead of Generate Items since was misleading
  • Fixed use of AssetPathExists on older Unity versions
  • Removed Syncronize Button (was not needed anymore)
  • Fixed generator not refreshing CollectionEditor after running the generator
  • Fixed unique name generation for new items

Added

  • Added new label options to make the picker smaller

New Contributors

Full Changelog: v2.4.0...v2.4.1

2.4.0 - QoL and Fixes

24 May 11:55
8eef92a

Choose a tag to compare

What's Changed

Changed

  • Fixed generated static access code overwriting the collection definition
  • Pre 2.3.0 collections will now be assumed to want a namespace setting that is the same namespace as its item type
  • When generating static/indirect access code using the new .g.cs suffix, existing static/indirect access code that uses the old .cs suffix is now automatically removed to prevent compile errors
  • Added Generic SetValue for Collection Generator

Full Changelog: v2.3.9...v2.4.0

Improving duplicating collection and other quality of life improvements

19 Feb 09:24
05f4f07

Choose a tag to compare

Changed

  • Added some general fixes to validate Collection and Items have unique LongGuid
  • Fixed issues when after some operation with the context menu on the CollectionEditor items would not refresh properly
  • Fixed issue when moving items between collection would not generate unique names
  • Removed the post processing of assets that tried to assign items to collections automatically, since this was causing issue when duplicating collections, everyting now is done on the collection
  • Overall code improvement and organization

Added

  • Added new Context Menu for moving items between collections
  • Added the new PropertyDrawer that shows what Collection every item belongs to
  • Added a few more Confirmation dialog when detecting items that looks wrong

What's Changed

Full Changelog: v2.3.8...v2.3.9

Small fixes and QoL Improvements

30 Jan 21:11
33f4d64

Choose a tag to compare

Changed

  • Fixed naming issue on the new Move Items context menu introduced on [2.3.7]
  • Renamed Delete Item to Remove Item on the context menu
  • Updated the Confirmation for the Removal of items, now ask if you just want to remove the reference, remove the reference and delete the asset or cancel the operation
  • Exposed OnEnable and OnDisable from the CollectionCustomEditor to be overriden by other editors

What's Changed

Full Changelog: v2.3.7...v2.3.8

Unity 6 support and other improvements

30 Jan 16:03
c47dd8f

Choose a tag to compare

What's Changed

Added

  • Added new context menu to move items between collections
  • Added new Rename context menu
  • Added new CollectionItemQuery to be used with ItemPIcker

Changed

  • Improved Unity 6 support
  • Fixed null ref when collections settings where not set
  • Fixed some renaming issues
  • Changed event where non automatically loaded items are removed on editor simulation
  • Fixed null ref on empty collection

Full Changelog: v2.3.6...v2.3.7

Improved Context Menu Usability

03 Sep 12:26
c857648

Choose a tag to compare

What's Changed

  • Updated ListView to allow for multiple selection
  • Updated Context Menu functionality to support multiple selection (Copy/Paste/Duplicate/Delete)

Full Changelog: v2.3.5...v2.3.6