Skip to main content
A Warp Provider is a component that knows about a specific interaction in your game — where the target points are, which Motion Warping Asset to use, and whether the interaction is currently valid. When your controller calls _warpingComponent.Interact(provider), the provider runs its detection logic and returns all the data the system needs to begin warping.

The IWarpPointProvider Interface

All Warp Providers implement the IWarpPointProvider interface, which declares a single method — Interact. You can implement this interface on any MonoBehaviour to create a fully custom provider. The system also uses a WarpInteractionResult struct to package the provider’s output:
The IsValid() helper checks all three conditions: the interaction was found, at least one target point exists, and a warping asset is assigned. The MotionWarping component calls IsValid() on the result before starting any warping — if it returns false, the interaction is silently skipped.

Supplying Target Points

The way you populate result.points depends on whether the obstacle is moving or static.

Static obstacles

For obstacles that do not move (walls, fixed ledges, parked vehicles), pass world-space coordinates directly:

Moving obstacles

For obstacles that move at runtime (moving platforms, vehicles in transit, enemies), you must attach the warp point to the obstacle’s transform. Convert the world-space target position into the obstacle’s local space using InverseTransformPoint, and convert the rotation into the obstacle’s local space using Quaternion.Inverse:
The Motion Warping system will then track the obstacle’s transform at runtime and keep the target point correctly positioned as the obstacle moves.
Always use the local-space conversion when the obstacle can move between the time the interaction starts and the time it ends. Using raw world coordinates on a moving obstacle causes the character to drift away from the target mid-warp.

Using a Warp Provider in Code

The example below shows how to trigger a vault interaction using the built-in VaultComponent as the provider. Call _warpingComponent.Interact(provider) in response to player input:

Passing a GameObject instead of a component reference

If you do not have a direct reference to the provider component, you can pass the obstacle’s GameObject to Interact. The system will search for the first component on that object implementing IWarpPointProvider and call it automatically:
This is useful for interaction systems that work with generic GameObject references (for example, from raycasts or trigger zones) without needing to know the specific provider type.

Implementing a Custom Warp Provider

To create your own provider, implement IWarpPointProvider on a MonoBehaviour attached to the obstacle or the character:
Keep detection logic inside the provider component rather than in the controller. This makes each interaction self-contained and easy to test independently.