A component attached to an entity with a Rigidbody that listens for collision events and triggers controller haptics based on the change in velocity. It computes velocity delta each fixed update and fires SoftImpact or HardImpact on collision start depending on the delta magnitude.
using Sandbox;
public sealed class HapticController : Component, Component.ICollisionListener
{
[RequireComponent] public Rigidbody Rigidbody { get; set; }
private Vector3 _lastVelocity;
private Vector3 _velocityDelta;
public void OnCollisionStart( Collision other )
{
if ( _velocityDelta.Length < 20f )
Input.TriggerHaptics( HapticEffect.SoftImpact );
else
Input.TriggerHaptics( HapticEffect.HardImpact );
}
public void OnCollisionStop( CollisionStop other )
{
}
public void OnCollisionUpdate( Collision other )
{
}
protected override void OnFixedUpdate()
{
_velocityDelta = Rigidbody.Velocity - _lastVelocity;
_lastVelocity = Rigidbody.Velocity;
}
}