Menu
CoddyTech

Saltar

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 39 de 56.

Un salto es una velocidad vertical que se establece una sola vez, en el momento en que se pulsa Espacio; la gravedad que el script ya añade después ralentiza el ascenso, lo detiene en la cima y devuelve el controlador al suelo. Lo que queda por determinar es la velocidad inicial para una altura dada. La gravedad reduce la velocidad a un ritmo constante, así que un salto que empieza a velocidad v asciende v * v / (2 * g) unidades antes de detenerse. Despejando, la velocidad inicial para una altura h es v = √(2 * g * h).

Con gravity almacenada como un número negativo, -20, y un salto de 2.5 unidades de altura, eso es Mathf.Sqrt(2.5f * -2f * -20f), la raíz cuadrada de 100: 10 unidades por segundo. El -2f convierte la gravedad negativa en positiva, porque la raíz cuadrada de un número negativo es NaN:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

La comprobación de reinicio prueba verticalSpeed < 0f, así que solo pone fin a las caídas: un reinicio simple if (controller.isGrounded) después de la línea del salto sobrescribiría la velocidad del salto en el fotograma en que ocurre. La comprobación controller.isGrounded del salto impide saltar en el aire. Cambia jumpHeight o gravity en el Inspector y el salto seguirá alcanzando exactamente jumpHeight, mientras que una velocidad fija como verticalSpeed = 8f alcanza una altura distinta para cada valor de gravedad.

challenge icon

Desafío

Intermedio

Dos saltadores ejecutan el mismo Jumper.cs: el niño, cuyo Inspector establece gravity en -18 y jumpHeight en 1, y el canguro, con gravity en -8 y jumpHeight en 4. La barra espaciadora establece verticalSpeed en 9, un número encontrado mediante prueba y error: no se ajusta a ninguno de los dos saltadores y también funciona en el aire. Corrige el salto:

  • La barra espaciadora inicia un salto que asciende exactamente jumpHeight, calculado a partir de los valores propios de cada saltador para jumpHeight y gravity.
  • Solo un saltador que esté en el suelo puede saltar.

Pulsa Play y salta; después, pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Creación de juegos reales