CIFP-Jose-luis-Garci / Prometheia

Desarrollo de Entornos Interactivos Multidispositivo. CIFP José Luis Garci 2020-21. GR3
GNU General Public License v3.0
0 stars 5 forks source link

Colisionadores 2D #35

Open alhgo opened 3 years ago

alhgo commented 3 years ago

Ya que vamos a trabajar con físicas 2D, debemos añadir colisionadores tanto a los personajes como al escenario, para que la gravedad haga su trabajo. Cuestiones:

He creado una escena de prueba donde crearé los scripts que nos den el dato de si está tocando suelo (y de paso probar a dar saltos aplicando fuerzas, a ver qué tal). Lo subiré en breve al repositorio

alhgo commented 3 years ago

Cuestiones que he visto:

Pongo aquí el código y lo subo al repositorio:


//Variable de Rigid Body para poder aplicar fuerzas
    private Rigidbody2D rb2D;
    [SerializeField] float impulsoV = 4f;
    [SerializeField] float impulsoH = 4f;
    [SerializeField] bool isGrounded;

    // Start is called before the first frame update
    void Start()
    {
        rb2D = GetComponent<Rigidbody2D>();
        //Empezzamos en el aire
        isGrounded = false;
    }

    // Update is called once per frame
    void Update()
    {
        MoverSprite();

    }

    void MoverSprite()
    {
        //Obtenemos el movimiento en horizontal, que determinará la dirección del salto
        float desplX = Input.GetAxis("Horizontal");
        //Creamos un Vector que indica hacia donde se salta, con la fuerza de la variable impulso
        Vector2 direction = new Vector2(desplX * impulsoH, impulsoV);
        //Saltamos solo si el sprite está tocando el suelo
        if (Input.GetButtonDown("Fire1") && isGrounded == true)
        {
            print("saltando" + desplX);
            //Aplicamos la fuerza según el Vector2 creado
            //Le tenemos que indicar que es un tipo de fuerza de impulso en el 2º parámetro
            rb2D.AddForce(direction, ForceMode2D.Impulse);
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
       if(collision.gameObject.name == "Suelo")
        {
            print("Colisionando");
            isGrounded = true;
        }

    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.name == "Suelo")
        {
            print("NO Colisionando");
            isGrounded = false;
        }
    }
alhgo commented 3 years ago

Por cierto, cuando lo probéis, veréis que el personaje "resbala" por la superficie debido a la inercia. Eso podemos corregirlo jugando con su masa y la fuerza del impulso, o creando un "physic material" que asignaremos al colisionador del escenario. Eso nos permite jugar con su parámetro de "Dynamic Friction" (página 7 de los apuntes de materiales)