- Home /
How to specify a a rigid body colliding with the bottom area of an object
Im trying to detect from where the player is colliding with an object, if its from top or bottom. Im using this:
function OnCollisionEnter ( other : Collision ) {
if ( other.gameObject.CompareTag ( "Floor" ) ) {
//if hit from top
if () {
Debug.Log ("You Hit the floor");
}
//if hit from bottom
if () {
Debug.Log ("You Hit the roof");
}
}
}
But I'm not sure how to detect this, any help would be greatly appreciated!
Answer by aldonaletto · Jul 09, 2012 at 02:20 AM
If the Y axis is your vertical direction (most frequent case), you can check normal.y: positive values mean collision with the bottom side, and negative values mean top collisions:
function OnCollisionEnter ( other : Collision ) { if ( other.gameObject.CompareTag ( "Floor" ) ) { var normal = other.contacts[0].normal; if (normal.y > 0) { //if the bottom side hit something Debug.Log ("You Hit the floor"); } if (normal.y < 0) { //if the top side hit something Debug.Log ("You Hit the roof"); } } }normal.y is numerically equal to the sine of the normal angle relative to the horizontal plane, thus you can refine your code by accepting floor or roof collisions only when the normal.y is higher than the sine of the angle ( < -45 or > 45, for instance, would become normal.y < -0.707 or normal.y > 0.707).
But be aware that OnCollisionEnter is only reported when a rigidbody hits a collider; if your character is a CharacterController, you must use OnControllerColliderHit instead:
function OnControllerColliderHit ( hit : ControllerColliderHit ) { if ( hit.gameObject.CompareTag ( "Floor" ) ) { var normal = hit.normal; if (normal.y > 0) { // if the bottom side hit something Debug.Log ("You Hit the floor"); } if (normal.y < 0) { // if the top side hit something Debug.Log ("You Hit the roof"); } } }NOTE: This event is sent all the time due to the contact of the character with the ground, thus you will get lots of "You hit the floor" messages.
Great thanks aldo that really helped me out wokrs perfeclty!
You just saved my day, I spent the whole day trying everything, from Raycasts to little BoxColliders under the player. I even added an empty object with a script on it that would detect the ground. Nothing, and I mean, NOTHING worked. I saw your post and I was like, no way that works. But it does xD... thank you and here's a picture of me during the afternoon
Answer by thaiscorpion · Jul 09, 2012 at 06:21 AM
I found the solution using the contact.normal vector and checking if I hit from under or above
normal = other.contacts[0].normal;
//if hit floor if ( normal == Vector3 ( 0, 1, 0 ) ) {
Debug.Log ("You Hit the floor");
}
Forget this one aldos is explained much better and has more functionality I wrote this but didnt come up until aproved by moderator :D
Your answer
![](https://koobas.hobune.stream/wayback/20220613073908im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
how to check if one object is colliding with another 1 Answer
Enable objects to enter the trigger 2 Answers
problem with collider 1 Answer
Script to move an objects position and rotation upon collision with player? 1 Answer
Find all objects with the name: "object name" and disable their colliders 1 Answer