CrimsonMotionWarping
Character owners only
This plugin drives Unreal's Motion Warping, which only builds a warping adapter for
ACharacter. A non-character pawn logs an error and the component stays inert. The character adapter is also the only one that reconstructs correctly during client prediction replay, so there is no supported non-character path.Motion Warping distorts real authored root motion to land a character on a target, which keeps weight shift and foot planting intact in a way an interpolated SetActorLocation never does. What it has no opinion about is how far. The engine scales root motion by distance-to-target divided by remaining-animation-distance with no clamp of any kind, so a lunge authored to travel 200cm will stretch to 2000cm and slingshot the player across the arena.
This plugin wraps the engine's warping rather than replacing it. Your existing montages and Motion Warping notifies keep working unchanged; the plugin simply computes a better warp target, so the engine's own skew math never receives one outside the animation's authored intent.
What it fixes
| Situation | Stock Motion Warping | With this plugin |
|---|---|---|
| Target beyond the animation's reach | Stretches without limit | Clamped to an authored band, reported as ClampedTooFar |
| Warp target name typo | Modifier disables itself, plays unwarped, Verbose log only, never re-enables | Blueprint compile error, asset validation error, and a runtime warning |
| Where the character stops | On the target's origin | At a standoff derived from both capsule radii |
| Warp path crosses a wall | Warps through it | Shortened to the blocking hit, reported as ClampedByGeometry |
| Warp target left over from a previous montage | Silently warps to the old target | Warned, and released by three independent nets |
| Turn speed | Spread across the whole warp window | Bounded by Max Turn Seconds |
What's included
| System | Key types | Purpose |
|---|---|---|
| Warping component | UCrimsonMotionWarpingComponent | Resolves and plants warps, owns the target leases and the missing-target warning |
| Profile asset | UCrimsonWarpProfile | The per-attack-family policy a designer authors |
| Ability node | UCrimsonAbilityTask_WarpToTarget, UCrimsonWarpTaskFactory | The single Blueprint node, Crimson Warp To Target |
| Result | FCrimsonWarpResolveResult, ECrimsonWarpOutcome | The full derivation behind a warp, not just its answer |
| Target contract | ICrimsonWarpTargetProvider (CrimsonCommon) | Implement to supply targets without depending on this plugin |
| Blueprint library | UCrimsonMotionWarpingLibrary | Preview a warp without planting anything |
| Validation | Asset validator plus compile-time node checks | Turns Motion Warping's silent failures into errors |
| Diagnostics | Crimson.MotionWarping.Debug, Crimson.MotionWarping.DevTools | In-world range rings and a live PIE inspector |
Plugin dependencies
| Group | Dependency | Needed for |
|---|---|---|
| Crimson plugins | CrimsonCommon | Logging macros, and ICrimsonWarpTargetProvider |
| Engine modules | MotionWarping | UMotionWarpingComponent, UMotionWarpingUtilities |
| Engine modules | GameplayAbilities | UAbilityTask, FGameplayAbilityTargetData |
| Engine modules | GameplayTasks | UGameplayTask, the ability task's base |
| Engine modules | GameplayTags | The profile's target purpose tag |
| Engine modules | DeveloperSettings | Project settings |
| Engine modules | NetCore (private) | FVector_NetQuantize100 on the wire |
| Engine modules | Projects (private) | Gameplay tag ini registration |
| Engine modules | DataValidation (editor) | The montage validator |
No dependency on CrimsonCamera
Automatic targeting runs entirely through
ICrimsonWarpTargetProvider, which lives in CrimsonCommon. Lock-on implements it; so can your own AI targeting component. This plugin includes nothing from CrimsonCamera.Where to go next
Which path do I choose?
Setting this up for the first time: Quick Start.
Already running and tuning how it feels: How-To: Tune Reach and Standoff and How-To: Control Turn Speed.
One attack needs different numbers: How-To: Override Values Per Attack.
Something is not warping and you want to know why: How-To: Diagnose a Warp.
You want the model rather than the recipe: Concept: How Reach Is Derived.
Already running and tuning how it feels: How-To: Tune Reach and Standoff and How-To: Control Turn Speed.
One attack needs different numbers: How-To: Override Values Per Attack.
Something is not warping and you want to know why: How-To: Diagnose a Warp.
You want the model rather than the recipe: Concept: How Reach Is Derived.