Stack Overflow en español Asked by Juanchi Benitez on October 10, 2020
mi problema es este, en este juego, cuando salto, programe que el personaje no se pudiera mover en el aire, cual es el problema? que, ademas del piso, existe otro collider, la caja, y al rozar la caja con el pie en medio del aire, ya te podes mover mientras estas flotando, lo logico seria hacer un "OnCollisionExit2D" Pero al hacer eso, ya no puedo empujar la caja, porque claro, al dejar de tocar la caja ya no me puedo mover y se me queda el personaje estatico, por lo que si moves la caja, no te podes despegar, mi idea seria crear un temporizador, por asi decirlo "Si no esta 1 segundo tocando la caja,
air = true" (Air es la variable que cree para que el personaje no se mueva en el aire) A continuacion les dejo el codigo (Solido representa la caja y Piso la plataforma)
bool canJump = true;
bool DontMove = true;
public bool air;
if (air == true)
{
gameObject.GetComponent<Animator>().SetBool("Moverse", false);
gameObject.GetComponent<Rigidbody2D>().drag = 0;
DontMove = false;
canJump = false;
if (canJump == false)
{
gameObject.GetComponent<Animator>().SetBool("Saltar", true);
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.transform.tag == "Piso")
{
gameObject.GetComponent<Rigidbody2D>().drag = 1;
DontMove = true;
canJump = true;
gameObject.GetComponent<Animator>().SetBool("Saltar", false);
air = false;
}
if (collision.transform.tag == "Solido")
{
gameObject.GetComponent<Rigidbody2D>().drag = 1;
DontMove = true;
canJump = true;
gameObject.GetComponent<Animator>().SetBool("Saltar", false);
air = false;
}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.transform.tag == "Piso")
{
air = true;
}
if (collision.transform.tag == "Solido")
{
air = true;
}
}
if (Input.GetKey("a") && DontMove && Stop == false)
{
if (canJump == true)
{
gameObject.GetComponent<Animator>().SetBool("Moverse", true);
}
gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(-1200f * Time.deltaTime, 0));
gameObject.GetComponent<SpriteRenderer>().flipX = true;
}
if (Input.GetKey("d") && DontMove && Stop == false)
{
if (canJump == true)
{
gameObject.GetComponent<Animator>().SetBool("Moverse", true);
}
gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(1200f * Time.deltaTime, 0));
gameObject.GetComponent<SpriteRenderer>().flipX = false;
}
if (!Input.GetKey("d") && !Input.GetKey("a"))
{
gameObject.GetComponent<Animator>().SetBool("Moverse", false);
}
if (Input.GetKeyDown("w") && canJump && Stop == false)
{
air = true;
gameObject.GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 1000f));
}
Al final hice esto:
// Funcion del booleano "air" al ser verdadero
if (air == true)
{
Pasos.enabled = false;
gameObject.GetComponent<Animator>().SetBool("Moverse", false);
gameObject.GetComponent<Rigidbody2D>().drag = 0;
DontMove = false;
canJump = false;
if (canJump == false)
{
gameObject.GetComponent<Animator>().SetBool("Saltar", true);
}
Player.transform.parent = null;
}
// Al momento de colisionar, se activa lo siguiente
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.transform.tag == "Piso")
{
gameObject.GetComponent<Rigidbody2D>().drag = 1;
DontMove = true;
canJump = true;
gameObject.GetComponent<Animator>().SetBool("Saltar", false);
air = false;
Box = false;
}
if (collision.transform.tag == "Solido")
{
gameObject.GetComponent<Rigidbody2D>().drag = 1;
DontMove = true;
canJump = true;
gameObject.GetComponent<Animator>().SetBool("Saltar", false);
air = false;
}
}
// Al momento de dejar de colisionar, se activa lo siguiente
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.transform.tag == "Piso")
{
air = true;
Box = true;
}
if (collision.transform.tag == "Solido" && Box == true)
{
air = true;
Box = false;
}
}
// El Booleano "Box" No tiene ninguna funcion aparte, pero si Box no es verdadera, el "air" de la caja tampoco es verdadero, el tag "Solido" representa a la caja, y Box, como bien dice ahi, solo se activa cuando NO esta tocando el suelo, por lo que el bug se soluciona
Correct answer by Juanchi Benitez on October 10, 2020
Creo que puede ser más efectivo si utilizas un raycast2d para detectar el piso. Yo no recomendaría usar un rigidbody, debido a que, como es física propia controlada por Unity, no me da seguirdad. Podrías hacer un pequeño sistema de gravedad para el salto, siento yo que es más efectivo, pero son preferencias. En cuanto a las dependencias es mejor crear una dependencia para Animator, debido a que ocupa menos memoria. Desconozco cuál es la forma del salto que quieras hacer, pero te dejo un video que ayuda mucho de saltos para personajes en 2D y quizás y es lo que estás buscando: https://www.youtube.com/watch?v=QGDeafTx5ug&t=513s
Answered by DannyGovantes on October 10, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP