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.
Wyzwanie
ŚredniDostosuj jeden skrypt skoku zarówno do Kid, jak i do Kangaroo.
- W
Update()zastąp9fprzezMathf.Sqrt(jumpHeight * -2f * gravity), czyli prędkość początkową, która pozwala wznieść się dokładnie na wysokośćjumpHeight. - Dodaj
&& controller.isGroundeddo instrukcjiifskoku, 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
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz2Przyciski 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 bankuPoćwicz samodzielnie: Edytor online Unity