Notifications
Work-in-progress notification presentation over a host-owned queue.
Open the GameUI starter in Studio and expand Components → feedback to find Toast and NotificationStack. Select the Notifications View to preview the starter's Store-bound stack. Its preview entry is example data, not a game event. The View, presentation components and per-player Store/Blueprint queue adapter are available in the development starter. External game integration and final visual acceptance remain unfinished.
Owner-controlled presentation
Toast presents one notification. It accepts elementId, notificationId,
title, body, tone, icon, occurrences and optional formatted countText.
Tones are info, success, warning and error. The title and close control
have localized defaults.
The owner supplies phase: visible or exiting. Exiting and disabled entries
are inert. Clicking close emits dismiss with {id}. An optional action needs
both actionId and actionLabel; it emits action with {id, actionId}.
dismissible defaults to true and dismissLabel can replace its default text.
Neither event removes the notification or executes gameplay by itself.
NotificationStack accepts elementId, label, entries, disabled,
enterSeconds and exitSeconds. It forwards dismiss/action events from its
keyed Toast children. Each record has a unique id, a phase, occurrences
and content containing the Toast text, tone, icon and action/dismiss options.
Removing an entry in the owner's data removes its Toast. The stack has no local
queue, timer, priority sort or automatic expiration.
The stack is a content-sized flow layout, not a globally positioned screen. Its owner must place it on the intended notification layer and project the host queue into its data.
Connect the Unreal queue
In Studio, keep the starter's notifications.entries and
notifications.exitSeconds Store fields and the Notifications View in the
Gameplay package. The View already binds the stack to these fields. Studio calls
this a View; Unreal nodes call it a Screen. Configuring a queue does not open it.
In your owning Player Controller Blueprint, load the package using the package workflow. Wait for its successful completion, then get that controller's CalmUI Local Player Subsystem:
- Call Configure CalmUI Notifications once for this local player. Select
your loaded package and
notifications.entrieson Entries. Start with Visible Limit 3, Pending Limit 32, Remembered Id Limit 128 and Exit Seconds 0.18. Check the returned boolean before continuing. Use Set CalmUI Float to setnotifications.exitSecondsto the same 0.18. This field is presentation configuration: the queue does not write it for you. If you choose a different exit duration, update both values together. Open the Notifications Screen using your loaded Gameplay package. - On a completed game event, call Enqueue CalmUI Notification on the same subsystem. Supply a unique Event Id, empty Group Key for no grouping, Priority 0 and Duration Seconds 4. Make the Content structure with localized Title/Body and Dismiss Label. If Dismissible is false, the dismiss label is not required. An optional action needs both Action Id and Action Label.
- Read the result. Added/Grouped means accepted, not necessarily already shown. Keep the returned Entry Id when updating or dismissing it later. Full means the game must retry or decide how to report loss; no message is evicted. Invalid/Unavailable requires fixing the request or initialization.
- Read Get CalmUI Notification Error when setup or projection fails. An accepted message remains queued during a Store error; do not enqueue it again with a new event ID to retry publication.
The subsystem publishes typed rows automatically, including exiting before
removal. Its real-time ticker runs independently of Views and game time dilation.
Call Set CalmUI Notifications Paused for the game's desired pause policy.
Closing a View does not pause or clear the queue. If the Store is busy or the
binding is unavailable, publication is retried and the queue clock is suspended.
Update CalmUI Notification Content refreshes retained text without resetting lifetime. Localized FText values are retained and reprojected after Unreal's text revision changes. Format Count Text in the game; occurrence counts are not automatically pluralized by this adapter.
Wire the two action listeners
In the same Player Controller, use Listen for CalmUI Action twice after package loading. Select the Gameplay package and keep both returned listener handles for cleanup.
- For Notifications.Dismiss, pass the received Payload event into Read CalmUI
Action String, with Field
id. Branch on its returned boolean. On success, pass Value to Entry Id on Request CalmUI Notification Dismiss, using the same Local Player Subsystem. It rejects pending, exiting, missing or non-dismissible entries. Do not remove the Store row yourself. - For Notifications.Activate, read
idandactionIdfrom the received Event using two Read CalmUI Action String nodes. Continue only when both succeed. Pass these values to Resolve CalmUI Notification Action. Only a current visible matching action returns true. Then authorize and execute the operation in your game. Resolution does not execute or dismiss anything.
The View forwards these requests through generated typed action functions; no
custom JSON plugin is needed in Blueprint. C++ action handlers receive typed
calmui::Value payloads through the existing action dispatcher. For game-owned
removal, Dismiss CalmUI Notification also accepts pending entries.
Call Stop Listening on both handles when explicitly tearing down the integration; controller EndPlay also stops them automatically. Do not register another pair every time the View opens. The starter's notification layer is passthrough: opening it must not take focus away from gameplay. A complete controller-access policy for its optional interactive actions remains an integration gate; the passive layer alone does not make its buttons reachable by directional navigation.
After enqueue succeeds, the mounted View should display the entry, then animate its exit and remove it. If it remains empty, check package loading, the Store binding, View visibility and Get CalmUI Notification Error. If a button has no effect, check the selected contract and listener lifetime first.
Local Player teardown releases the queue. Use Clear CalmUI Notifications only when intentionally removing all messages. Keep Forget Event Ids false for ordinary clearing; enable it only at a deliberate new-session boundary. Do not clear messages merely because a notification View closes.
Animation and compatibility
The authored enter/exit effects fade and translate the card without changing
its layout. enterSeconds and exitSeconds default to 0.18 and are normalized
to 0–10 seconds. A zero duration finishes immediately. Updating a same-name
animation's duration retimes it without restarting; entering a different phase
starts that phase's animation. These effects use shared Core styles, not browser
animation. The queue owner must keep an exiting entry mounted for its exit time.
Rebuild with matching Studio/compiler and Unreal versions. These packages require
RuntimeAnimationVariables (feature bit 15); older runtimes reject them rather
than ignoring the requested duration. No component prop migration is required.