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.
Desafío
IntermedioHaz que un mismo script de salto sirva tanto para el Kid como para el Kangaroo.
- En
Update(), reemplaza9fporMathf.Sqrt(jumpHeight * -2f * gravity), la velocidad inicial que hace que el personaje suba exactamentejumpHeight. - Añade
&& controller.isGroundedalifdel 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
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro2Botones 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 sin fin
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entradaPractica por tu cuenta: Playground de Unity