Menu
CoddyTech

Skakanie

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

Skok to prędkość pionowa ustawiana jednorazowo, 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 ustalenie prędkości początkowej dla danej wysokości. Grawitacja odbiera prędkość w stałym tempie, więc skok rozpoczęty 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ły reset if (controller.isGrounded) po linii skoku nadpisałby prędkość skoku w jego klatce. Warunek controller.isGrounded przy skoku uniemożliwia skakanie w powietrzu. Zmień jumpHeight lub gravity w Inspectorze, a skok nadal osiągnie dokładnie wysokość jumpHeight, podczas gdy stała prędkość, taka jak verticalSpeed = 8f, osiągnie inną wysokość przy każdej wartości grawitacji.

challenge icon

Wyzwanie

Średni

Dostosuj jeden skrypt skoku zarówno do Kid, jak i do Kangaroo.

  1. W Update() zastąp 9f przez Mathf.Sqrt(jumpHeight * -2f * gravity), czyli prędkość początkową, która pozwala wznieść się dokładnie na wysokość jumpHeight.
  2. Dodaj && controller.isGrounded do instrukcji if skoku, aby nie można było skakać w powietrzu.

Naciśnij „Graj” i spację: Kid wzniesie się o 1 jednostkę, a Kangaroo o 4. Następnie naciśnij „Sprawdź”.

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);
    }
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity