- Home /
Problem with GetButtonDown
I have an issue with Input.GetButtonDown. I used it to detect if player press jump button. The is stored in a property and is given to a move function.
Here's the code relative to movement in the mother class:
protected float xInput = 0f;
protected bool jump = false;
protected int jumpButId = 0;
protected int funcJumpId = 0;
protected int funcId = 0;
// Start is called before the first frame update
protected void Awake()
{
rd = GetComponent<Rigidbody2D>();
groundMask = LayerMask.GetMask("Ground");
}
protected void Move(float x, bool jump)
{
//print($"Func jump call nb {funcJumpId}. Jump state in func: {jump}. Jump state in obj: {this.jump}");
funcJumpId++;
Vector3 targetVelocity = new Vector3(x, rd.velocity.y);
rd.velocity = Vector3.SmoothDamp(rd.velocity, targetVelocity, ref curVelocity, movementSmoothing);
if (jump)
{
print($"Func jump call nb {funcJumpId}");
funcJumpId++;
if (onGround)
{
rd.AddForce(new Vector2(0, jumpForce));
onGround = false;
}
else if (airJump)
rd.AddForce(new Vector2(0, jumpForce));
}
}
Here's the code of the child class (attached to player):
// Update is called once per frame
private void Update()
{
xInput = Input.GetAxisRaw("Horizontal") * moveSpeed;
jump = Input.GetButtonDown("Jump");
if (Input.GetButtonDown("Jump"))
{
//print($"Jump nb {jumpButId}");
jumpButId++;
}
}
void FixedUpdate()
{
if (!onGround)
CheckGround();
if (xInput != 0)
{
xInput *= Time.fixedDeltaTime;
Move(Mathf.Abs(xInput) / xInput, jump);
}
else
Move(0, jump);
}
The problem is that sometimes the condition in Move() is not executed even if I pressed the jump button. So jump = false even if it should not. I don't find why it does that and how I can solve the problem.
Edit for those who have a similar problem: it seems that I had 2 Update call between 2 FixedUpdate call so the jump bool was reset to false before the call of the Move function. So the fix was to only update jump value to true if it's value was false, and then reset it to false later in the Move func.