Menu
CoddyTech

Saltar

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 40 de 60.

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 ralentiza después el ascenso, lo detiene en la cima y hace que el controlador vuelva a bajar. Lo que queda por determinar es la velocidad inicial para alcanzar una altura determinada. La gravedad reduce la velocidad a un ritmo constante, así que un salto que empieza con una velocidad v asciende v * v / (2 * g) unidades antes de detenerse. Despejando, la velocidad inicial para alcanzar 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, se obtiene Mathf.Sqrt(2.5f * -2f * -20f), la raíz cuadrada de 100: 10 unidades por segundo. -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 evalúa verticalSpeed < 0f, así que solo finaliza las caídas: un reinicio simple con if (controller.isGrounded) después de la línea del salto sobrescribiría la velocidad del salto en el fotograma en que se produce. 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 alcanzará una altura diferente para cada valor de gravedad.

challenge icon

Desafío

Intermedio

Haz que un mismo script de salto sirva tanto para el Kid como para el Kangaroo.

  1. En Update(), reemplaza 9f por Mathf.Sqrt(jumpHeight * -2f * gravity), la velocidad inicial que hace que el personaje suba exactamente jumpHeight.
  2. Añade && controller.isGrounded al if del salto para que no se pueda saltar en el aire.

Pulsa «Jugar» y la barra espaciadora: el Kid sube 1 unidad y el Kangaroo, 4. Luego, pulsa «Comprobar».

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

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity