Concept: The Three Layers
Interaction is split across three plugins so that being interactable never drags in the whole system - and so the mechanism works without any particular ability framework on top.
| Layer | Plugin | Holds |
|---|---|---|
| Contract | CrimsonCommon (required) | ICrimsonInteractableTarget, ICrimsonInteractionInstigator, FCrimsonInteractionOption, FCrimsonInteractionQuery, FCrimsonInteractionOptionBuilder (C++), FCrimsonInteractionProgressMessage. The message bus and UIExtension system also live here. |
| Mechanism | CrimsonInteraction (this plugin) | The scan / grant ability tasks, UCrimsonInteractionStatics (incl. TriggerInteractionOption), UCrimsonInteractionDurationContext, the target actor, collision profiles, and UCrimsonInteractionSettings. No abilities, no widgets, no tags. |
| Turnkey abilities & UI | CrimsonCore (optional - compiles only with all Crimson plugins installed) | Prebuilt interact / duration / handler abilities, ACrimsonInteractableActor, the HUD prompt widget, world indicators (with CrimsonUI), the options-changed message, and the Ability.Interaction.* / InputTag.Interact tags. The Quick Start builds the same layer by hand. |
Why the abilities are not in this plugin
CrimsonCore's granted abilities derive from
UCrimsonGameplayAbility so UCrimsonAbilitySystemComponent's input/group-cancel logic can manage them - and CrimsonInteraction cannot depend on the ability-system plugin. The mechanism here is deliberately GAS-base-agnostic: its tasks and statics work with plain UGameplayAbility subclasses, which is exactly what the Quick Start uses.What it means for you
- To be interactable, depend on
CrimsonCommononly - implementICrimsonInteractableTarget. - To drive interaction, author a
UGameplayAbilityaround this plugin's tasks (Quick Start). - To show progress UI, subscribe to
FCrimsonInteractionProgressMessage- also aCrimsonCommon-only dependency. - Event tags are conventions, not code: this plugin hardcodes none. You define your own (Quick Start step 2); using CrimsonCore's strings keeps content portable between the two worlds.