Why wont my script work
I trying to make my player jump and my player jump but i dont want it to jump when its mid-air so i changed my script but my player will still jump mid-air plz tell what i did wrong and how i can fix it
public class playerJump : MonoBehaviour { public Rigidbody rb; public bool OnGround;
void Start()
{
rb = GetComponent<Rigidbody>();
OnGround = true;
}
void OnCollision(Collision col)
{
if (col.collider)
{
print("OnGround");
OnGround = true;
}
if (col.collider == false)
{
print("OffGround");
OnGround = false;
}
}
void Update()
{
if(OnGround == true)
{
if (Input.GetButtonDown("Jump"))
{
rb.velocity = new Vector3(0, 5, 0);
}
}
}
}
Answer by Aaranos · Jul 24, 2016 at 10:58 PM
For physics related updates I would recommend FixedUpdate since Update can be unreliable for some calculations.
As for your ground check it looks like you have it setup to assign itself based on a constant collision check. OnCollision will only occur when you are colliding, so if there is nothing to collide with it will not turn itself false.
Something closer to what you are looking for would be: Example is for 2D C#
void GroundCheck()
{
grounded = Physics2D.IsTouchingLayers(groundCheck, isGround);
}
This is called each update to check if the player is touching an object that is on the ground layer. You would have to assign anything you deem ground or that can be walked on to the isGround layer. The groundCheck variable is actually the player's collider by his/her feet that can be used to determine when they hit the ground.
If you want to go for a simpler approach just make sure whatever ground check you use is being called when you hit the ground and when you leave it. For example, OnCollisionEnter and OnCollisionExit.
Also, use Debug.Log() to determine if a function is actually being called, or in this case an if statement.