ExampleComponents/PlayerSquish.cs
/// <summary>
/// Swishes the player if the physics pressure exceeds a set amount
/// </summary>
public class PlayerSquish : Component, Component.ICollisionListener
{
[Property] public GameObject Gibs { get; set; }
protected override void OnFixedUpdate()
{
if ( IsProxy )
return;
UpdatePressure();
}
public void Explode()
{
var gibs = Gibs.Clone( WorldPosition );
foreach ( var rb in gibs.GetComponentsInChildren<Rigidbody>() )
{
rb.Velocity = Vector3.Random * 600;
}
GameObject.Destroy();
}
float nominalPressure => 350;
float pressure;
int i = 0;
void ICollisionListener.OnCollisionStart( Collision collision ) { }
void ICollisionListener.OnCollisionUpdate( Collision collision )
{
if ( float.IsNaN( collision.Contact.Impulse ) ) return;
var imp = collision.Contact.Impulse / collision.Self.Body.Mass;
if ( imp < nominalPressure ) return;
//DebugDrawSystem.Current.AddText( collision.Contact.Point + Vector3.Up * i * 16, $"[{imp:n0}] {collision.Other.Collider}" );
//DebugDrawSystem.Current.AddText( collision.Contact.Point, $"{collision.Contact.Impulse}" ).WithTime( 10.0f );
pressure += imp;
i++;
}
void UpdatePressure()
{
i = 0;
//if ( pressure > 100000 )
//DebugDrawSystem.Current.AddText( WorldPosition + Vector3.Up * 80, $"pressure: {pressure}\nvelocity: {Controller.Body.Velocity}" );
if ( pressure > 1000 )
{
Log.Info( $"Explode pressure: {pressure}" );
Explode();
}
pressure -= 1000;
if ( pressure < 0 ) pressure = 0;
}
}