Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Spraw, by strzałki poruszały graczem względem obracającej się kamery.

  1. W Update() skopiuj cam.forward i cam.right, ustawiając y na 0, a następnie znormalizuj.
  2. dir to forward pomnożone przez surową wartość osi "Vertical" plus right pomnożone przez "Horizontal"; znormalizuj, gdy długość przekracza 1.
  3. Gdy dir != Vector3.zero, ustaw transform.rotation = Quaternion.LookRotation(dir);. Zbuduj move na podstawie dir * 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

Poćwicz samodzielnie: Edytor online Unity