# How would I get collision at different speeds?

Hello all, I have been working on a huge commercial project and have come to a stop where I am not too familiarized in the mathematical side and conditional statements part of programming in C#.

What do I want?

1. My helicopter can travel at speeds and with this speeds I would like a different affect on collision at each speed.

2. My helicopter has been built using Rigidbody, mainly AddForce and AddTorque. I wouldn’t even know how to get the speed value of the Rigidbody.

3. I would like the helicopter to be able to collide with the terrain at different speeds.

I have gone ahead and made some pseudocode to display to show you all what I am trying to achieve. I imagine I have been stuck for over 7 hours now and I guess all the research I have been doing has not lead me to the correct solution.

``````using UnityEngine;
using System.Collections;

public class CollisionTerrain : MonoBehaviour {

public GameObject terrain;
public ParticleSystem PlayP1;
public ParticleSystem PlayP2;
public ParticleSystem PlayP3;
public GameObject WH;

void OnCollisionEnter(Collision collision) {

if(helicopter.velocity.magnitude > 10);  //If Helicopter is faster than a velocity of 10

PlayP1.particleSystem.enableEmission = true;	 //Helicopter will emit a black smoke and make a damage sound
PlayP1.AudioSource.Play(); // Ignore if wrong

if(helicopter.velocity.magnitude > 25); //If Helicopter is faster than a velocity of 25

PlayP2.particleSystem.enableEmission = true;	{ Helicopter will emit a deeper black smoke and make a more intense damage sound}
PlayP2.AudioSource.Play(); // Ignore if wrong

if(helicopter.velocity.magnitude > 50); //If Helicopter is faster than a velocity of 25

PlayP3.particleSystem.enableEmission = true;	{ Helicopter will emit a deeper black smoke and make a more intense damage sound}
PlayP3.AudioSource.Play(); // Ignore if wrong
WH.Instantiate.WreckageObject. //Blown up Helicopter

}
}
``````

First, lets get the speed of your object. Put this at the top of your script:

``````public float velocity; //The velocity of our object.
Vector3 previous; //The previous position of our object.
``````

now, lets use the Update function to get the speed of our object. Like so:

``````	void Update () {
velocity = ((transform.position - previous).magnitude) / Time.deltaTime;
previous = transform.position;
}
``````

next, lets check that velocity if we hit something.

``````	void OnTriggerEnter(Collider col){
if (col.tag == "Terrain") {
if(velocity > 0 && velocity < 10){
//SlowCrash();
}
else{
if(velocity >= 10 && velocity <= 50){
//MediumCrash():
}
else{
if(velocity > 50){
//FastCrash();
}
}
}
}
}
``````

your code is really not that far off. you can call rigidbody.velocity to get a rigidbody’s velocity (as a vector3) and you can get the magnitude for a scalar value.

the problem in your code snip is mostly that if your speed is > 50, all lines will be called (if something is larger than 50, it is also larger than 10, 25, and 30).

a simple way of solving this would be something like

``````void OnCollisionEnter(Collision c){
float speed = helicopter.rigidboy.velocity.magnitude;

if(speed > 50) DoHighestEffect();
else if (speed > 25) DoMediumEffect();
else if (speed > 10) DoLowEffect();
else DoMinimumEffect();

}
``````

You may want to have a single CollisionEffect(float speed) method instead that takes the speed as a parameter, depending on how you implement having different effects.