Menu
CoddyTech

Trasa

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

W tym rozdziale powstaje platformówka 3D. Biegasz i skaczesz po unoszących się platformach, jedziesz na jednej, która się przesuwa, dotykasz punktów kontrolnych, aby upadek nie odsyłał cię na początek, zbierasz klejnoty zliczane na ekranie, przekraczasz linię mety, aby przejść do następnego poziomu, i próbujesz pobić swój najlepszy czas. Gra składa się z pięciu skryptów, które są w projekcie od samego początku: Player, MovingPlatform, Checkpoint, Gem i FinishLine. Cztery ostatnie są na razie puste, a w każdej lekcji wypełnisz jeden z nich. Gracz używa komponentu CharacterController sterowanego za pomocą akcji Input System, a kamera jest jego obiektem podrzędnym, więc podąża za nim bez użycia skryptu.

CharacterController porusza się na dwa sposoby. Move(motion) przesuwa go o zadaną odległość i niczego nie dodaje, więc grawitacja, skoki i Time.deltaTime należą do zadań skryptu, jak w rozdziale o Character Controller. SimpleMove(speed) przyjmuje prędkość w jednostkach na sekundę, samodzielnie skaluje ją czasem trwania klatki i dodaje grawitację; ignoruje przekazaną wartość y, więc postać poruszana w ten sposób spada z krawędzi, ale nigdy nie może skakać. Ten owczarek w grze pasterskiej oglądanej z góry nie musi skakać, więc SimpleMove i akcja Move stanowią cały jego skrypt:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

Gracz w platformówce musi skakać, więc przechowuje własną prędkość pionową i porusza się za pomocą Move, odczytując akcje Move i Jump zamiast klasy Input. Unity zaleca jedno wywołanie Move lub SimpleMove na klatkę: chodzenie i spadanie odbywają się w tym samym wywołaniu, a isGrounded opisuje wtedy cały ten ruch.

challenge icon

Wyzwanie

Średni

Rozpocznij tworzenie platformówki od gracza. Skrypt Player ma speed (5), jumpHeight (1.5) i gravity (-9.81), controller oraz velocity odpowiadające za spadanie. Znajdź akcje Move i Jump tylko raz, w Start, a w Update:

  • Move porusza graczem z prędkością speed jednostek na sekundę: w prawo i w lewo wzdłuż osi x, do przodu i do tyłu wzdłuż osi z.
  • Grawitacja dodaje gravity * Time.deltaTime do velocity.y w każdej klatce. Gdy kontroler jest na ziemi, a velocity.y jest mniejsze od 0, najpierw ustaw velocity.y na -2, aby gracz pozostał dociśnięty do ziemi.
  • Każde naciśnięcie Jump, gdy gracz jest na ziemi, ustawia velocity.y na Mathf.Sqrt(jumpHeight * -2f * gravity): skok na wysokość jumpHeight jednostek. Przytrzymanie Jump powoduje jeden skok, a skakanie w powietrzu jest niemożliwe.
  • Wywołaj controller.Move tylko raz, przekazując łącznie ruch i velocity, pomnożone przez Time.deltaTime.

Naciśnij Play i przeskocz na pierwsze platformy, a następnie wybierz Check.

Spróbuj swoich sił

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // poruszaj się za pomocą akcji Move, skacz za pomocą akcji Jump, spadaj pod wpływem grawitacji
    }
}
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