Open alhgo opened 3 years ago
Cuestiones que he visto:
En el escenario, al añadir un Composite Collider, se crea un Rigid Body 2D. Para evitar que el escenario se venga abajo, mejor indicarle que es un Body Type Static
Para evitar que el sprite se gire en Z, mejor restringir sus movimientos en el RigidBody
He creado dos variables, una que determina el impulso hacia arriba y otra su impulso lateral que a su vez depende del movimiento del joystick. Más adelante habrá que ver cómo se comporta
Para aplicar una fuerza al sprite, he tenido que indicar en el segundo parámetro del método AddForce que es de tipo Impulse ("ForceMode2D.Impulse")
Para detectar la colisión con el suelo, he usado una función de OnCollisionEnter2D, y para lo contrario un "OnCollisionExit2D"
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;
}
}
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)
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