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.
Aufgabe
MittelLass den Spieler relativ zur sich drehenden Kamera mit den Pfeiltasten laufen.
- Kopiere in
Update()cam.forwardundcam.rightmityauf 0 und normalisiere sie. diristforwardmultipliziert mit der rohen"Vertical"-Achse plusrightmultipliziert mit"Horizontal"; normalisieredir, wenn der Betrag größer als 1 ist.- Wenn
dir != Vector3.zerogilt, setzetransform.rotation = Quaternion.LookRotation(dir);. Erstellemoveausdir * 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
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer2Buttons und Bildschirme
Buttons und onClickLambdasVerknüpfungen im InspectorPanels ein- und ausblendenGesundheitsbalkenRückblick: Upgrade-Shop5Speichern mit PlayerPrefs
Eine Zahl speichernMit einem Standardwert ladenHöchstpunktzahlEinstellungen speichernRückblick: Münzen auf der Bank8Charaktersteuerung
CharacterController.MoveSchwerkraft von HandSpringenDinge schiebenDorthin bewegen, wohin du schaustRückblick: DoppelsprungÜbe selbstständig: Unity-Playground