How-To: Instant, Hold & Duration Interactions
Goal: pick the right activation shape for an option - a tap, a hold-to-confirm, or a timed channel. The shape lives in the option's data (CrimsonCommon); the behaviour is implemented by your interact ability (Quick Start step 8 + How-To: Add Holds, Channels & a Progress Prompt).
Prerequisites
An interactable actor that returns at least one option (How-To: Make an Actor Interactable).
The three shapes
| Shape | How to configure the option | Behaviour |
|---|---|---|
| Instant | InputType = Instant, no InteractionActionAbility | Press fires immediately. |
| Hold | InputType = Hold, InputHoldDuration > 0 | Hold the key for the duration; releasing early cancels. On completion runs the InteractionActionAbility if one is set, otherwise fires the standard activate path (the granted handler) - a plain hold needs no extra ability. Treat InputHoldDuration <= 0 as an instant press. |
| Duration / channel | InputType = Instant with an InteractionActionAbility | Press starts the timed action ability immediately (e.g. mining), which ticks progress and fires on completion. Author it yourself - How-To: Add Holds, Channels & a Progress Prompt, step 2. (CrimsonCore - requires all Crimson plugins: `UCrimsonCoreGameplayAbility_InteractionDuration` is a prebuilt 3s channel with opt-in walk-away / release cancels.) |
Changing only hold/channel fields does not refresh the UI
The scan's change-detection compares options with an equality that ignores
InputType, InputHoldDuration, and InteractionActionAbility. If a gather returns the same target/text/ability but different hold settings, no options-changed broadcast fires. Change Text/SubText too (e.g. 'Open' -> 'Pry open') when a live refresh matters.Configure a hold interaction
Input Action setup for holds
The interact Input Action (and its IMC mapping) must have no Pressed or Tap trigger - leave the triggers list empty (implicit Down). Pressed/Tap drop their trigger state one frame after the press, which fires
Completed/Canceled while the key is still physically held and cancels the hold instantly. If the IA must carry a trigger (e.g. a shared multi-behavior ability action), use UInputTriggerCrimsonPressAndHold (CrimsonInput plugin - optional) - single Triggered on press, Completed on real release.Why not an Enhanced Input Hold trigger?
(1) No variable hold timers:
UInputTriggerHold.HoldTimeThreshold is one value baked into the IA/IMC asset; InputHoldDuration is per-option data (chest 1.5s, safe 5s), and the input layer has no idea what you are aiming at. (2) Mixed options on one key become impossible: InputType is per-option, resolved at press time - an asset-level trigger imposes one behavior on everything. (3) No progress feed: EI triggers emit state transitions, not percent. The ability-timer hold is the intended design.Verify
Hold the interact key: the target's hold feedback fills over 1.5s and completes; release early and it resets to empty (see How-To: World Indicators & Hold-Progress Feedback).
See also
- How-To: Add Holds, Channels & a Progress Prompt - the implementation behind these shapes.
- Concept: Duration Interactions & Progress UI - how the timer reaches the widget.