- Home /
Question is off-topic or not relevant
Jump freeze when horizontal movement is being held down
Please help I'm making a 2D Platformer Game and following tutorial but when I jump it freezes if I'm still holding down the A or D keys. Any idea how to fix this? I hope you understand my code, it is my first time to post here. Thank you in advanced!
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityStandardAssets.CrossPlatformInput;
public class HeroController : MonoBehaviour {
private Rigidbody2D myBody;
//movement
[SerializeField]
private float movementSpd;
private bool facingRight;
//animation
Animator anim;
//attack
private bool attack;
//jump
public float jumpForce;
[SerializeField]
private Transform[] groundPoints;
[SerializeField]
private float groundRadius;
[SerializeField]
private LayerMask whatIsGround;
public float fallMult = 2.5f;
public bool isGrounded ;
private bool isJump;
[SerializeField]
private bool jumpAttack;
void Start () {
facingRight = true;
myBody = gameObject.GetComponent<Rigidbody2D> ();
anim = gameObject.GetComponent<Animator> ();
}
void Update(){
HandleInput ();
if (myBody.velocity.y < 0) {
myBody.velocity += Vector2.up * Physics2D.gravity.y * (fallMult - 1) * Time.deltaTime;
}
}
void FixedUpdate () {
isGrounded = IsGrounded ();
float horizontal = Input.GetAxis ("Horizontal");
anim.SetFloat ("Speed", Mathf.Abs (horizontal));
HandleMovement (horizontal);
HandleAttacks ();
HandleLayers ();
ResetValues ();
}
private void HandleMovement(float horizontal){
if (isGrounded && isJump) {
isGrounded = false;
myBody.AddForce (Vector2.up * jumpForce);
anim.SetTrigger ("Jump");
//attack = true;
}
if (myBody.velocity.y < 0) {
anim.SetBool ("Land", true);
}
if (!this.anim.GetCurrentAnimatorStateInfo (0).IsTag ("heroAttack") && isGrounded) {
myBody.velocity = new Vector2 (horizontal *movementSpd, myBody.velocity.y);
}
if (horizontal > 0 && !facingRight || horizontal < 0 && facingRight) {
facingRight = !facingRight;
Vector3 playerScale = transform.localScale;
playerScale.x *= -1f;
transform.localScale = playerScale;
}
}
private void HandleInput (){
if (Input.GetKeyDown(KeyCode.Q)) {
attack = true;
jumpAttack = true;
}
if (Input.GetKeyDown (KeyCode.Space) && isGrounded) {
isJump = true;
}
}
private void HandleAttacks(){
if (attack && !this.anim.GetCurrentAnimatorStateInfo (0).IsTag ("heroAttack")) {
anim.SetTrigger ("Attack");
myBody.velocity = Vector2.zero;
}
if (jumpAttack && !isGrounded && !this.anim.GetCurrentAnimatorStateInfo(1).IsTag("JumpAttack")) {
anim.SetTrigger ("Attack");
}
if (!jumpAttack && this.anim.GetCurrentAnimatorStateInfo (1).IsTag ("JumpAttack")) {
anim.ResetTrigger ("Attack");
}
}
private bool IsGrounded(){
if (myBody.velocity.y <= 0) {
foreach (Transform point in groundPoints) {
Collider2D[] colliders = Physics2D.OverlapCircleAll (point.position, groundRadius, whatIsGround);
for (int i = 0; i < colliders.Length; i++) {
if (colliders [i].gameObject != gameObject) {
anim.ResetTrigger ("Jump");
anim.SetBool ("Land", false);
return true;
}
}
}
}
return false;
}
private void HandleLayers(){
if (!isGrounded) {
anim.SetLayerWeight (1, 1);
} else {
anim.SetLayerWeight (1, 0);
}
}
private void ResetValues(){
attack = false;
isJump = false;
jumpAttack = false;
}
}
Answer by Konomira · Jan 04, 2018 at 11:17 AM
In the HandleMovement(float) function you never apply the horizontal velocity to anything except for the animation speed.
Follow this Question
Related Questions
Player getting stuck between grounds 0 Answers
OnCollisonEnter2D. 1 Answer
Death Counter dont work when changing scenes 2 Answers
Transform.position assign attempt not valid, and position is infinity on an object? 1 Answer
How to check if a 2D player collider is touching the ground/platform? 1 Answer