Releases: Tirtstan/Sentinal
Releases · Tirtstan/Sentinal
Release list
v4.1.1
Added
InputFreshPressGate— shared helper for ignoring in-progress presses when input handlers arm (on subscribe or view switch).ViewDismissalInputHandler.requireFreshPress— (default:true) requires Cancel to be released after the current view changes before dismissing, preventing the same press from closing a newly focused view (e.g. overlay → parent screen).
Changed
InputActionButtonBase— fresh-press filtering now delegates toInputFreshPressGateinstead of inline state.
What's Changed
Full Changelog: v4.1.0...v4.1.1
v4.1.0
[4.1.0] - 2026-07-02
Added
- Input action buttons (
InputActionButtonBase):deferExecution— (default:true) defers click handling to the next frame so input does not carry over to newly activated views.requireFreshPress— (default:true) ignores held inputs when the component becomes active, preventing input bleeding from the previous view.ValidateFreshPresshelper integrated intoInputActionButtonandInputActionButtonHold.
- Prompted text field (
PromptedTextField):- Optional
captionTextwith caption/value visibility toggling based on whether a value is set. - Same-frame re-open guard after a prompt is dismissed.
- Optional
Changed
- PromptedTextField —
emptyDisplayTextand the stored value are now runtime-managed; empty display text is seeded fromcaptionTexton awake.
[4.0.1] - 2026-06-28
Fixed
- ViewDismissalInputHandler —
ICloseableViewresolution now usesTryGetComponentwith cleaner parent/children fallback when closing a view.
What's Changed
Full Changelog: v4.0.0...v4.1.0
v4.0.0
🚀 Highlights
- Decoupled Address-Based View Routing (
ViewAddress&ViewLink):- Never drag scene references between scripts again! Define lightweight
ViewAddressScriptableObject keys to represent your UI screens (e.g.SettingsAddress,InventoryAddress,PauseMenuAddress). - Trigger
SentinalViewRouter.OpenView(address)from anywhere in your codebase — if the panel is already in the scene, Sentinal brings it to focus; if it's missing, Sentinal dynamically instantiates its fallback prefab on the fly! - Attach a
ViewLinkcomponent to any standard UGUI Button to make it open an address on click automatically with zero code.
- Never drag scene references between scripts again! Define lightweight
- Dynamic Multiplayer Role Mapping (
SentinalPlayer):- Built for local multiplayer, split-screen, and couch co-op! Centralize controller assignments via
SentinalPlayer.SetPrimaryPlayer()or assign specific role keys (Player 1,Player 2, etc.). - Action map gates, tab controls, and back-button cancel handlers automatically adapt live when players join, leave, or rebind gamepads.
- Built for local multiplayer, split-screen, and couch co-op! Centralize controller assignments via
- Managerless Stack Architecture & Fast Play Mode:
- Replaced the scene-bound
SentinalManagersingleton with staticSentinalViewRouter. - Views register dynamically on enable/disable, removing the mandatory manager GameObject from your scenes.
- Fully supports Unity's Fast Play Mode (Domain Reload Disabled). Unity 2021.3 LTS through Unity 6.5 ready.
- Replaced the scene-bound
- Strongly Typed View Grouping (
ViewGroupMask):- Multi-layered UI control! Isolate gameplay HUD overlays, party feeds, and full-screen menus into distinct group channels using bitmasks (
ViewGroupMask). - Integrated
ViewGroupMaskintoViewDismissalInputHandlerso cancel/back actions can be filtered to only dismiss matching UI groups. - Features a one-click Editor generator for
SentinalViewGroups.assetinAssets/Resources.
- Multi-layered UI control! Isolate gameplay HUD overlays, party feeds, and full-screen menus into distinct group channels using bitmasks (
- Modular Asynchronous Text Input Gateway:
- Prompt players for text (character naming, room codes, bug reports) using
ITextInputGatewayandTextInputPrompt. - Includes
PromptedTextFieldcomponent for seamless TextMeshPro integration.
- Prompt players for text (character naming, room codes, bug reports) using
Changed
- Core architecture:
- Replaced scene-bound
SentinalManagersingleton with static globalSentinalViewRouter. - Routing lifecycle now relies directly on
ViewSelectorenable/disable registration flow, removing mandatory manager scene objects. - Full support for Unity Fast Play Mode (Domain Reload disabled).
- Replaced scene-bound
- View Grouping & Editor Tools:
- Replaced raw integer/attribute mask fields with strongly typed
ViewGroupMaskstruct supporting bitwise operations (&,|,^,~) andViewGroupMask.Everything/ViewGroupMask.Nothingpresets. - Enhanced
ViewGroupMaskDrawerandViewGroupConfigfor full cross-platform compatibility and zero console warnings across Unity 2021.3 LTS through Unity 6.5. - Improved missing view groups configuration UI in the Inspector with standard
EditorGUI.PrefixLabelalignment and one-click asset creation.
- Replaced raw integer/attribute mask fields with strongly typed
- Documentation:
- Refreshed
README.mdfor 4.0.0.
- Refreshed
Added
- Address-based view routing:
- Added
ViewAddressScriptableObject asset for decoupled view targeting and fallback prefab instantiation. - Added
ViewAddressRegistryfor runtime registration and resolution. - Added
ViewLinkcomponent for zero-code UGUI button address binding. - Added
SentinalViewRouter.OpenView(ViewAddress)API.
- Added
- Player role mapping utility (
SentinalPlayer):- Added
SentinalPlayerstatic registry API (SetPlayer,GetPlayer,TryGetPlayer,SetPrimaryPlayer). - Added event-driven
OnPlayerChangedcallbacks toViewInputSystemHandler,ActionMapGate, andViewDismissalInputHandlerfor real-time input re-binding. - Added fallback resolution to primary player (
key 0) orPlayerInput.all[0].
- Added
- View Dismissal Group Filtering:
- Added
ViewGroupMaskproperty toViewDismissalInputHandlerfor group-filtered cancel/back action handling.
- Added
- Text Input Gateway System:
- Added
ITextInputGatewayinterface andTextInputGatewayimplementation for modal text prompts. - Added
TextInputPromptrequest struct (title, placeholder, initial text, submission callback). - Added
PromptedTextFieldcomponent andPromptedTextFieldEditorfor TextMeshPro input field integration.
- Added
Breaking
SentinalManagerpublic API and event subscriptions must be migrated toSentinalViewRouter.- Existing project setup that depended on a manager GameObject should be updated to the router-based workflow.
Migration Notes
If upgrading from 3.x:
- Replace
SentinalManager.Instanceusages withSentinalViewRouter. - Remove scene dependencies that only existed to host
SentinalManager. - Update custom scripts/events to subscribe to
SentinalViewRouterstatic events. - If needed, adopt
ViewAddressfor decoupled open calls. - Replace old action map manager/overlay setup with per-view
ActionMapGate. - Use
SentinalViewRouter.Refresh()to refresh all views to reapply action maps and input handlers (e.g.PlayerInputcreated during runtime).
What's Changed
Full Changelog: v3.2.4...v4.0.0
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