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; the behavior is implemented by the interact ability. Crimson Basic Interact fires every option on press (holds fire instantly, duration options are not run); holds and channels need your own ability (How-To: Write Your Own Interact Ability + 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 optionBehavior
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 Make CrimsonInteractionOption node that builds the option: Input Type = Hold, Input Hold Duration = 1.5. Leave Interaction Action Ability unset (None) - a plain hold fires the normal interaction through Interaction Ability To Grant when the timer completes, so the action ability is only for the channel case.

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), it has to be one that keeps reporting ETriggerState::Triggered for as long as the key is physically down - Enhanced Input raises Completed the moment a trigger stops reporting Triggered, so anything that self-terminates on the press frame ends the hold with it.
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.