- Home /
How to check if your character is falling 2D - C#
Hello, just come to ask if anyone knows how to check to see if my GameObject (character) is falling?
using UnityEngine;
using System.Collections;
public class Movement : MonoBehaviour {
public float speed = 6.0f;
public float jumpSpeed = 20f;
bool grounded, interact; //bool for checking if player is grounded so they can jump, and bool for interact, so that player can only interact when in range of thing to interact with
public Transform jumpCheck, interactCheck; //transform variable for the end points of the linecasts
RaycastHit2D interacted; //a variable type that stores a collider that was hit during linecast
float jumpTime, jumpDelay = .5f; //jumpTime = 0 by default
bool jumped;
Animator anim;
void Start()
{
anim = GetComponent<Animator> ();
}
void Update()
{
PlayerController ();
RaycastStuff(); //call the function every frame
}
void RaycastStuff()
{
//Just a debug visual representation of the Linecast, can only see this in scene view! Doesn't actually do anything!
Debug.DrawLine(transform.position, jumpCheck.position, Color.magenta);
Debug.DrawLine(transform.position, interactCheck.position, Color.magenta);
//we assign the bool 'ground' with a linecast, that returns true or false when the end of line 'jumpCheck' touches the ground
grounded = Physics2D.Linecast(transform.position, jumpCheck.position, 1 << LayerMask.NameToLayer("background"));
}
void PlayerController()
{
anim.SetFloat("speed", Mathf.Abs(Input.GetAxis ("Horizontal"))); //setting the float parameter called "speed" depending on the input from the horizontal axis
if(Input.GetAxisRaw("Horizontal") > 0) // if d or right key is pressed
{
transform.Translate(Vector3.right * speed * Time.deltaTime); //move right 4 pixels at a fixed framerate
transform.eulerAngles = new Vector2 (0,0);
}
if(Input.GetAxisRaw("Horizontal") < 0) //if a or left key is pressed
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
transform.eulerAngles= new Vector2(0,180); //rotates gameobject by 180 degrees horizontally
}
if (Input.GetKeyDown (KeyCode.W) && grounded == true) // If the jump button is pressed and the player is grounded then the player jumps
{
rigidbody2D.AddForce(Vector2.up * 200f);
jumpTime = jumpDelay;
anim.SetTrigger ("Jump");
jumped = true;
}
jumpTime -= Time.deltaTime; //counts down in seconds
if (jumpTime <= 0 && grounded && jumped)
{
anim.SetTrigger ("Land");
jumped = false;
}
}
}
Thanks in advance
If you mean by checking if the player is on the descent of his jump, you can calculate the y position. This can include all cases where your y might change depending on rising platforms and such. If you know how high your player jumps, you can calculate from that. Otherwise you need to store in a number of different values and do a number of different checks.
Update ()
{
//Store a position from the moment the player jumps.
float jumpStart = transform.position.y;
//If your player has a fixed jump height of 5 units.
float jumpApex = jumpStart + 4.9f;
if (transform.position.y > jumpApex)
{
//Sort of safe to assume the player is falling now.
playerFalling = true;
}
}
I would think this is a fairly simple way to do it.
Answer by Shark-Boy · Jun 16, 2015 at 04:02 PM
You could check the the velocity of your rigidbody2d.
if (rigidbody2D.velocity.y < -0.1)
{
isFalling = true;
}
else
{
isFalling = false;
}
This will cover not only jumping and then falling but falling off of a platform as well. If you just want to check if it is falling after a jump then use this.
if (rigidbody2D.velocity.y < -0.1 && jumped)
{
isFalling = true;
}
else
{
isFalling = false;
}
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
How do make player balloon inflate and float upwards? 1 Answer
Apply gravity to my character through script. 0 Answers
Can someone help me please. error CS1519 1 Answer
Jump and run on a circle (2D) 0 Answers