Poruszanie się w kierunku patrzenia
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 42 z 60.
Gdy kamera patrzy na gracza pod kątem, strzałki powinny poruszać graczem tak, jak pokazuje ekran: w górę oznacza ruch od kamery, a w 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 kierunek ruchu na podstawie kierunków samej kamery: cam.forward i cam.right.
Najpierw trzeba je skorygować. Kamera patrząca z góry na gracza ma kierunek forward skierowany w ziemię, więc ustaw y na 0, aby zachować tylko jego składową równoległą do podłoża. Pozostały wektor jest krótszy niż 1 — ma długość około 0.87 dla kamery nachylonej w dół o 30 stopni — więc gracz poruszałby się wolniej. Dlatego go znormalizuj. Ten skrypt porusza postacią zgodnie z kierunkiem głównej kamery, która patrzy w dół 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(); // ruch po przekątnej nie jest szybszy
controller.Move(move * speed * Time.deltaTime);Camera.main to kamera oznaczona tagiem MainCamera. Oba kierunki są odczytywane w każdej klatce, więc sterowanie pozostaje zgodne z kierunkiem kamery, gdy ta się obraca. Jednoczesne naciśnięcie strzałek w górę i w prawo dodaje dwa wektory jednostkowe ustawione pod kątem prostym, co daje wektor o długości około 1.41. Dlatego ruch jest normalizowany, gdy jego długość przekracza 1.
Wyzwanie
ŚredniSpraw, by strzałki poruszały graczem względem obracającej się kamery.
- W
Update()skopiujcam.forwardicam.right, ustawiającyna 0, a następnie znormalizuj. dirtoforwardpomnożone przez surową wartość osi"Vertical"plusrightpomnożone przez"Horizontal"; znormalizuj, gdy długość przekracza 1.- Gdy
dir != Vector3.zero, ustawtransform.rotation = Quaternion.LookRotation(dir);. Zbudujmovena podstawiedir * speed.
Naciśnij „Graj”: ruch w górę sprawia, że postać oddala się od kamery, niezależnie od tego, w którą stronę jest skierowana. 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);
}
}
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