Menu
CoddyTech

CharacterController.Move

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

CharacterController to komponent Unity dla chodzącej postaci: kapsuła, która porusza się tylko wtedy, gdy wywoła ją Twój skrypt za pomocą controller.Move(motion). motion to odległość, o jaką należy przesunąć postać w tej klatce, czyli prędkość pomnożona przez Time.deltaTime. Move przesuwa kapsułę wzdłuż ścian zamiast przez nie, pozwala wchodzić na zbocza o nachyleniu do wartości Slope Limit (45 stopni) i pokonywać krawędzie o wysokości do wartości Step Offset (0.3 jednostki). To nie jest Rigidbody: nie ma sił, grawitacji ani odbijania się i nic go nie popycha. Porusza się dokładnie tam, dokąd kieruje go Move, czego wymagają precyzyjne sterowanie w grach.

Grawitację musisz dodać samodzielnie, podobnie jak wykrywanie podłoża. isGrounded ma wartość true, gdy ostatnie wywołanie Move dotknęło czegoś od spodu, więc ruch bez składowej skierowanej w dół nigdy nie wykryje podłoża. Wywołanie Move na odległość mniejszą niż Min Move Distance kontrolera (0.001) nie robi nic, więc kontroler poruszający się tylko na boki zgłosi, że nie stoi na podłożu, gdy tylko się zatrzyma. Ten kurier porusza się za pomocą strzałek i przy każdym ruchu lekko naciska w dół:

public class Courier : MonoBehaviour
{
    public float speed = 6f;
    CharacterController controller;

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

    void Update()
    {
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = -2f;   // zawsze kieruj w dół, aby wykryć podłoże
        controller.Move(move * Time.deltaTime);
        if (!controller.isGrounded)
        {
            Debug.Log("Off the ground");
        }
    }
}

Kapsuła zachowuje odstęp Skin Width (0.08) od tego, czego dotyka, więc kontroler o wysokości 2 jednostek stojący na podłożu na wysokości y = 0 spoczywa na y = 1.08, a nie na 1. Move zaczyna ruch w miejscu, w którym fizyka ostatnio widziała kontroler, więc ustawienie na nim transform.position może zostać cofnięte przy następnym wywołaniu Move. Aby go teleportować, ustaw controller.enabled = false, przesuń go, a następnie ponownie go włącz.

challenge icon

Wyzwanie

Średni

Steruj odkrywcą za pomocą jego komponentu CharacterController, aby ściana go zatrzymała.

  1. W Update() utwórz Vector3 move na podstawie Input.GetAxisRaw("Horizontal") dla osi x i Input.GetAxisRaw("Vertical") dla osi z, a następnie pomnóż przez speed.
  2. Ustaw move.y = -fallSpeed; i wywołaj controller.Move(move * Time.deltaTime);.
  3. Następnie ustaw rend.material.color na Color.green, gdy controller.isGrounded, a w przeciwnym razie na Color.red.

Naciśnij „Graj”, wejdź w ścianę i zejdź z lewej krawędzi: odkrywca spadnie, świecąc na czerwono, i wyląduje, świecąc na zielono. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using UnityEngine;

public class Explorer : MonoBehaviour
{
    public float speed = 4f;
    public float fallSpeed = 3f;

    CharacterController controller;
    Renderer rend;

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

    void Update()
    {
        // Poruszaj się za pomocą controller.Move, a następnie ustaw kolor odkrywcy na podstawie isGrounded
    }
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity