claude-code-arcane 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +131 -41
- package/agents/game/ue-blueprint-specialist.md +125 -0
- package/agents/game/ue-gas-specialist.md +133 -0
- package/agents/game/ue-umg-specialist.md +131 -0
- package/dist/cli.js +642 -478
- package/docs/SKILLS-CATALOG.md +42 -3
- package/docs/USER-GUIDE.md +28 -54
- package/hooks/detect-unreal.sh +90 -0
- package/package.json +2 -1
- package/profiles/agile.yaml +1 -1
- package/profiles/ai.yaml +1 -1
- package/profiles/android-native.yaml +1 -1
- package/profiles/audio.yaml +1 -1
- package/profiles/backend-dotnet.yaml +1 -1
- package/profiles/backend-go.yaml +1 -1
- package/profiles/backend-nestjs.yaml +1 -1
- package/profiles/backend-nextjs.yaml +1 -1
- package/profiles/backend-ts.yaml +1 -1
- package/profiles/business.yaml +1 -1
- package/profiles/clevel.yaml +1 -1
- package/profiles/clickup.yaml +1 -1
- package/profiles/core.yaml +1 -1
- package/profiles/database.yaml +1 -1
- package/profiles/design.yaml +1 -1
- package/profiles/docs.yaml +1 -1
- package/profiles/ecommerce.yaml +1 -1
- package/profiles/finance.yaml +1 -1
- package/profiles/flutter.yaml +1 -1
- package/profiles/freelance.yaml +1 -1
- package/profiles/frontend.yaml +1 -1
- package/profiles/infra.yaml +1 -1
- package/profiles/integrations.yaml +1 -1
- package/profiles/ios-native.yaml +1 -1
- package/profiles/jira.yaml +1 -1
- package/profiles/job-hunt.yaml +1 -1
- package/profiles/marketing.yaml +1 -1
- package/profiles/mobile.yaml +1 -1
- package/profiles/regulatory.yaml +1 -1
- package/profiles/second-brain.yaml +1 -1
- package/profiles/security.yaml +1 -1
- package/profiles/self-improving.yaml +1 -1
- package/profiles/statusline.yaml +1 -1
- package/profiles/testing.yaml +1 -1
- package/profiles/unity-design.yaml +1 -1
- package/profiles/unity-dev.yaml +1 -1
- package/profiles/unreal-dev.yaml +97 -0
- package/profiles/visual-novel.yaml +1 -1
- package/rules/gamedev/unreal-code.md +125 -0
- package/skills/arcane-list/SKILL.md +12 -7
- package/skills/install-mcp/SKILL.md +135 -46
- package/skills/install-mcp/references/unreal-operations.md +55 -0
- package/skills/ue-actor-component-architecture/SKILL.md +509 -0
- package/skills/ue-actor-component-architecture/references/actor-lifecycle.md +301 -0
- package/skills/ue-actor-component-architecture/references/component-types.md +592 -0
- package/skills/ue-ai-navigation/SKILL.md +526 -0
- package/skills/ue-ai-navigation/references/behavior-tree-patterns.md +392 -0
- package/skills/ue-ai-navigation/references/behavior-tree-workflow.md +107 -0
- package/skills/ue-ai-navigation/references/custom-bttask.md +104 -0
- package/skills/ue-ai-navigation/references/eqs-reference.md +423 -0
- package/skills/ue-animation-system/SKILL.md +521 -0
- package/skills/ue-animation-system/references/anim-notify-reference.md +486 -0
- package/skills/ue-animation-system/references/locomotion-setup.md +550 -0
- package/skills/ue-async-threading/SKILL.md +433 -0
- package/skills/ue-async-threading/references/thread-safety-guide.md +213 -0
- package/skills/ue-async-threading/references/threading-patterns.md +345 -0
- package/skills/ue-audio-system/SKILL.md +527 -0
- package/skills/ue-audio-system/references/audio-setup-patterns.md +700 -0
- package/skills/ue-blueprints/SKILL.md +134 -0
- package/skills/ue-blueprints/references/communication.md +82 -0
- package/skills/ue-character-movement/SKILL.md +475 -0
- package/skills/ue-character-movement/references/cmc-extension-patterns.md +335 -0
- package/skills/ue-character-movement/references/movement-pipeline.md +189 -0
- package/skills/ue-cpp-foundations/SKILL.md +533 -0
- package/skills/ue-cpp-foundations/references/components-and-gc.md +107 -0
- package/skills/ue-cpp-foundations/references/container-patterns.md +544 -0
- package/skills/ue-cpp-foundations/references/delegate-patterns.md +497 -0
- package/skills/ue-cpp-foundations/references/gameplay-classes-cpp.md +136 -0
- package/skills/ue-cpp-foundations/references/property-specifiers.md +306 -0
- package/skills/ue-data-assets-tables/SKILL.md +527 -0
- package/skills/ue-data-assets-tables/references/asset-loading-patterns.md +306 -0
- package/skills/ue-data-assets-tables/references/data-driven-design.md +378 -0
- package/skills/ue-editor-tools/SKILL.md +523 -0
- package/skills/ue-editor-tools/references/detail-customization-patterns.md +395 -0
- package/skills/ue-editor-tools/references/editor-module-setup.md +480 -0
- package/skills/ue-game-features/SKILL.md +477 -0
- package/skills/ue-game-features/references/experience-system.md +222 -0
- package/skills/ue-game-features/references/game-feature-patterns.md +308 -0
- package/skills/ue-gameplay-abilities/SKILL.md +518 -0
- package/skills/ue-gameplay-abilities/references/ability-task-reference.md +391 -0
- package/skills/ue-gameplay-abilities/references/gameplay-effect-reference.md +397 -0
- package/skills/ue-gameplay-abilities/references/gas-setup-patterns.md +369 -0
- package/skills/ue-gameplay-framework/SKILL.md +466 -0
- package/skills/ue-gameplay-framework/references/framework-class-map.md +243 -0
- package/skills/ue-input-system/SKILL.md +394 -0
- package/skills/ue-input-system/references/cpp-setup.md +131 -0
- package/skills/ue-input-system/references/enhanced-input-workflow.md +117 -0
- package/skills/ue-input-system/references/input-action-reference.md +731 -0
- package/skills/ue-mass-entity/SKILL.md +476 -0
- package/skills/ue-mass-entity/references/mass-entity-patterns.md +319 -0
- package/skills/ue-mass-entity/references/mass-fragment-reference.md +119 -0
- package/skills/ue-materials-rendering/SKILL.md +526 -0
- package/skills/ue-materials-rendering/references/material-parameter-reference.md +216 -0
- package/skills/ue-materials-rendering/references/post-process-settings.md +383 -0
- package/skills/ue-module-build-system/SKILL.md +487 -0
- package/skills/ue-module-build-system/references/build-cs-reference.md +418 -0
- package/skills/ue-module-build-system/references/common-build-errors.md +381 -0
- package/skills/ue-naming-conventions/SKILL.md +142 -0
- package/skills/ue-naming-conventions/references/asset-name-modifiers.md +233 -0
- package/skills/ue-naming-conventions/references/content-structure.md +83 -0
- package/skills/ue-networking-replication/SKILL.md +452 -0
- package/skills/ue-networking-replication/references/replication-patterns.md +526 -0
- package/skills/ue-networking-replication/references/rpc-decision-guide.md +393 -0
- package/skills/ue-niagara-effects/SKILL.md +531 -0
- package/skills/ue-niagara-effects/references/niagara-data-interfaces.md +491 -0
- package/skills/ue-niagara-effects/references/niagara-parameter-types.md +153 -0
- package/skills/ue-niagara-effects/references/niagara-workflow.md +115 -0
- package/skills/ue-packaging/SKILL.md +116 -0
- package/skills/ue-physics-collision/SKILL.md +423 -0
- package/skills/ue-physics-collision/references/collision-channel-setup.md +218 -0
- package/skills/ue-physics-collision/references/trace-patterns.md +499 -0
- package/skills/ue-procedural-generation/SKILL.md +505 -0
- package/skills/ue-procedural-generation/references/pcg-node-reference.md +381 -0
- package/skills/ue-procedural-generation/references/procedural-mesh-patterns.md +940 -0
- package/skills/ue-project-context/SKILL.md +305 -0
- package/skills/ue-sequencer-cinematics/SKILL.md +506 -0
- package/skills/ue-sequencer-cinematics/references/sequencer-patterns.md +629 -0
- package/skills/ue-serialization-savegames/SKILL.md +524 -0
- package/skills/ue-serialization-savegames/references/save-system-architecture.md +705 -0
- package/skills/ue-state-trees/SKILL.md +489 -0
- package/skills/ue-state-trees/references/state-tree-mass-integration.md +184 -0
- package/skills/ue-state-trees/references/state-tree-patterns.md +321 -0
- package/skills/ue-testing-debugging/SKILL.md +520 -0
- package/skills/ue-testing-debugging/references/automation-test-patterns.md +387 -0
- package/skills/ue-testing-debugging/references/profiling-commands.md +357 -0
- package/skills/ue-ui-umg-slate/SKILL.md +431 -0
- package/skills/ue-ui-umg-slate/references/common-ui-setup.md +484 -0
- package/skills/ue-ui-umg-slate/references/widget-types.md +487 -0
- package/skills/ue-world-level-streaming/SKILL.md +518 -0
- package/skills/ue-world-level-streaming/references/streaming-patterns.md +414 -0
- package/templates/gamedev/unreal-project-context.md +107 -0
|
@@ -0,0 +1,731 @@
|
|
|
1
|
+
# Enhanced Input: Trigger and Modifier Reference
|
|
2
|
+
|
|
3
|
+
Complete reference for built-in `UInputTrigger` and `UInputModifier` classes.
|
|
4
|
+
All classes are in the `EnhancedInput` plugin module.
|
|
5
|
+
Source headers: `InputTriggers.h`, `InputModifiers.h`.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## UInputAction Properties
|
|
10
|
+
|
|
11
|
+
```cpp
|
|
12
|
+
class UInputAction : public UDataAsset
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Property | Type | Default | Description |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| `ValueType` | `EInputActionValueType` | `Boolean` | Shape of the value: `Boolean`, `Axis1D` (float), `Axis2D` (FVector2D), `Axis3D` (FVector) |
|
|
18
|
+
| `AccumulationBehavior` | `EInputActionAccumulationBehavior` | `TakeHighestAbsoluteValue` | How multiple mappings to the same action are combined |
|
|
19
|
+
| `bConsumeInput` | `bool` | `true` | If true, lower-priority Enhanced Input mappings to the same keys are blocked |
|
|
20
|
+
| `bConsumesActionAndAxisMappings` | `bool` | `false` | If true, legacy Action/Axis mappings to the same key are also blocked |
|
|
21
|
+
| `bReserveAllMappings` | `bool` | `false` | Mappings are not automatically overridden by higher-priority contexts |
|
|
22
|
+
| `bTriggerWhenPaused` | `bool` | `false` | Action fires even while game is paused |
|
|
23
|
+
| `Triggers` | `TArray<UInputTrigger*>` | empty | Action-level triggers; applied after per-mapping triggers |
|
|
24
|
+
| `Modifiers` | `TArray<UInputModifier*>` | empty | Action-level modifiers; applied after per-mapping modifiers |
|
|
25
|
+
|
|
26
|
+
### EInputActionAccumulationBehavior
|
|
27
|
+
|
|
28
|
+
| Value | Behavior |
|
|
29
|
+
|---|---|
|
|
30
|
+
| `TakeHighestAbsoluteValue` | The mapping with the highest absolute value wins. Pressing W (-0.3) and D (0.5) gives 0.5. |
|
|
31
|
+
| `Cumulative` | All mapping values are added. Pressing W (1.0) and S (-1.0) cancels to 0.0. Useful for WASD pairs. |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## FInputActionInstance (Runtime)
|
|
36
|
+
|
|
37
|
+
Available inside `FInputActionInstance` callbacks:
|
|
38
|
+
|
|
39
|
+
| Method | Returns | Description |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `GetValue()` | `FInputActionValue` | Current value; zero when event is not `Triggered` |
|
|
42
|
+
| `GetTriggerEvent()` | `ETriggerEvent` | Current event state |
|
|
43
|
+
| `GetElapsedTime()` | `float` | Seconds since action began evaluating (Started + Ongoing + Triggered) |
|
|
44
|
+
| `GetTriggeredTime()` | `float` | Seconds the action has been in `Triggered` state only |
|
|
45
|
+
| `GetLastTriggeredWorldTime()` | `float` | World time of last trigger |
|
|
46
|
+
| `GetSourceAction()` | `const UInputAction*` | The originating action asset |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## ETriggerEvent
|
|
51
|
+
|
|
52
|
+
Bitmask enum. Represents state transitions observed in a single tick.
|
|
53
|
+
|
|
54
|
+
| Value | Bit | State Transition | Fires when |
|
|
55
|
+
|---|---|---|---|
|
|
56
|
+
| `None` | 0x00 | — | No significant transition, no active inputs |
|
|
57
|
+
| `Triggered` | 0x01 | None->Triggered, Ongoing->Triggered, Triggered->Triggered | Action is actively firing; also fires on the first triggered frame |
|
|
58
|
+
| `Started` | 0x02 | None->Ongoing, None->Triggered | First frame any input begins evaluation |
|
|
59
|
+
| `Ongoing` | 0x04 | Ongoing->Ongoing | Input is held and processing but trigger condition not yet met |
|
|
60
|
+
| `Canceled` | 0x08 | Ongoing->None | Evaluation began but was abandoned before triggering (e.g., held key released early) |
|
|
61
|
+
| `Completed` | 0x10 | Triggered->None | Trigger was active and has now ended |
|
|
62
|
+
|
|
63
|
+
`Completed` will not fire if any trigger on the same action reports `Ongoing` that frame.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Trigger Classes
|
|
68
|
+
|
|
69
|
+
### ETriggerState (Internal)
|
|
70
|
+
|
|
71
|
+
Triggers return one of three states:
|
|
72
|
+
|
|
73
|
+
| State | Meaning |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `None` | No conditions met |
|
|
76
|
+
| `Ongoing` | Conditions partially met; continue evaluating |
|
|
77
|
+
| `Triggered` | All conditions met; fire the action |
|
|
78
|
+
|
|
79
|
+
### ETriggerType (Multi-Trigger Evaluation)
|
|
80
|
+
|
|
81
|
+
| Type | Rule |
|
|
82
|
+
|---|---|
|
|
83
|
+
| `Explicit` | At least one Explicit trigger must be in Triggered state |
|
|
84
|
+
| `Implicit` | All Implicit triggers must be in Triggered state |
|
|
85
|
+
| `Blocker` | If blocking, prevents all other triggers from firing |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### UInputTriggerDown
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
DisplayName: "Down"
|
|
93
|
+
Class: UInputTriggerDown : public UInputTrigger
|
|
94
|
+
TriggerType: Explicit
|
|
95
|
+
SupportedEvents: Instant
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Behavior:** Fires `Triggered` every frame input magnitude exceeds `ActuationThreshold`.
|
|
99
|
+
This is the implicit default when an action has no triggers assigned.
|
|
100
|
+
|
|
101
|
+
**Properties:**
|
|
102
|
+
|
|
103
|
+
| Property | Type | Default | Description |
|
|
104
|
+
|---|---|---|---|
|
|
105
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude to consider the input actuated |
|
|
106
|
+
|
|
107
|
+
**Use for:** Continuous actions where you want firing as long as a key is held (before adding a proper trigger).
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### UInputTriggerPressed
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
DisplayName: "Pressed"
|
|
115
|
+
Class: UInputTriggerPressed : public UInputTrigger
|
|
116
|
+
TriggerType: Explicit
|
|
117
|
+
SupportedEvents: Instant
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Behavior:** Fires `Triggered` exactly once on the first frame input exceeds `ActuationThreshold`.
|
|
121
|
+
Holding the input does not fire again. Re-press is required for another trigger.
|
|
122
|
+
|
|
123
|
+
**Properties:**
|
|
124
|
+
|
|
125
|
+
| Property | Type | Default | Description |
|
|
126
|
+
|---|---|---|---|
|
|
127
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
|
|
128
|
+
|
|
129
|
+
**Use for:** Discrete press-once actions: jump initiation, weapon fire on semi-auto, menu confirm.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### UInputTriggerReleased
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
DisplayName: "Released"
|
|
137
|
+
Class: UInputTriggerReleased : public UInputTrigger
|
|
138
|
+
TriggerType: Explicit
|
|
139
|
+
SupportedEvents: Instant
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Behavior:** Returns `Ongoing` while input exceeds `ActuationThreshold`. Fires `Triggered`
|
|
143
|
+
once when input drops back below the threshold after having been actuated.
|
|
144
|
+
|
|
145
|
+
**Properties:**
|
|
146
|
+
|
|
147
|
+
| Property | Type | Default | Description |
|
|
148
|
+
|---|---|---|---|
|
|
149
|
+
| `ActuationThreshold` | `float` | `0.5` | Threshold |
|
|
150
|
+
|
|
151
|
+
**Use for:** Release-on-let-go: throwing after wind-up on a dedicated action, "lift to release" grenades.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
### UInputTriggerHold
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
DisplayName: "Hold"
|
|
159
|
+
Class: UInputTriggerHold : public UInputTriggerTimedBase
|
|
160
|
+
TriggerType: Explicit
|
|
161
|
+
SupportedEvents: Ongoing (Started, Ongoing, Triggered, Canceled)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Behavior:** Returns `Ongoing` while input is held. After `HoldTimeThreshold` seconds,
|
|
165
|
+
fires `Triggered`. If `bIsOneShot=false`, continues firing `Triggered` every frame.
|
|
166
|
+
If input is released before the threshold, fires `Canceled`.
|
|
167
|
+
|
|
168
|
+
**Properties:**
|
|
169
|
+
|
|
170
|
+
| Property | Type | Default | Description |
|
|
171
|
+
|---|---|---|---|
|
|
172
|
+
| `HoldTimeThreshold` | `float` | `1.0` | Seconds of continuous hold required |
|
|
173
|
+
| `bIsOneShot` | `bool` | `false` | If true, fires `Triggered` only once then stops; if false, fires every frame after threshold |
|
|
174
|
+
| `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation when accumulating hold duration |
|
|
175
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
|
|
176
|
+
|
|
177
|
+
**Use for:** Hold-to-interact prompts, charged attacks where you need the `Ongoing` callback
|
|
178
|
+
to show a progress bar. Combine with `GetElapsedTime()` in the `Ongoing` handler.
|
|
179
|
+
|
|
180
|
+
**Example — charge bar:**
|
|
181
|
+
```cpp
|
|
182
|
+
void AMyCharacter::UpdateChargeBar(const FInputActionInstance& Instance)
|
|
183
|
+
{
|
|
184
|
+
// Instance.GetElapsedTime() grows while key is held
|
|
185
|
+
const float Progress = FMath::Clamp(
|
|
186
|
+
Instance.GetElapsedTime() / HoldTrigger->HoldTimeThreshold, 0.f, 1.f);
|
|
187
|
+
ChargeBarWidget->SetPercent(Progress);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
### UInputTriggerHoldAndRelease
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
DisplayName: "Hold And Release"
|
|
197
|
+
Class: UInputTriggerHoldAndRelease : public UInputTriggerTimedBase
|
|
198
|
+
TriggerType: Explicit
|
|
199
|
+
SupportedEvents: Ongoing
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Behavior:** Returns `Ongoing` while input is held. Fires `Triggered` only when input
|
|
203
|
+
is released after having been held for at least `HoldTimeThreshold` seconds.
|
|
204
|
+
If released before the threshold, does not trigger.
|
|
205
|
+
|
|
206
|
+
**Properties:**
|
|
207
|
+
|
|
208
|
+
| Property | Type | Default | Description |
|
|
209
|
+
|---|---|---|---|
|
|
210
|
+
| `HoldTimeThreshold` | `float` | `0.5` | Minimum hold duration before release triggers |
|
|
211
|
+
| `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
|
|
212
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
|
|
213
|
+
|
|
214
|
+
**Use for:** "Pull back and release" bows, charged throws where the shot fires on release.
|
|
215
|
+
Different from `UInputTriggerHold` in that the payload fires on release, not during hold.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
### UInputTriggerTap
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
DisplayName: "Tap"
|
|
223
|
+
Class: UInputTriggerTap : public UInputTriggerTimedBase
|
|
224
|
+
TriggerType: Explicit
|
|
225
|
+
SupportedEvents: Instant
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Behavior:** Fires `Triggered` if input is actuated then released within
|
|
229
|
+
`TapReleaseTimeThreshold` seconds. Returns `Ongoing` while held within the window.
|
|
230
|
+
If held past the threshold without release, the trigger does not fire.
|
|
231
|
+
|
|
232
|
+
**Properties:**
|
|
233
|
+
|
|
234
|
+
| Property | Type | Default | Description |
|
|
235
|
+
|---|---|---|---|
|
|
236
|
+
| `TapReleaseTimeThreshold` | `float` | `0.2` | Max seconds between press and release to count as a tap |
|
|
237
|
+
| `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
|
|
238
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
|
|
239
|
+
|
|
240
|
+
**Use for:** Quick-dash on tap (vs hold for a sustained dash). Combine with a separate
|
|
241
|
+
`UInputTriggerHold` on a second binding of the same key to distinguish tap vs hold.
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
### UInputTriggerRepeatedTap
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
DisplayName: "Repeated Tap"
|
|
249
|
+
Class: UInputTriggerRepeatedTap : public UInputTriggerTimedBase
|
|
250
|
+
TriggerType: Explicit
|
|
251
|
+
SupportedEvents: Instant
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Behavior:** Fires `Triggered` when the input is tapped `NumberOfTapsWhichTriggerRepeat`
|
|
255
|
+
times in succession, with each individual tap completing within `TapReleaseTimeThreshold`
|
|
256
|
+
and each gap between taps within `RepeatDelay` seconds.
|
|
257
|
+
|
|
258
|
+
**Properties:**
|
|
259
|
+
|
|
260
|
+
| Property | Type | Default | Description |
|
|
261
|
+
|---|---|---|---|
|
|
262
|
+
| `NumberOfTapsWhichTriggerRepeat` | `int32` | `2` | Number of rapid taps required to trigger |
|
|
263
|
+
| `RepeatDelay` | `double` | `0.5` | Max seconds allowed between consecutive taps |
|
|
264
|
+
| `TapReleaseTimeThreshold` | `float` | `0.2` | Max hold duration per tap |
|
|
265
|
+
| `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
|
|
266
|
+
|
|
267
|
+
**Use for:** Double-tap dodge roll (`NumberOfTapsWhichTriggerRepeat=2`), triple-tap finisher.
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### UInputTriggerPulse
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
DisplayName: "Pulse"
|
|
275
|
+
Class: UInputTriggerPulse : public UInputTriggerTimedBase
|
|
276
|
+
TriggerType: Explicit
|
|
277
|
+
SupportedEvents: Ongoing
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**Behavior:** While input is held, fires `Triggered` at regular `Interval` second intervals.
|
|
281
|
+
If `bTriggerOnStart=true`, also fires immediately on the first actuation frame.
|
|
282
|
+
Stops after `TriggerLimit` fires if `TriggerLimit > 0`.
|
|
283
|
+
|
|
284
|
+
**Properties:**
|
|
285
|
+
|
|
286
|
+
| Property | Type | Default | Description |
|
|
287
|
+
|---|---|---|---|
|
|
288
|
+
| `bTriggerOnStart` | `bool` | `true` | Fire on the first frame of actuation before the first interval elapses |
|
|
289
|
+
| `Interval` | `float` | `1.0` | Seconds between successive triggers |
|
|
290
|
+
| `TriggerLimit` | `int32` | `0` | Maximum number of fires; 0 = unlimited |
|
|
291
|
+
| `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
|
|
292
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
|
|
293
|
+
|
|
294
|
+
**Use for:** Automatic weapon fire rate, repeated ability pulses while holding a key,
|
|
295
|
+
tick-based resource drain.
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
### UInputTriggerChordAction
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
DisplayName: "Chorded Action"
|
|
303
|
+
Class: UInputTriggerChordAction : public UInputTrigger
|
|
304
|
+
TriggerType: Implicit
|
|
305
|
+
SupportedEvents: Instant
|
|
306
|
+
NotInputConfigurable: true (not exposed in per-mapping settings)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**Behavior:** This action only fires when `ChordAction` is simultaneously in `Triggered`
|
|
310
|
+
state. Automatically creates a `UInputTriggerChordBlocker` on `ChordAction` to prevent
|
|
311
|
+
the chord key from also firing solo actions while the chord is active.
|
|
312
|
+
|
|
313
|
+
**Properties:**
|
|
314
|
+
|
|
315
|
+
| Property | Type | Default | Description |
|
|
316
|
+
|---|---|---|---|
|
|
317
|
+
| `ChordAction` | `const UInputAction*` | `nullptr` | The action that must be active at the same time |
|
|
318
|
+
| `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
|
|
319
|
+
|
|
320
|
+
**Setup pattern — Shift+E for special interact:**
|
|
321
|
+
|
|
322
|
+
1. Create `IA_Sprint` (Bool) bound to Shift in the IMC
|
|
323
|
+
2. Create `IA_SpecialInteract` (Bool) bound to E in the IMC
|
|
324
|
+
3. On `IA_SpecialInteract`, add a `UInputTriggerChordAction` with `ChordAction = IA_Sprint`
|
|
325
|
+
4. Result: E fires `IA_Interact`; Shift+E fires `IA_SpecialInteract`; E while Shift is held does NOT fire `IA_Interact`
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
### UInputTriggerCombo (Beta)
|
|
330
|
+
|
|
331
|
+
```
|
|
332
|
+
DisplayName: "Combo (Beta)"
|
|
333
|
+
Class: UInputTriggerCombo : public UInputTrigger
|
|
334
|
+
TriggerType: Implicit
|
|
335
|
+
SupportedEvents: All
|
|
336
|
+
NotInputConfigurable: true
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
**Behavior:** Fires when all `ComboActions` are completed in order. Each step must be
|
|
340
|
+
completed within its `TimeToPressKey` window after the previous step. The trigger fires
|
|
341
|
+
for one frame then resets. Actions in `InputCancelActions` abort the combo if triggered.
|
|
342
|
+
|
|
343
|
+
**Properties:**
|
|
344
|
+
|
|
345
|
+
| Property | Type | Default | Description |
|
|
346
|
+
|---|---|---|---|
|
|
347
|
+
| `ComboActions` | `TArray<FInputComboStepData>` | empty | Ordered sequence of steps |
|
|
348
|
+
| `InputCancelActions` | `TArray<FInputCancelAction>` | empty | Actions that abort the combo |
|
|
349
|
+
|
|
350
|
+
**FInputComboStepData fields:**
|
|
351
|
+
|
|
352
|
+
| Field | Type | Default | Description |
|
|
353
|
+
|---|---|---|---|
|
|
354
|
+
| `ComboStepAction` | `const UInputAction*` | `nullptr` | The action for this step |
|
|
355
|
+
| `ComboStepCompletionStates` | `uint8` (bitmask of `ETriggerEvent`) | `Triggered` | Which events count as completing this step |
|
|
356
|
+
| `TimeToPressKey` | `float` | `0.5` | Seconds after previous step within which this step must complete |
|
|
357
|
+
|
|
358
|
+
**Use for:** Fighting game input sequences (Down, Down-Right, Right + Attack = Hadouken),
|
|
359
|
+
multi-step ability combos.
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## Modifier Classes
|
|
364
|
+
|
|
365
|
+
### UInputModifierDeadZone
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
DisplayName: "Dead Zone"
|
|
369
|
+
Class: UInputModifierDeadZone : public UInputModifier
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**Behavior:** Input values with magnitude below `LowerThreshold` are zeroed out.
|
|
373
|
+
Values are remapped from `[LowerThreshold, UpperThreshold]` to `[0, 1]`.
|
|
374
|
+
Values above `UpperThreshold` are clamped to 1.
|
|
375
|
+
|
|
376
|
+
**Properties:**
|
|
377
|
+
|
|
378
|
+
| Property | Type | Default | Description |
|
|
379
|
+
|---|---|---|---|
|
|
380
|
+
| `LowerThreshold` | `float` | `0.2` | Below this, input is zero |
|
|
381
|
+
| `UpperThreshold` | `float` | `1.0` | Above this, input is clamped to 1 |
|
|
382
|
+
| `Type` | `EDeadZoneType` | `Radial` | `Axial`: per-axis (chamfered corners); `Radial`: circular smooth; `UnscaledRadial`: circular, no smoothing |
|
|
383
|
+
|
|
384
|
+
**EDeadZoneType:**
|
|
385
|
+
|
|
386
|
+
| Value | Description |
|
|
387
|
+
|---|---|
|
|
388
|
+
| `Axial` | Dead zone applied independently per axis. Matches UE4 legacy behavior. Results in chamfered corners on 2D sticks. |
|
|
389
|
+
| `Radial` | Dead zone applied to the combined magnitude. Gives smooth circular coverage. Recommended for most sticks. |
|
|
390
|
+
| `UnscaledRadial` | Radial dead zone without the value smoothing. Can feel "jumpy" at the threshold boundary. |
|
|
391
|
+
|
|
392
|
+
**Use for:** All gamepad analog stick mappings. Add per-stick-mapping in the IMC, not on the action asset.
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
### UInputModifierScalar
|
|
397
|
+
|
|
398
|
+
```
|
|
399
|
+
DisplayName: "Scalar"
|
|
400
|
+
Class: UInputModifierScalar : public UInputModifier
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
**Behavior:** Multiplies each axis component of the input by the corresponding component
|
|
404
|
+
of `Scalar`. Has no effect on Boolean value types.
|
|
405
|
+
|
|
406
|
+
**Properties:**
|
|
407
|
+
|
|
408
|
+
| Property | Type | Default | Description |
|
|
409
|
+
|---|---|---|---|
|
|
410
|
+
| `Scalar` | `FVector` | `(1, 1, 1)` | Per-axis multiplier |
|
|
411
|
+
|
|
412
|
+
**Use for:** Mouse sensitivity scaling (`Scalar=(0.4, 0.4, 1.0)`), axis inversion without
|
|
413
|
+
using `Negate` (set component to -1.0), adjusting controller stick sensitivity.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
### UInputModifierScaleByDeltaTime
|
|
418
|
+
|
|
419
|
+
```
|
|
420
|
+
DisplayName: "Scale By Delta Time"
|
|
421
|
+
Class: UInputModifierScaleByDeltaTime : public UInputModifier
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**Behavior:** Multiplies the input value by the current frame's DeltaTime.
|
|
425
|
+
No configurable properties.
|
|
426
|
+
|
|
427
|
+
**Use for:** Making input frame-rate independent when feeding raw values into physics
|
|
428
|
+
or math that expects a per-second rate. Not typically needed for movement (AddMovementInput
|
|
429
|
+
already accounts for DeltaTime internally).
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
### UInputModifierNegate
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
DisplayName: "Negate"
|
|
437
|
+
Class: UInputModifierNegate : public UInputModifier
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Behavior:** Inverts selected axes by multiplying by -1.
|
|
441
|
+
|
|
442
|
+
**Properties:**
|
|
443
|
+
|
|
444
|
+
| Property | Type | Default | Description |
|
|
445
|
+
|---|---|---|---|
|
|
446
|
+
| `bX` | `bool` | `true` | Invert X axis |
|
|
447
|
+
| `bY` | `bool` | `true` | Invert Y axis |
|
|
448
|
+
| `bZ` | `bool` | `true` | Invert Z axis |
|
|
449
|
+
|
|
450
|
+
**Use for:** Y-axis inversion for "inverted look" options, negating the S and A keys in
|
|
451
|
+
WASD-to-2D composition.
|
|
452
|
+
|
|
453
|
+
**Common setup — invert Y only:**
|
|
454
|
+
Set `bX=false`, `bY=true`, `bZ=false`.
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
### UInputModifierSwizzleAxis
|
|
459
|
+
|
|
460
|
+
```
|
|
461
|
+
DisplayName: "Swizzle Input Axis Values"
|
|
462
|
+
Class: UInputModifierSwizzleAxis : public UInputModifier
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**Behavior:** Reorders the X, Y, Z components of the input value according to `Order`.
|
|
466
|
+
|
|
467
|
+
**Properties:**
|
|
468
|
+
|
|
469
|
+
| Property | Type | Default | Description |
|
|
470
|
+
|---|---|---|---|
|
|
471
|
+
| `Order` | `EInputAxisSwizzle` | `YXZ` | How to reorder axes |
|
|
472
|
+
|
|
473
|
+
**EInputAxisSwizzle:**
|
|
474
|
+
|
|
475
|
+
| Value | Result | Description |
|
|
476
|
+
|---|---|---|
|
|
477
|
+
| `YXZ` | Output=(Y,X,Z) | Swap X and Y. Maps a 1D W/S key into the Y component of an Axis2D action. |
|
|
478
|
+
| `ZYX` | Output=(Z,Y,X) | Swap X and Z |
|
|
479
|
+
| `XZY` | Output=(X,Z,Y) | Swap Y and Z |
|
|
480
|
+
| `YZX` | Output=(Y,Z,X) | Rotate all axes Y-first |
|
|
481
|
+
| `ZXY` | Output=(Z,X,Y) | Rotate all axes Z-first |
|
|
482
|
+
|
|
483
|
+
**Use for:** The canonical WASD-to-Axis2D mapping. W produces a 1D value of 1.0 on X.
|
|
484
|
+
Adding `SwizzleAxis(YXZ)` converts it to Y=1.0, which is forward in the Axis2D Move action.
|
|
485
|
+
|
|
486
|
+
---
|
|
487
|
+
|
|
488
|
+
### UInputModifierSmooth
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
DisplayName: "Smooth"
|
|
492
|
+
Class: UInputModifierSmooth : public UInputModifier
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
**Behavior:** Averages the input value over recent samples to reduce per-frame jitter.
|
|
496
|
+
Uses a rolling average with `TotalSampleTime` as the accumulation window
|
|
497
|
+
(default ~8.3ms, i.e., roughly one frame at 120fps). Resets when input returns to zero.
|
|
498
|
+
|
|
499
|
+
No configurable public properties (sample window is a compile-time constant).
|
|
500
|
+
|
|
501
|
+
**Use for:** Smoothing raw mouse delta input for look controls. Add alongside `Scalar`
|
|
502
|
+
on mouse look mappings.
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
### UInputModifierSmoothDelta
|
|
507
|
+
|
|
508
|
+
```
|
|
509
|
+
DisplayName: "Smooth Delta"
|
|
510
|
+
Class: UInputModifierSmoothDelta : public UInputModifier
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
**Behavior:** Produces a smoothed normalized delta between the current and previous frame's
|
|
514
|
+
input value, using one of many configurable interpolation methods.
|
|
515
|
+
|
|
516
|
+
**Properties:**
|
|
517
|
+
|
|
518
|
+
| Property | Type | Default | Description |
|
|
519
|
+
|---|---|---|---|
|
|
520
|
+
| `SmoothingMethod` | `ENormalizeInputSmoothingType` | `Lerp` | Interpolation algorithm |
|
|
521
|
+
| `Speed` | `float` | `0.5` | Speed or alpha for the interpolation. If 0, jumps immediately to target. |
|
|
522
|
+
| `EasingExponent` | `float` | `2.0` | Degree of the ease curve; only for `Interp_Ease_*` methods |
|
|
523
|
+
|
|
524
|
+
**ENormalizeInputSmoothingType options:**
|
|
525
|
+
`Lerp`, `Interp_To`, `Interp_Constant_To`, `Interp_Circular_In/Out/In_Out`,
|
|
526
|
+
`Interp_Ease_In/Out/In_Out`, `Interp_Expo_In/Out/In_Out`, `Interp_Sin_In/Out/In_Out`
|
|
527
|
+
|
|
528
|
+
**Use for:** Smooth acceleration/deceleration on stick or mouse input where you want
|
|
529
|
+
to author the feel curve precisely.
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
### UInputModifierResponseCurveExponential
|
|
534
|
+
|
|
535
|
+
```
|
|
536
|
+
DisplayName: "Response Curve - Exponential"
|
|
537
|
+
Class: UInputModifierResponseCurveExponential : public UInputModifier
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
**Behavior:** Applies `sign(x) * |x|^CurveExponent` per axis, creating a non-linear
|
|
541
|
+
response. Values below 1 create a "softer" near-center feel; values above 1 create a
|
|
542
|
+
"harder" aggressive feel.
|
|
543
|
+
|
|
544
|
+
**Properties:**
|
|
545
|
+
|
|
546
|
+
| Property | Type | Default | Description |
|
|
547
|
+
|---|---|---|---|
|
|
548
|
+
| `CurveExponent` | `FVector` | `(1, 1, 1)` | Exponent per axis. 1.0 = linear. 2.0 = squared. |
|
|
549
|
+
|
|
550
|
+
**Use for:** Analog stick look sensitivity curves — a squared or cubed response gives
|
|
551
|
+
fine control near center with fast movement at the edges.
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
### UInputModifierResponseCurveUser
|
|
556
|
+
|
|
557
|
+
```
|
|
558
|
+
DisplayName: "Response Curve - User Defined"
|
|
559
|
+
Class: UInputModifierResponseCurveUser : public UInputModifier
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
**Behavior:** Applies separate `UCurveFloat` assets per axis, evaluating each curve with
|
|
563
|
+
the current axis value as input. Gives full artist control over the response shape.
|
|
564
|
+
|
|
565
|
+
**Properties:**
|
|
566
|
+
|
|
567
|
+
| Property | Type | Default | Description |
|
|
568
|
+
|---|---|---|---|
|
|
569
|
+
| `ResponseX` | `UCurveFloat*` | `nullptr` | Curve for the X axis |
|
|
570
|
+
| `ResponseY` | `UCurveFloat*` | `nullptr` | Curve for the Y axis |
|
|
571
|
+
| `ResponseZ` | `UCurveFloat*` | `nullptr` | Curve for the Z axis |
|
|
572
|
+
|
|
573
|
+
**Use for:** Precise feel tuning with a visible curve asset. Preferred over
|
|
574
|
+
`ResponseCurveExponential` when the exact shape matters and needs iteration in the
|
|
575
|
+
Curve Editor.
|
|
576
|
+
|
|
577
|
+
---
|
|
578
|
+
|
|
579
|
+
### UInputModifierFOVScaling
|
|
580
|
+
|
|
581
|
+
```
|
|
582
|
+
DisplayName: "FOV Scaling"
|
|
583
|
+
Class: UInputModifierFOVScaling : public UInputModifier
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**Behavior:** Scales the mouse look input value by the current camera FOV, maintaining
|
|
587
|
+
a consistent angular displacement per mouse unit regardless of zoom level.
|
|
588
|
+
|
|
589
|
+
**Properties:**
|
|
590
|
+
|
|
591
|
+
| Property | Type | Default | Description |
|
|
592
|
+
|---|---|---|---|
|
|
593
|
+
| `FOVScale` | `float` | `1.0` | Additional scalar applied on top of the FOV calculation |
|
|
594
|
+
| `FOVScalingType` | `EFOVScalingType` | `Standard` | `Standard` = correct; `UE4_BackCompat` = legacy incorrect calculation for migration |
|
|
595
|
+
|
|
596
|
+
**Use for:** Mouse look on any character with a zoom/aim-down-sights mechanic.
|
|
597
|
+
Without this, zoomed-in aim feels faster than unzoomed aim in terms of screen pixels.
|
|
598
|
+
|
|
599
|
+
---
|
|
600
|
+
|
|
601
|
+
### UInputModifierToWorldSpace
|
|
602
|
+
|
|
603
|
+
```
|
|
604
|
+
DisplayName: "To World Space"
|
|
605
|
+
Class: UInputModifierToWorldSpace : public UInputModifier
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
**Behavior:** Converts a 2D axis input into world space. The up/down axis maps to world
|
|
609
|
+
forward (X), and left/right maps to world right (Y). Allows the value to be passed
|
|
610
|
+
directly to `AddMovementInput` or similar world-space functions without manual conversion.
|
|
611
|
+
|
|
612
|
+
No configurable properties.
|
|
613
|
+
|
|
614
|
+
**Use for:** Simplifying movement handler code when you want to receive a world-space
|
|
615
|
+
direction directly from the callback rather than rotating by the actor's facing.
|
|
616
|
+
|
|
617
|
+
---
|
|
618
|
+
|
|
619
|
+
## Modifier Execution Order
|
|
620
|
+
|
|
621
|
+
Modifiers are applied in this sequence:
|
|
622
|
+
|
|
623
|
+
1. Per-mapping modifiers (defined on each `FEnhancedActionKeyMapping` in the IMC)
|
|
624
|
+
2. Action-level modifiers (defined on the `UInputAction` asset `Modifiers` array)
|
|
625
|
+
|
|
626
|
+
Within each group, modifiers execute in array order. The output of modifier N is the
|
|
627
|
+
input to modifier N+1.
|
|
628
|
+
|
|
629
|
+
**Typical keyboard+mouse stack for a look action:**
|
|
630
|
+
```
|
|
631
|
+
Mapping modifiers: [Scalar(0.4, 0.4, 1.0), Smooth, FOVScaling]
|
|
632
|
+
Action modifiers: [] (none needed at action level)
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
**Typical gamepad stick move action:**
|
|
636
|
+
```
|
|
637
|
+
Mapping modifiers: [DeadZone(Radial, 0.2, 1.0), SwizzleAxis(YXZ)] // for W/S keys
|
|
638
|
+
Mapping modifiers: [DeadZone(Radial, 0.2, 1.0)] // for D/A keys
|
|
639
|
+
Action modifiers: []
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## Custom Trigger Interface
|
|
645
|
+
|
|
646
|
+
Override in a `UInputTrigger` subclass:
|
|
647
|
+
|
|
648
|
+
| Virtual Method | Signature | Description |
|
|
649
|
+
|---|---|---|
|
|
650
|
+
| `UpdateState_Implementation` | `ETriggerState(const UEnhancedPlayerInput*, FInputActionValue, float DeltaTime)` | Core per-tick evaluation; return None/Ongoing/Triggered |
|
|
651
|
+
| `GetTriggerType_Implementation` | `ETriggerType()` | Return Explicit, Implicit, or Blocker |
|
|
652
|
+
| `GetSupportedTriggerEvents` | `ETriggerEventsSupported()` | Declare which ETriggerEvent types this trigger can produce |
|
|
653
|
+
| `IsBlocking` | `bool(ETriggerState)` | Return true to block all other triggers (used by ChordBlocker) |
|
|
654
|
+
| `GetDebugState` | `FString()` | Text shown in `ShowDebug EnhancedInput` HUD |
|
|
655
|
+
|
|
656
|
+
`UInputTrigger::IsActuated(const FInputActionValue&)` helper:
|
|
657
|
+
Returns `true` if `Value.GetMagnitudeSq() >= ActuationThreshold * ActuationThreshold`.
|
|
658
|
+
|
|
659
|
+
`UInputTriggerTimedBase` base class provides:
|
|
660
|
+
- `HeldDuration` — accumulated time while actuated
|
|
661
|
+
- `CalculateHeldDuration(PlayerInput, DeltaTime)` — increments with optional time dilation
|
|
662
|
+
- Automatically transitions to `Ongoing` on first actuation
|
|
663
|
+
|
|
664
|
+
---
|
|
665
|
+
|
|
666
|
+
## Custom Modifier Interface
|
|
667
|
+
|
|
668
|
+
Override in a `UInputModifier` subclass:
|
|
669
|
+
|
|
670
|
+
| Virtual Method | Signature | Description |
|
|
671
|
+
|---|---|---|
|
|
672
|
+
| `ModifyRaw_Implementation` | `FInputActionValue(const UEnhancedPlayerInput*, FInputActionValue CurrentValue, float DeltaTime)` | Transform and return the modified value |
|
|
673
|
+
| `GetVisualizationColor_Implementation` | `FLinearColor(FInputActionValue Sample, FInputActionValue Final)` | Color used in debug visualization overlays |
|
|
674
|
+
|
|
675
|
+
The returned `FInputActionValue` will be cast back to the action's `ValueType` before
|
|
676
|
+
further processing, so you can return any type internally.
|
|
677
|
+
|
|
678
|
+
---
|
|
679
|
+
|
|
680
|
+
## UInputMappingContext Properties
|
|
681
|
+
|
|
682
|
+
```cpp
|
|
683
|
+
class UInputMappingContext : public UDataAsset
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
| Property / Method | Type | Description |
|
|
687
|
+
|---|---|---|
|
|
688
|
+
| `DefaultKeyMappings.Mappings` | `TArray<FEnhancedActionKeyMapping>` | Default key-to-action bindings (deprecated in 5.7 — use `GetMappings()` accessor) |
|
|
689
|
+
| `MappingProfileOverrides` | `TMap<FString, FInputMappingContextMappingData>` | Per-profile key overrides (for rebinding profiles) |
|
|
690
|
+
| `RegistrationTrackingMode` | `EMappingContextRegistrationTrackingMode` | `Untracked` or `CountRegistrations` |
|
|
691
|
+
| `InputModeFilterOptions` | `EMappingContextInputModeFilterOptions` | `UseProjectDefaultQuery`, `UseCustomQuery`, `DoNotFilter` |
|
|
692
|
+
| `GetMappings()` | `const TArray<FEnhancedActionKeyMapping>&` | Accessor for default mappings |
|
|
693
|
+
| `MapKey(Action, Key)` | `FEnhancedActionKeyMapping&` | Editor-time: add a key binding |
|
|
694
|
+
| `UnmapKey(Action, Key)` | `void` | Editor-time: remove a key binding |
|
|
695
|
+
| `HasMappingForInputAction(Action)` | `bool` | Returns true if action appears in this IMC |
|
|
696
|
+
|
|
697
|
+
### EMappingContextRegistrationTrackingMode
|
|
698
|
+
|
|
699
|
+
| Value | Behavior |
|
|
700
|
+
|---|---|
|
|
701
|
+
| `Untracked` | First `RemoveMappingContext` call removes the IMC regardless of how many times it was added |
|
|
702
|
+
| `CountRegistrations` | IMC stays active until `RemoveMappingContext` is called the same number of times as `AddMappingContext`. Useful when multiple subsystems share an IMC. |
|
|
703
|
+
|
|
704
|
+
---
|
|
705
|
+
|
|
706
|
+
## UEnhancedInputLocalPlayerSubsystem API
|
|
707
|
+
|
|
708
|
+
```cpp
|
|
709
|
+
// Add a context (BeginPlay or on mode change)
|
|
710
|
+
Subsystem->AddMappingContext(IMC, Priority, Options);
|
|
711
|
+
|
|
712
|
+
// Remove a context (on mode change, unpossess)
|
|
713
|
+
Subsystem->RemoveMappingContext(IMC, Options);
|
|
714
|
+
|
|
715
|
+
// Remove all contexts
|
|
716
|
+
Subsystem->ClearAllMappings();
|
|
717
|
+
|
|
718
|
+
// Check if a context is currently active
|
|
719
|
+
Subsystem->HasMappingContext(IMC);
|
|
720
|
+
|
|
721
|
+
// Query current value of an action without a binding
|
|
722
|
+
Subsystem->GetPlayerInput()->GetActionValue(InputAction);
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
**FModifyContextOptions:**
|
|
726
|
+
|
|
727
|
+
| Field | Type | Default | Description |
|
|
728
|
+
|---|---|---|---|
|
|
729
|
+
| `bIgnoreAllPressedKeysUntilRelease` | `bool` | `true` | Prevents "stuck key" ghost inputs when switching contexts while a key is held |
|
|
730
|
+
| `bForceImmediately` | `bool` | `false` | Rebuild mapping caches immediately rather than deferring to end of frame |
|
|
731
|
+
| `bNotifyUserSettings` | `bool` | `false` | Notify `UEnhancedInputUserSettings` of the change (for rebinding UI) |
|