Salto
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 40 di 60.
Un salto è una velocità verticale impostata una sola volta, nel momento in cui si preme Spazio; la gravità che lo script aggiunge già rallenta poi la salita, la ferma al culmine e riporta il controller verso il basso. Quello che resta da determinare è la velocità iniziale per raggiungere una data altezza. La gravità riduce la velocità a una velocità costante, quindi un salto che inizia alla velocità v sale di v * v / (2 * g) unità prima di fermarsi. Invertendo la formula, la velocità iniziale per raggiungere un’altezza h è v = √(2 * g * h).
Con gravity memorizzata come numero negativo, -20, e un salto alto 2.5 unità, si ottiene Mathf.Sqrt(2.5f * -2f * -20f), la radice quadrata di 100: 10 unità al secondo. -2f rende positiva la gravità negativa, perché la radice quadrata di un numero negativo è NaN:
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;Il reset verifica verticalSpeed < 0f, quindi termina solo le cadute: un semplice if (controller.isGrounded) dopo la riga del salto sovrascriverebbe la velocità del salto nel fotogramma in cui avviene. Il controllo controller.isGrounded sul salto impedisce di saltare a mezz’aria. Modifica jumpHeight o gravity nell’Inspector e il salto raggiungerà comunque esattamente jumpHeight, mentre una velocità fissa come verticalSpeed = 8f raggiunge un’altezza diversa per ogni valore della gravità.
Sfida
MedioAdatta un unico script per il salto sia al Kid che al Kangaroo.
- In
Update(), sostituisci9fconMathf.Sqrt(jumpHeight * -2f * gravity), la velocità iniziale che fa salire esattamente dijumpHeight. - Aggiungi
&& controller.isGroundedall’ifdel salto, così non si salta a mezz’aria.
Premi «Gioca» e la barra spaziatrice: il Kid sale di 1 unità e il Kangaroo di 4. Poi premi «Verifica».
Provalo tu
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);
}
}
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro2Pulsanti e schermate
Pulsanti e onClickLambdaCollegare nell'InspectorPannelli attivi e disattiviBarre della saluteRiepilogo: negozio degli upgrade5Salvare con PlayerPrefs
Salvare un numeroCaricare con un valore predefinitoPunteggio massimoSalvare le impostazioniRiepilogo: monete in banca8Controller del personaggio
CharacterController.MoveGravità manualeSaltoSpingere gli oggettiMuoviti dove guardiRiepilogo: doppio salto3Il gestore del gioco
Uno script gestisce il giocoIl SingletonStati di giocoSelezionare lo statoRiepilogo: gestore del round6Progetto: Runner infinito
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di inputEsercitati da solo: Playground Unity