- Home /
 
How do I prevent my character from crouching when jumping?
Hello everyone, I have a question, how can I make my character only crouch when he is on the ground?
I tried a couple of things but they didn't work for me I appreciate if you can help me
This is my code
Game Manager
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour { public GameObject menuPrincipal; public GameObject menuGameOver;
 public float velocidad = 2;
 public GameObject col;
 public GameObject piedra1;
 public GameObject aleteo;
 public GameObject aleteo2;
 public Renderer fondo;
 public bool gameOver = false;
 public bool start = false;
 public List<GameObject> cols;
 public List<GameObject> obstaculos;
 public List<GameObject> FlyingObj;
 // Start is called before the first frame update
 void Start()
 {
     // Crear Mapa
     for (int i = 0; i < 21; i++)
     {
         cols.Add(Instantiate(col, new Vector2(-8 + i, -5), Quaternion.identity));
     }
     // Crear Piedras
     obstaculos.Add(Instantiate(piedra1, new Vector2(-3, -3.1f), Quaternion.identity));
     obstaculos.Add(Instantiate(aleteo, new Vector2(5, -3), Quaternion.identity));
     FlyingObj.Add(Instantiate(aleteo2, new Vector2(14, -1.6f), Quaternion.identity));
 }
 // Update is called once per frame
 void Update()
 {
     if (start == false) 
     {
     if (Input.GetKeyDown(KeyCode.X)) 
         {
             start = true;
         }
     }
     if (start == true && gameOver == true)
     {
         GetComponent<Timer>().enabled = false;
         menuGameOver.SetActive(true);
         if (Input.GetKeyDown(KeyCode.X))
         {
             SceneManager.LoadScene(SceneManager.GetActiveScene().name);
         }
     }
     if (start == true && gameOver == false) 
     {
         menuPrincipal.SetActive(false);
         fondo.material.mainTextureOffset = fondo.material.mainTextureOffset + new Vector2(0.02f, 0) * Time.deltaTime;
         // Mover Mapa
         for (int i = 0; i < cols.Count; i++)
         {
             if (cols[i].transform.position.x <= -10)
             {
                 cols[i].transform.position = new Vector3(10, -5, 0);
             }
             cols[i].transform.position = cols[i].transform.position + new Vector3(-1, 0, 0) * Time.deltaTime * velocidad;
         }
         // Mover Obstaculos
         for (int i = 0; i < obstaculos.Count; i++)
         {
             if (obstaculos[i].transform.position.x <= -10)
             {
                 float randomObs = Random.Range(11, 18);
                 obstaculos[i].transform.position = new Vector3(randomObs, -3.1f, 0);
             }
             obstaculos[i].transform.position = obstaculos[i].transform.position + new Vector3(-1, 0, 0) * Time.deltaTime * velocidad;
         }
         for (int i = 0; i < FlyingObj.Count; i++)
         {
             if (FlyingObj[i].transform.position.x <= -10)
             {
                 float randomObs = Random.Range(11, 18);
                 FlyingObj[i].transform.position = new Vector3(randomObs, -1.6f, 0);
             }
             FlyingObj[i].transform.position = FlyingObj[i].transform.position + new Vector3(-1, 0, 0) * Time.deltaTime * velocidad;
         }
     }
 }  
 
               }
Player
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Audio;
public class Jugador : MonoBehaviour { public float fuerzaSalto; public GameManager gameManager; public Score ScoreScript; public Timer Timer;
 public Transform groundCheck; // se sabe cuando el jugador estatocando el suelo
 public LayerMask ground;
 public float groundCheckRadius;
 AudioSource jumpsound;
 public AudioSource Death;
 private Rigidbody2D rigidbody2D;
 private Animator animator;
 private bool isGrounded;
 public int playerJumps;
 private int tempPlayerJumps;
 private BoxCollider2D Collider;
 private GameObject[] FlyingObjects;
 void Start()
 {
     animator = GetComponent<Animator>();
     rigidbody2D = GetComponent<Rigidbody2D>();
     jumpsound = GetComponent<AudioSource>();
     Collider = GetComponent<BoxCollider2D>();
 }
 private void FixedUpdate()
 {
     isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, ground);
 }
 void Update()
 {
     FlyingObjects = GameObject.FindGameObjectsWithTag("FlyingObj");
     if (Input.GetKeyDown(KeyCode.DownArrow))
     {
         animator.SetBool("EstaAgachandose", true);
         foreach (GameObject Obj in FlyingObjects)
         {
             Physics2D.IgnoreCollision(Obj.GetComponent<BoxCollider2D>(), Collider, true);
         }
     }
     if (Input.GetKeyUp(KeyCode.DownArrow)) //This is where you call it instead
     {
         animator.SetBool("EstaAgachandose", false);
         foreach (GameObject Obj in FlyingObjects)
         {
             Physics2D.IgnoreCollision(Obj.GetComponent<BoxCollider2D>(), Collider, false);
         }
     }
     if (isGrounded)
     {
         tempPlayerJumps = playerJumps;
     }
     if (Input.GetKeyDown(KeyCode.Space) && tempPlayerJumps > 0)
     {
         rigidbody2D.velocity = Vector2.up * fuerzaSalto;
         tempPlayerJumps--;
     }
     if (Input.GetKeyDown(KeyCode.Space))
     {
         jumpsound.Play();
         animator.SetBool("estaSaltando", true);
         rigidbody2D.AddForce(new Vector2(0, fuerzaSalto));
     }
     if (Input.GetKeyDown(KeyCode.UpArrow) && tempPlayerJumps > 0)
     {
         rigidbody2D.velocity = Vector2.up * fuerzaSalto;
         tempPlayerJumps--;
     }
     if (Input.GetKeyDown(KeyCode.UpArrow))
     {
         jumpsound.Play();
         animator.SetBool("estaSaltando", true);
         rigidbody2D.AddForce(new Vector2(0, fuerzaSalto));
     }
 }
 private void OnCollisionEnter2D(Collision2D collision)
 {
     if (collision.gameObject.tag == "Suelo")
     {
         animator.SetBool("estaSaltando", false);
     }
     if (collision.gameObject.tag == "Obstaculo")
     {
         gameManager.gameOver = true;
         ScoreScript.StopScore();
         Death.Play();
     }
     if (collision.gameObject.tag == "Obstaculo")
     {
         gameManager.gameOver = true;
         Debug.Log("gameOver");
         Timer.enabled = false;
     }
     if (collision.gameObject.tag == "FlyingObj")
     {
         gameManager.gameOver = true;
         Debug.Log("gameOver");
         Timer.enabled = false;
     }
     if (collision.gameObject.tag == "FlyingObj")
     {
         gameManager.gameOver = true;
         ScoreScript.StopScore();
         Death.Play();
     }
     {
         if (collision.gameObject.tag == "Suelo")
         {
             animator.SetBool("estaSaltando", false);
         }
         if (collision.gameObject.tag == "volador")
         {
             gameManager.gameOver = true;
             ScoreScript.StopScore();
             Death.Play();
         }
     } 
 }   
 
               }
Answer by Caeser_21 · Apr 04 at 06:00 PM
Add 2 bools called "IsCrouching" and "IsJumping", then change your script to :
 using System.Collections; 
 using System.Collections.Generic; 
 using UnityEngine; 
 using UnityEngine.Audio;
 
 public class Jugador : MonoBehaviour 
 { 
  public float fuerzaSalto; 
  public GameManager gameManager; 
  public Score ScoreScript; public Timer Timer;
 
  public Transform groundCheck; // se sabe cuando el jugador estatocando el suelo
  public LayerMask ground;
  public float groundCheckRadius;
  AudioSource jumpsound;
  public AudioSource Death;
  private Rigidbody2D rigidbody2D;
  private Animator animator;
  private bool isGrounded;
  public int playerJumps;
  private int tempPlayerJumps;
  private BoxCollider2D Collider;
  private GameObject[] FlyingObjects;
  private bool IsCrouching;
  private bool IsJumping;
 
  void Start()
  {
      IsCrouching = false;
      IsJumping = false;
      animator = GetComponent<Animator>();
      rigidbody2D = GetComponent<Rigidbody2D>();
      jumpsound = GetComponent<AudioSource>();
      Collider = GetComponent<BoxCollider2D>();
  }
  private void FixedUpdate()
  {
      isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, ground);
  }
  void Update()
  {
      FlyingObjects = GameObject.FindGameObjectsWithTag("FlyingObj");
      if (Input.GetKeyDown(KeyCode.DownArrow) && !IsJumping)
      {
          IsCrouching = true;
          animator.SetBool("EstaAgachandose", true);
          foreach (GameObject Obj in FlyingObjects)
          {
              Physics2D.IgnoreCollision(Obj.GetComponent<BoxCollider2D>(), Collider, true);
          }
      }
      if (Input.GetKeyUp(KeyCode.DownArrow))
      {
          IsCrouching = false;
          animator.SetBool("EstaAgachandose", false);
          foreach (GameObject Obj in FlyingObjects)
          {
              Physics2D.IgnoreCollision(Obj.GetComponent<BoxCollider2D>(), Collider, false);
          }
      }
      if (isGrounded)
      {
          tempPlayerJumps = playerJumps;
      }
      if (Input.GetKeyDown(KeyCode.Space) && tempPlayerJumps > 0 && !IsCrouching)
      {
          IsJumping = true;
          rigidbody2D.velocity = Vector2.up * fuerzaSalto;
          tempPlayerJumps--;
      }
      if (Input.GetKeyDown(KeyCode.Space) && !IsCrouching)
      {
          IsJumping = true;
          jumpsound.Play();
          animator.SetBool("estaSaltando", true);
          rigidbody2D.AddForce(new Vector2(0, fuerzaSalto));
      }
      if (Input.GetKeyUp(KeyCode.Space))
      {
          IsJumping = false;
      }
      if (Input.GetKeyDown(KeyCode.UpArrow) && tempPlayerJumps > 0)
      {
          rigidbody2D.velocity = Vector2.up * fuerzaSalto;
          tempPlayerJumps--;
      }
      if (Input.GetKeyDown(KeyCode.UpArrow))
      {
          jumpsound.Play();
          animator.SetBool("estaSaltando", true);
          rigidbody2D.AddForce(new Vector2(0, fuerzaSalto));
      }
  }
  private void OnCollisionEnter2D(Collision2D collision)
  {
      if (collision.gameObject.tag == "Suelo")
      {
          animator.SetBool("estaSaltando", false);
      }
      if (collision.gameObject.tag == "Obstaculo")
      {
          gameManager.gameOver = true;
          ScoreScript.StopScore();
          Death.Play();
      }
      if (collision.gameObject.tag == "Obstaculo")
      {
          gameManager.gameOver = true;
          Debug.Log("gameOver");
          Timer.enabled = false;
      }
      if (collision.gameObject.tag == "FlyingObj")
      {
          gameManager.gameOver = true;
          Debug.Log("gameOver");
          Timer.enabled = false;
      }
      if (collision.gameObject.tag == "FlyingObj")
      {
          gameManager.gameOver = true;
          ScoreScript.StopScore();
          Death.Play();
      }
      {
          if (collision.gameObject.tag == "Suelo")
          {
              animator.SetBool("estaSaltando", false);
          }
          if (collision.gameObject.tag == "volador")
          {
              gameManager.gameOver = true;
              ScoreScript.StopScore();
              Death.Play();
          }
      } 
  }   
 }
 
               I'm Pretty sure this should work :)
Answer by Darckret · Apr 05 at 12:56 PM
Thanks friend, it worked :D, I thought it would solve an error that I have if the character did not crouch in the air, that when I press the key to crouch the character does not collide with an obstacle, it also worked, he no longer crouches in the air, thanks ; D
Your answer
 
             Follow this Question
Related Questions
Graceful 2D collision enabling/disabling for topdown jumping 1 Answer
Player wont jump (visual script),2d player does not jump (visual script) 1 Answer
Character jumping at random heights. What in my code is causing this? 1 Answer
2D platformer jumping that feels good 1 Answer
cant jump in 2d? 4 Answers