Salto
Fa parte della sezione Creare veri giochi del percorso Unity di Coddy. Lezione 39 di 56.
Un salto è una velocità verticale impostata una sola volta, nel momento in cui viene premuto Spazio; la gravità che lo script aggiunge già rallenta poi la salita, la ferma al culmine e riporta il controller a terra. Ciò che resta da determinare è la velocità iniziale per raggiungere una determinata altezza. La gravità riduce la velocità a un ritmo costante, quindi un salto che inizia alla velocità v raggiunge 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 controllo di reimpostazione verifica verticalSpeed < 0f, quindi termina solo le cadute: una semplice reimpostazione 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 i salti 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 di gravità.
Sfida
MedioDue saltatori eseguono lo stesso Jumper.cs: il Bambino, il cui Inspector imposta gravity a -18 e jumpHeight a 1, e il Canguro, con gravity -8 e jumpHeight 4. La barra spaziatrice imposta verticalSpeed a 9, un valore trovato per tentativi: non è adatto a nessuno dei due saltatori e funziona anche a mezz'aria. Correggi il salto:
- La barra spaziatrice avvia un salto che raggiunge esattamente
jumpHeight, calcolato in base ajumpHeightegravityspecifici di ciascun saltatore. - Solo un saltatore a terra può saltare.
Premi Play e salta, poi premi Check.
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);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Creare veri giochi
1Testo sullo schermo
Canvas e testoMostra il punteggioFormattare i numeriUn timer per il conto alla rovesciaRiepilogo: tachimetro4Scene e livelli
Caricare una scenaRiavviare il livelloLivello successivoMantenere i dati tra le sceneRiepilogo: selezione del livello10Progetto: Platform 3D
Il percorsoPiattaforme mobili2Pulsanti 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: Corsa infinita
Tre corsieOstacoli in arrivo9Il nuovo sistema di input
Due sistemi di inputTastiera e mousePremuto in questo frameAzioni di inputRiepilogo: cambio di input