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

ShapeHow to configure the optionBehaviour
InstantInputType = Instant, no InteractionActionAbilityPress fires immediately.
HoldInputType = Hold, InputHoldDuration > 0Hold 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 / channelInputType = Instant with an InteractionActionAbilityPress 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

On the option: Input Type = Hold, Input Hold Duration = 1.5. Interaction Action Ability is optional - leave it unset for a plain hold that fires the normal interaction on completion.
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.