Skip to content

Releases: Tirtstan/Sentinal

v4.1.1

Choose a tag to compare

@Tirtstan Tirtstan released this 03 Jul 12:19
b92beca

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 to InputFreshPressGate instead of inline state.

What's Changed

  • Add InputFreshPressGate for input bleeding prevention by @Tirtstan in #19

Full Changelog: v4.1.0...v4.1.1

v4.1.0

Choose a tag to compare

@Tirtstan Tirtstan released this 02 Jul 12:26
5afb312

[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.
    • ValidateFreshPress helper integrated into InputActionButton and InputActionButtonHold.
  • Prompted text field (PromptedTextField):
    • Optional captionText with caption/value visibility toggling based on whether a value is set.
    • Same-frame re-open guard after a prompt is dismissed.

Changed

  • PromptedTextFieldemptyDisplayText and the stored value are now runtime-managed; empty display text is seeded from captionText on awake.

[4.0.1] - 2026-06-28

Fixed

  • ViewDismissalInputHandlerICloseableView resolution now uses TryGetComponent with cleaner parent/children fallback when closing a view.

What's Changed

  • v4.1.0: Enhanced input handling and text field features by @Tirtstan in #18

Full Changelog: v4.0.0...v4.1.0

v4.0.0

Choose a tag to compare

@Tirtstan Tirtstan released this 27 Jun 12:19
708040b

🚀 Highlights

  • Decoupled Address-Based View Routing (ViewAddress & ViewLink):
    • Never drag scene references between scripts again! Define lightweight ViewAddress ScriptableObject 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 ViewLink component to any standard UGUI Button to make it open an address on click automatically with zero code.
  • 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.
  • Managerless Stack Architecture & Fast Play Mode:
    • Replaced the scene-bound SentinalManager singleton with static SentinalViewRouter.
    • 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.
  • 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 ViewGroupMask into ViewDismissalInputHandler so cancel/back actions can be filtered to only dismiss matching UI groups.
    • Features a one-click Editor generator for SentinalViewGroups.asset in Assets/Resources.
  • Modular Asynchronous Text Input Gateway:
    • Prompt players for text (character naming, room codes, bug reports) using ITextInputGateway and TextInputPrompt.
    • Includes PromptedTextField component for seamless TextMeshPro integration.

Changed

  • Core architecture:
    • Replaced scene-bound SentinalManager singleton with static global SentinalViewRouter.
    • Routing lifecycle now relies directly on ViewSelector enable/disable registration flow, removing mandatory manager scene objects.
    • Full support for Unity Fast Play Mode (Domain Reload disabled).
  • View Grouping & Editor Tools:
    • Replaced raw integer/attribute mask fields with strongly typed ViewGroupMask struct supporting bitwise operations (&, |, ^, ~) and ViewGroupMask.Everything / ViewGroupMask.Nothing presets.
    • Enhanced ViewGroupMaskDrawer and ViewGroupConfig for 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.PrefixLabel alignment and one-click asset creation.
  • Documentation:
    • Refreshed README.md for 4.0.0.

Added

  • Address-based view routing:
    • Added ViewAddress ScriptableObject asset for decoupled view targeting and fallback prefab instantiation.
    • Added ViewAddressRegistry for runtime registration and resolution.
    • Added ViewLink component for zero-code UGUI button address binding.
    • Added SentinalViewRouter.OpenView(ViewAddress) API.
  • Player role mapping utility (SentinalPlayer):
    • Added SentinalPlayer static registry API (SetPlayer, GetPlayer, TryGetPlayer, SetPrimaryPlayer).
    • Added event-driven OnPlayerChanged callbacks to ViewInputSystemHandler, ActionMapGate, and ViewDismissalInputHandler for real-time input re-binding.
    • Added fallback resolution to primary player (key 0) or PlayerInput.all[0].
  • View Dismissal Group Filtering:
    • Added ViewGroupMask property to ViewDismissalInputHandler for group-filtered cancel/back action handling.
  • Text Input Gateway System:
    • Added ITextInputGateway interface and TextInputGateway implementation for modal text prompts.
    • Added TextInputPrompt request struct (title, placeholder, initial text, submission callback).
    • Added PromptedTextField component and PromptedTextFieldEditor for TextMeshPro input field integration.

Breaking

  • SentinalManager public API and event subscriptions must be migrated to SentinalViewRouter.
  • 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.Instance usages with SentinalViewRouter.
  • Remove scene dependencies that only existed to host SentinalManager.
  • Update custom scripts/events to subscribe to SentinalViewRouter static events.
  • If needed, adopt ViewAddress for 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. PlayerInput created during runtime).

What's Changed

Full Changelog: v3.2.4...v4.0.0

v3.2.4

Choose a tag to compare

@Tirtstan Tirtstan released this 27 Feb 18:26
aec65bb

Fixed

  • ActionMapManager:
    • Fixed default action maps overriding the current view's handler when returning to a root view.
    • OnViewSwitch no longer calls CheckAndApplyDefaults() 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 handlerCache during iteration in AnyViewsWithInputHandlersOpen() and AnyNonRootViewsWithInputHandlersOpen(). Cache cleanup now only happens in OnViewRemoved().
    • OnViewSwitch now 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 hiddenViews list with a Stack<(ViewSelector, List<ViewSelector>)> to correctly support nested hideOtherViews calls.
    • RestoreHiddenViews(ViewSelector owner) now pops only the entry matching the owner, preventing nested hides from corrupting each other.

Changed

  • ActionMapManager:
    • ApplyDefaultActionMaps() no longer clears handlerSnapshots — those belong to individual view handlers and must be preserved.

What's Changed

Full Changelog: v3.2.3...v3.2.4

v3.2.3

Choose a tag to compare

@Tirtstan Tirtstan released this 20 Feb 12:28
e32feb4

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.activeSelf when 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 ActionMapSnapshot from class to struct for improved performance.
    • Updated struct properties to PascalCase (PlayerInput, State) and added explicit constructor.

What's Changed

Full Changelog: v3.2.2...v3.2.3

v3.2.2

Choose a tag to compare

@Tirtstan Tirtstan released this 19 Feb 17:44
30e17b0

Fixed

  • ActionMapManager:
    • Now bootstraps handler cache at Start() with any views already open in the scene using GetViewHistory(), preventing premature default action map application.
    • Deferred CheckAndApplyDefaults() by one frame in OnViewRemoved() to allow OnViewAdded() to complete the add-remove-add sequence atomically before evaluating defaults.

Added

  • ActionMapManager:
    • Added defaultsRequireAllViewsGone toggle 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).

What's Changed

Full Changelog: v3.2.1...v3.2.2

v3.2.1

Choose a tag to compare

@Tirtstan Tirtstan released this 14 Feb 21:12
5d60a18

Changed

  • ActionMapManager:

    • Removed all action map history tracking. Was just causing so many conflicting issues, rather use ViewSelector's onEnabledActionMaps and onDisabledActionMaps to configure action maps.
  • 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 on PlayerInput(s).

What's Changed

Full Changelog: v3.2.0...v3.2.1

v3.2.0

Choose a tag to compare

@Tirtstan Tirtstan released this 13 Feb 10:40
784ad4b

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 via Assets > Create > Sentinal > View Groups.
    • ViewSelector Grouping: Added "Grouping" header section to ViewSelector with:
      • groupMask field: Bitmask selection (similar to Unity's LayerMask) for choosing which groups this view belongs to.
      • exclusiveView and hideOtherViews toggles moved under "Grouping" header.
    • Grouping inspector UX:
      • Group mask dropdown pulls names from the shared SentinalViewGroups asset.
      • 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-filtered behavior:
      • exclusiveView now only closes views within the same group(s) when a non-negative group mask is provided; a mask of 0 (Nothing) will not close any other groups.
      • hideOtherViews now only hides views within the same group(s) when grouping is configured; a mask of 0 (Nothing) will not hide any other groups.

Changed

  • ViewSelector:
    • exclusiveView and hideOtherViews toggles moved to the new "Grouping" header section.
    • Uses the shared SentinalViewGroups asset for group names.
  • SentinalManager:
    • CloseAllViews() now has an overload CloseAllViews(int groupMask, bool excludeRootViews = false) for group filtering.
    • HideAllViews(ViewSelector excludeView) now filters by groups based on the view's GroupMask.
  • IViewSelector: Added GroupMask property to interface.

What's Changed

Full Changelog: v3.1.4...v3.2.0

v3.1.4

Choose a tag to compare

@Tirtstan Tirtstan released this 12 Feb 21:48
3d64e8c

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 an EventSystem is 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

Choose a tag to compare

@Tirtstan Tirtstan released this 12 Feb 10:45
dd8b5e7

Fixed

  • ViewDismissalInputHandler: Closing the current view is now delayed to the next frame. This avoids IndexOutOfRangeException errors in InputSystemUIInputModule when UI/Cancel is bound to Esc and closing a view changes action maps.
  • ActionMapManager:
    • After any view switch, default action maps are checked and applied again. This makes sure defaultActionMaps are used when the last non-root view in a menu chain is closed.
    • CheckAndApplyDefaults() now uses SentinalManager.AnyNonRootViewsOpen to decide when defaults should be active. Defaults are applied whenever there are no non-root views open.

What's Changed

Full Changelog: v3.1.2...v3.1.3