- Home /
Problem with jump script
I have a ball rolling across the screen and I want it to jump everytime the "Fire1" button is clicked. This only occurs once or twice per number of clicks, where I need it to work everytime.
As far as I can see, there's nothing wrong, but it's late so I might be overlooking something so any help would be appreciated.
Here is my code:
public class platform : MonoBehaviour
{
public Rigidbody target;
public int force = 250;
public float speed = 0.1f;
public int jumpHeight = 6;
public bool isFalling = false;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if(Input.GetKeyDown(KeyCode.R))
{
Application.LoadLevel(0);
}
}
// Update is called once per frame
void FixedUpdate ()
{
ballMovements ();
}
void ballMovements()
{
rigidbody.AddRelativeTorque(Vector3.right * -1 * speed);
if(Input.GetButtonDown("Fire1") && isFalling == false)
{
Debug.Log ("clicked");
Vector3 temp = rigidbody.velocity;
temp.y = jumpHeight;
rigidbody.velocity = temp;
}
isFalling = true;
}
void OnCollisionStay()
{
isFalling = false;
}
}
Answer by kacyesp · Sep 01, 2014 at 11:10 PM
You should not be taking user input during FixedUpdate(). Take inputs in Update().
Input.GetButtonDown() only returns true during the frame the button was pressed, so if FixedUpdate() occurred on any frames other than when the button was pressed, it will be false. Which is why your jump "sometimes" works.
Update() occurs every frame so that's why you should take inputs in Update().
Here's a solid explanation: http://gamedev.stackexchange.com/questions/73713/update-vs-fixedupdate-in-unity
And here's the fixed code:
public class platform : MonoBehaviour
{
public Rigidbody target;
public int force = 250;
public float speed = 0.1f;
public int jumpHeight = 6;
public bool isFalling = false;
private bool isJumping = false;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if(Input.GetKeyDown(KeyCode.R))
{
Application.LoadLevel(0);
}
if(Input.GetButtonDown("Fire1") && isFalling == false)
isJumping = true;
}
// Update is called once per frame
void FixedUpdate ()
{
ballMovements ();
}
void ballMovements()
{
rigidbody.AddRelativeTorque(Vector3.right * -1 * speed);
if( isJumping )
{
isJumping = false;
Debug.Log ("clicked");
Vector3 temp = rigidbody.velocity;
temp.y = jumpHeight;
rigidbody.velocity = temp;
}
isFalling = true;
}
void OnCollisionStay()
{
isFalling = false;
}
}
Thanks for the link, cleared things up for me, the code works great too, thanks for the help
Your answer
Follow this Question
Related Questions
GetButtonDown is unresponsive 0 Answers
Jumping not allways registering fix? 0 Answers
Problem playing animation C# 1 Answer
Input.GetButtonDown inconsistent 1 Answer
Jumping through the roof! 1 Answer