AnswerBun.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!

Related Questions

Mapeo con robot Pepper

0  Asked on August 26, 2021 by vic897

   

Como almacenar en un array lo que se escoge de varios select

0  Asked on March 15, 2021 by victor-godoy

 

Jest no esta tomando la url

0  Asked on March 11, 2021

         

Crear fichero con fecha y hora específica con “touch”

1  Asked on March 5, 2021 by ivan-caballero-cano

   

Separar una cadena json, guardando en variables con su respectivo valor

3  Asked on March 4, 2021 by francisco-guillermo-herrera-ga

     

¿Como ejecuto un comando de curl usando ajax?

1  Asked on March 3, 2021 by yeikerdev

       

ejecutar archivo python desde aplicación php

1  Asked on March 2, 2021 by infiniteroads

   

Poner en producción un sitio con arquitectura MVC

1  Asked on March 2, 2021 by daniel-sandoval

     

Seleccionar item automáticamente en ListView

1  Asked on March 1, 2021 by richard-mancilla

     

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP, SolveDir