- Home /
A FLAWLESS way to check if character is grounded?
It's my first time working with 3D in unity... Basically what I would usually do in unity 2D to check if the player is grounded or not is to simply add 2 raycasts downwards, one on each side of the player sprite, and || them... However I am now trying to make a 3D android game where checking if the character is grounded ACCURATELY AND FLAWLESSLY is crucial. Problem is, 1) if I add like 2000 raycasts the phone will probably melt before the first frame gets rendered. Every other way I found on the Internet has its own flaws, such as: 2) the OnCollisionEnter/Exit, since it will report that the character is grounded if he hits a wall in mid-air. 3) the simple single raycast down will report that he is not grounded if he is on a ledge or on a hole smaller than his own radius 4) rigidbody.velocity.y, might sometimes report that he is grounded if he is in mid-air, and adding a delay to check if he is falling back down or not in the next frame is not ideal.
I and no, tagging every piece of terrain for OnCollisionEnter is not an option, I need the player to be able to jump on anything, even walls (as long as he is on TOP of them, not hugging them while freefalling...) I am also using a rigidbody with a capsule collider, as using a CharacterController is not an option. Plus, these things are just awful.
I tried this (C# Master Race):
public float checkCapsuleDistance = 0.1f;
public float checkCapsuleRadius = 0.5f; //Same as my player's capsule collider's radius
private Rigidbody body;
private Collider capsuleCollider;
void Start()
{
body = GetComponent<Rigidbody>();
capsuleCollider = GetComponent<Collider>();
}
bool getGrounded()
{
return Physics.CheckCapsule(capsuleCollider.bounds.center, new Vector3(capsuleCollider.bounds.center.x, capsuleCollider.bounds.min.y - checkCapsuleDistance, capsuleCollider.bounds.center.z), checkCapsuleRadius);
}
problem now being that it always reports that the player is grounded... And I have no idea how to fix it. Ideally I would want the code above to behave properly, or if there's an even better alternative I might use that too...
Answer by The-Evster · Jul 31, 2016 at 02:34 PM
if you add a character controller component to the player you can use characterController.isGrounded to check if the play is currently standing on a Collider
Your answer