Menu
CoddyTech

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à.

challenge icon

Sfida

Medio

Adatta un unico script per il salto sia al Kid che al Kangaroo.

  1. In Update(), sostituisci 9f con Mathf.Sqrt(jumpHeight * -2f * gravity), la velocità iniziale che fa salire esattamente di jumpHeight.
  2. Aggiungi && controller.isGrounded all’if del 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

Esercitati da solo: Playground Unity