Poruszanie się w kierunku patrzenia
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 41 z 56.
Gdy kamera patrzy na gracza pod kątem, strzałki powinny poruszać graczem tak, jak pokazuje ekran: góra oznacza ruch od kamery, a prawo — w prawo względem kamery. Osie świata działają w ten sposób tylko wtedy, gdy kamera patrzy wzdłuż osi +z. Dlatego utwórz ruch na podstawie kierunków samej kamery: cam.forward i cam.right.
Najpierw trzeba je skorygować. Kamera skierowana w dół na gracza ma kierunek forward skierowany w ziemię, więc ustaw jego y na 0, aby zachować tylko składową równoległą do podłoża. Pozostały wektor jest krótszy niż 1 — dla kamery nachylonej w dół o 30 stopni ma długość około 0,87 — więc gracz poruszałby się wolniej. Dlatego go normalizujemy. Ten kontroler porusza się za główną kamerą, która patrzy na róg poziomu:
Transform cam = Camera.main.transform;
Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();
Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize(); // po przekątnej nie szybciej
controller.Move(move * speed * Time.deltaTime);Camera.main to kamera oznaczona tagiem MainCamera. Oba kierunki są odczytywane w każdej klatce, dzięki czemu sterowanie pozostaje właściwe, gdy kamera się obraca. Jednoczesne naciśnięcie góry i prawej dodaje dwa prostopadłe wektory jednostkowe, których łączna długość wynosi około 1,41, więc ruch jest normalizowany, gdy jego długość przekracza 1.
Wyzwanie
ŚredniKamera powoli okrąża gracza (CameraRig.cs, gotowe), więc osie świata wciąż obracają się na ekranie. Spraw, aby strzałki poruszały graczem względem kamery w Mover.cs, gdzie grawitacja jest już zaimplementowana. W Inspectorze ustawiasz speed (4) i cam — Transform kamery.
- Strzałka w górę porusza gracza po podłożu, od kamery, w dół — w jej kierunku, a w prawo i w lewo — odpowiednio w prawo i w lewo względem kamery:
speedjednostek na sekundę w każdym kierunku, także po przekątnej, mimo że kamera patrzy w dół na gracza. - Podczas ruchu gracz obraca się twarzą w kierunku, w którym idzie. Po zatrzymaniu nadal patrzy w tym kierunku.
Naciśnij Graj, poruszaj się, gdy kamera się obraca, a następnie naciśnij Sprawdź.
Spróbuj swoich sił
using UnityEngine;
public class Mover : MonoBehaviour
{
public float speed = 4f;
public float gravity = -15f;
public Transform cam;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
verticalSpeed += gravity * Time.deltaTime;
// Porusza się wzdłuż osi świata: spraw, by poruszał się względem cam i był zwrócony w kierunku ruchu
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 banku8Sterowanie postacią
CharacterController.MoveGrawitacja ręcznieSkakaniePopychanie obiektówPoruszanie się w kierunku patrzeniaPodsumowanie: podwójny skok