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.
Wyzwanie
ŚredniSteruj odkrywcą za pomocą jego komponentu CharacterController, aby ściana go zatrzymała.
- W
Update()utwórzVector3 movena podstawieInput.GetAxisRaw("Horizontal")dla osi x iInput.GetAxisRaw("Vertical")dla osi z, a następnie pomnóż przezspeed. - Ustaw
move.y = -fallSpeed;i wywołajcontroller.Move(move * Time.deltaTime);. - Następnie ustaw
rend.material.colornaColor.green, gdycontroller.isGrounded, a w przeciwnym razie naColor.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
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 banku8Sterowanie postacią
CharacterController.MoveGrawitacja ręcznieSkakaniePopychanie obiektówPoruszanie się w kierunku patrzeniaPodsumowanie: podwójny skokPoćwicz samodzielnie: Edytor online Unity