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.
Desafío
IntermedioDos 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 parajumpHeightygravity. - 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);
}
}
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
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco8Controlador de personaje
CharacterController.MoveGravedad manualSaltarEmpujar objetosMuévete hacia donde mirasRepaso: doble salto3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: corredor infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada