Menu
CoddyTech

Skakanie

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 39 z 56.

Skok to prędkość pionowa ustawiana raz, w chwili naciśnięcia spacji; grawitacja, którą skrypt już dodaje, spowalnia wtedy wznoszenie, zatrzymuje je na szczycie i sprowadza kontroler z powrotem na dół. Pozostaje ustalić prędkość początkową dla danej wysokości. Grawitacja odbiera prędkość w stałym tempie, więc skok rozpoczynający się z prędkością v wznosi się na wysokość v * v / (2 * g) jednostek, zanim się zatrzyma. Po przekształceniu wzoru prędkość początkowa dla wysokości h wynosi v = √(2 * g * h).

Gdy gravity jest przechowywana jako liczba ujemna, -20, a skok ma wysokość 2.5 jednostki, otrzymujemy Mathf.Sqrt(2.5f * -2f * -20f), czyli pierwiastek kwadratowy ze 100: 10 jednostek na sekundę. -2f zmienia ujemną grawitację na dodatnią, ponieważ pierwiastek kwadratowy z liczby ujemnej to NaN:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

Warunek resetowania sprawdza verticalSpeed < 0f, więc kończy tylko spadanie: zwykłe resetowanie przez if (controller.isGrounded) po wierszu skoku nadpisałoby prędkość skoku w tej samej klatce. Warunek controller.isGrounded przy skoku uniemożliwia skakanie w powietrzu. Zmień jumpHeight lub gravity w Inspektorze, a skok nadal osiągnie dokładnie jumpHeight, podczas gdy stała prędkość, taka jak verticalSpeed = 8f, da inną wysokość przy każdej wartości grawitacji.

challenge icon

Wyzwanie

Średni

Dwaj skoczkowie uruchamiają ten sam Jumper.cs: Dzieciak, którego Inspector ustawia gravity na -18, a jumpHeight na 1, oraz Kangur, z gravity równym -8 i jumpHeight równym 4. Spacja ustawia verticalSpeed na 9 — wartość znalezioną metodą prób i błędów: nie pasuje do żadnego skoczka i działa także w powietrzu. Napraw skok:

  • Spacja rozpoczyna skok, który wznosi się dokładnie na wysokość jumpHeight, obliczoną na podstawie własnych wartości jumpHeight i gravity każdego skoczka.
  • Skakać może tylko skoczek stojący na ziemi.

Naciśnij Play i skocz, a następnie Check.

Spróbuj swoich sił

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);
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier