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.
Wyzwanie
ŚredniDwaj 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ścijumpHeightigravitykaż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);
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz4Sceny i poziomy
Wczytaj scenęUruchom poziom ponownieNastępny poziomZachowaj między scenamiPodsumowanie: wybór poziomu10Projekt: platformówka 3D
TrasaRuchome platformy2Przyciski i ekrany
Przyciski i onClickLambdyPodłączanie w InspectorzeWłączanie i wyłączanie paneliPaski zdrowiaPodsumowanie: sklep z ulepszeniami5Zapisywanie za pomocą PlayerPrefs
Zapisz liczbęWczytywanie z wartością domyślnąNajlepszy wynikZapisz ustawieniaPodsumowanie: monety w banku