TransWikia.com

C# Ayuda, tengo un bug en un juego y no se solucionarlo Unity

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)

introducir la descripción de la imagen aquíintroducir la descripción de la imagen aquíintroducir la descripción de la imagen aquí

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));
    }

2 Answers

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP