Releases: Tirtstan/Sentinal
Releases · Tirtstan/Sentinal
v3.2.4
Fixed
- ActionMapManager:
- Fixed default action maps overriding the current view's handler when returning to a root view.
OnViewSwitchno longer callsCheckAndApplyDefaults()when a handler was just applied — the view manages its own action maps.CheckAndApplyDefaults()now skips applying defaults when the current view has an active handler with a snapshot, even if the view is a root view.- Stopped aggressively removing temporarily hidden (inactive) views from
handlerCacheduring iteration inAnyViewsWithInputHandlersOpen()andAnyNonRootViewsWithInputHandlersOpen(). Cache cleanup now only happens inOnViewRemoved(). OnViewSwitchnow always restores the previous view's handler, even if the new view has no handler.- Added
ReapplyHandler()to re-apply action maps for views becoming current again without overwriting their original snapshot.
- SentinalManager:
- Replaced flat
hiddenViewslist with aStack<(ViewSelector, List<ViewSelector>)>to correctly support nestedhideOtherViewscalls. RestoreHiddenViews(ViewSelector owner)now pops only the entry matching the owner, preventing nested hides from corrupting each other.
- Replaced flat
Changed
- ActionMapManager:
ApplyDefaultActionMaps()no longer clearshandlerSnapshots— those belong to individual view handlers and must be preserved.
What's Changed
Full Changelog: v3.2.3...v3.2.4
v3.2.3
Fixed
- ActionMapManager:
- Fixed multi-view action map switching bug where disabled (inactive) views were still cached as valid, preventing default action maps from applying.
- Now checks
gameObject.activeSelfwhen evaluating active views and automatically cleans up inactive entries from the handler cache. - Removed redundant re-application of handlers in
OnViewRemoved()that was corrupting snapshot chains with multiple views.
Changed
- ActionMapManager:
- Converted
ActionMapSnapshotfrom class to struct for improved performance. - Updated struct properties to PascalCase (
PlayerInput,State) and added explicit constructor.
- Converted
What's Changed
Full Changelog: v3.2.2...v3.2.3
v3.2.2
Fixed
- ActionMapManager:
- Now bootstraps handler cache at
Start()with any views already open in the scene usingGetViewHistory(), preventing premature default action map application. - Deferred
CheckAndApplyDefaults()by one frame inOnViewRemoved()to allowOnViewAdded()to complete the add-remove-add sequence atomically before evaluating defaults.
- Now bootstraps handler cache at
Added
- ActionMapManager:
- Added
defaultsRequireAllViewsGonetoggle to control default action map behavior:- When false (default): Defaults apply only when non-root views with handlers are gone (root views don't block defaults).
- When true: Defaults apply only when ALL views with input handlers are gone (including root views).
- Added
What's Changed
Full Changelog: v3.2.1...v3.2.2
v3.2.1
Changed
-
ActionMapManager:
- Removed all action map history tracking. Was just causing so many conflicting issues, rather use
ViewSelector'sonEnabledActionMapsandonDisabledActionMapsto configure action maps.
- Removed all action map history tracking. Was just causing so many conflicting issues, rather use
-
ViewInputSystemHandler:
- When one action map is counted, it is treated as exclusive and toggles the affected
PlayerInputs' action map(s). e.g If action map "UI" is the only enabled action map, every other action map will be disabled onPlayerInput(s).
- When one action map is counted, it is treated as exclusive and toggles the affected
What's Changed
Full Changelog: v3.2.0...v3.2.1
v3.2.0
Added
- Grouping! - Added view grouping system to filter exclusive/hide behaviors.
- SentinalViewGroups (ViewGroupConfig): New ScriptableObject asset (auto-created at
Assets/Resources/SentinalViewGroups.asset) for managing view groups. Also creatable viaAssets > Create > Sentinal > View Groups. - ViewSelector Grouping: Added "Grouping" header section to
ViewSelectorwith:groupMaskfield: Bitmask selection (similar to Unity's LayerMask) for choosing which groups this view belongs to.exclusiveViewandhideOtherViewstoggles moved under "Grouping" header.
- Grouping inspector UX:
- Group mask dropdown pulls names from the shared
SentinalViewGroupsasset. - If the asset is missing, it is auto-created; if still unavailable, the group mask field is hidden.
- The mask can be set to "Nothing" to opt out of grouping for that view (does not participate in group-based hide/close).
- Group mask dropdown pulls names from the shared
- Group-filtered behavior:
exclusiveViewnow only closes views within the same group(s) when a non-negative group mask is provided; a mask of0(Nothing) will not close any other groups.hideOtherViewsnow only hides views within the same group(s) when grouping is configured; a mask of0(Nothing) will not hide any other groups.
- SentinalViewGroups (ViewGroupConfig): New ScriptableObject asset (auto-created at
Changed
- ViewSelector:
exclusiveViewandhideOtherViewstoggles moved to the new "Grouping" header section.- Uses the shared
SentinalViewGroupsasset for group names.
- SentinalManager:
CloseAllViews()now has an overloadCloseAllViews(int groupMask, bool excludeRootViews = false)for group filtering.HideAllViews(ViewSelector excludeView)now filters by groups based on the view'sGroupMask.
- IViewSelector: Added
GroupMaskproperty to interface.
What's Changed
Full Changelog: v3.1.4...v3.2.0
v3.1.4
Fixed
- SentinalManager: Fixed an issue with the hidden view causing a collection modification exception. Now creates a new instance of hidden views when restoring.
Added
- SentinalManager: Will now
TrySelectCurrentView()as soon as anEventSystemis available. This fixes no UI elements being selected if no already existing player(s) are available (joined in later).
What's Changed
Full Changelog: v3.1.3...v3.1.4
v3.1.3
Fixed
- ViewDismissalInputHandler: Closing the current view is now delayed to the next frame. This avoids
IndexOutOfRangeExceptionerrors inInputSystemUIInputModulewhenUI/Cancelis bound toEscand closing a view changes action maps. - ActionMapManager:
- After any view switch, default action maps are checked and applied again. This makes sure
defaultActionMapsare used when the last non-root view in a menu chain is closed. CheckAndApplyDefaults()now usesSentinalManager.AnyNonRootViewsOpento decide when defaults should be active. Defaults are applied whenever there are no non-root views open.
- After any view switch, default action maps are checked and applied again. This makes sure
What's Changed
Full Changelog: v3.1.2...v3.1.3
v3.1.2
Fixed
- ActionMapManager:
PlayerInputaction maps will no longer be modified when switching to a view that does not have aViewInputSystemHandler. This was causing an issue whereViewSelectors without aViewInputSystemHandlerwere disabling all action maps on affectedPlayerInputs.
Changed
- SentinalManager: Updated
ToString()to show the priority of listed views as well.
What's Changed
Full Changelog: v3.1.1...v3.1.2
v3.1.1
2026-02-05
Fixed
- SentinalManager:
OnDestroyno longer nulls static events (OnAdd,OnRemove,OnSwitch). OnlyInstanceis cleared. This fixes view events not firing for persistent subscribers (e.g.ActionMapManageron a DontDestroyOnLoad object) after loading a new scene, where the previous scene’sSentinalManagerwas destroyed and had cleared the event delegates. - ActionMapManager: Re-subscribes to
SentinalManagerview events inOnSceneLoaded, so when used with DontDestroyOnLoad it continues to receiveOnSwitch/OnAdd/OnRemovefrom the new scene’sSentinalManagerafter a scene load.
Changed
- ActionMapManager:
- History is now per view selector (source) instead of a fixed-size list: same selector overwrites its previous entry. No maximum entry count.
- Extracted
SubscribeToViewEvents/UnsubscribeFromViewEventsand callResubscribeToViewEvents()afterClearStateForNewScene()on scene load.
- ActionMapManagerEditor:
- History foldout shows “Action maps per view (N)”, one row per source, sorted by source name; elapsed-time display removed.
What's Changed
Full Changelog: v3.1.0...v3.1.1
v3.1.0
Changelog v3.1.0
Changed
- Terminology: Renamed PreventDismissal back to RootView (
rootView/RootView).IViewSelector.PreventDismissal→IViewSelector.RootView.ViewSelectorinspector and serialized field now use "Root View"; behaviour unchanged (view that does not get auto-closed, has special permissions around being closed, can still be hidden).CloseAllViews(bool excludePreventDismissalViews)→CloseAllViews(bool excludeRootViews).
- ActionMapManager:
ActionMapHistoryEntry.actionchanged fromstringtoActionMapActionenum for type safety.- History display now uses enum comparison instead of string comparison.
- ViewInputSystemHandler:
- Replaced
enableActionMaps/disableActionMaps(string arrays) withonEnabledActionMaps/onDisabledActionMaps(ActionMapConfig[]arrays). onEnabledActionMapsconfigures action maps when the handler is enabled (view is active).onDisabledActionMapsconfigures action maps when the handler is disabled (view is inactive).- Each
ActionMapConfigspecifies both the action map name and whether it should be enabled or disabled. - Methods renamed:
GetEnableActionMaps()→GetOnEnabledActionMaps(),GetDisableActionMaps()→GetOnDisabledActionMaps().
- Replaced
Added
- SentinalManager: Added
AnyNonRootViewsOpen– returns whether any open views are not root views (useful e.g. to decide when to enable gameplay input when only root views like main menu are open). - ActionMapManager:
- Added
ActionMapActionenum (Enable,Disable,Restore) for type-safe action map history entries. - Added
useDefaultActionMapstoggle to control whether default action maps are applied. - Added
defaultActionMapsfield (ActionMapConfig[]) to configure action maps when no non-root views are open. - Automatically applies/restores default action maps based on
SentinalManager.AnyNonRootViewsOpenstate. - Editor now displays default action maps configuration in inspector (even when not playing).
- Added
- Input System Backend Support:
- Added support for both C# Events (
InvokeCSharpEvents) and Unity Events (InvokeUnityEvents) notification behaviors onPlayerInput. InputActionSelectorandViewInputSystemComponentnow automatically detect and support both event systems.- If
PlayerInput.notificationBehavioris set to unsupported modes (SendMessages/BroadcastMessages), it will be automatically changed toInvokeCSharpEventsat runtime with a warning logged, prompting users to update the setting in the inspector. ViewInputSystemComponentnow subscribes toonControlsChanged(C# events) orcontrolsChangedEvent(Unity Events) based on the notification behavior.
- Added support for both C# Events (
Documentation
- README.md: Updated features, API descriptions, and best practices to use Root View terminology.
What's Changed
Full Changelog: v3.0.0...v3.1.0