- 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
![](https://koobas.hobune.stream/wayback/20220613055016im_/https://answers.unity.com/themes/thub/images/avi.jpg)
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