Menu
CoddyTech

Dorthin bewegen, wohin du schaust

Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 42 von 60.

Wenn die Kamera den Spieler aus einem Winkel betrachtet, sollten die Pfeiltasten den Spieler so bewegen, wie es auf dem Bildschirm aussieht: Nach oben geht er von der Kamera weg, nach rechts geht er nach rechts aus Sicht der Kamera. Die Achsen der Welt bewirken das nur, wenn die Kamera entlang +z blickt. Baue die Bewegung also aus den eigenen Richtungen der Kamera auf: cam.forward und cam.right.

Zuerst müssen sie bereinigt werden. Eine Kamera, die nach unten auf den Spieler blickt, hat ein forward, das in den Boden zeigt. Setze daher y auf 0, damit nur der Anteil entlang des Bodens übrig bleibt. Dieser ist kürzer als 1, bei einer um 30 Grad nach unten geneigten Kamera etwa 0,87. Der Spieler würde also langsamer gehen; normalisiere den Vektor daher. Dieser Walker folgt der Hauptkamera, die auf eine Ecke des Levels blickt:

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();   // diagonale Bewegungen sind nicht schneller
controller.Move(move * speed * Time.deltaTime);

Camera.main ist die Kamera mit dem Tag MainCamera. Die beiden Richtungen werden in jedem Frame ausgelesen, damit die Steuerung auch dann stimmt, wenn sich die Kamera dreht. Nach oben und nach rechts zusammen ergeben zwei Einheitsvektoren im rechten Winkel, deren Länge etwa 1,41 beträgt. Daher wird die Bewegung normalisiert, wenn ihre Länge größer als 1 ist.

challenge icon

Aufgabe

Mittel

Lass den Spieler relativ zur sich drehenden Kamera mit den Pfeiltasten laufen.

  1. Kopiere in Update() cam.forward und cam.right mit y auf 0 und normalisiere sie.
  2. dir ist forward multipliziert mit der rohen "Vertical"-Achse plus right multipliziert mit "Horizontal"; normalisiere dir, wenn der Betrag größer als 1 ist.
  3. Wenn dir != Vector3.zero gilt, setze transform.rotation = Quaternion.LookRotation(dir);. Erstelle move aus dir * speed.

Drücke auf „Spielen“: Mit oben läuft die Spielfigur von der Kamera weg, ganz gleich, wohin sie blickt. Drücke anschließend auf „Prüfen“.

Probier es selbst

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;

        // Bewegt sich entlang der Weltachsen: Sorge dafür, dass sich die Figur relativ zu cam bewegt und in ihre Bewegungsrichtung blickt
        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}

Alle Lektionen in Echte Spiele entwickeln

Übe selbstständig: Unity-Playground