Ein fließender Spurwechsel
Lektion 2 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Der Läufer springt innerhalb eines einzigen Frames von einer Spur zur anderen. Es funktioniert, aber es sieht aus, als würde er sich teleportieren. Ein Spurwechsel sollte einen Moment dauern, damit das Auge ihm folgen kann.
Mathf.MoveTowards(current, target, maxStep) bewegt eine Zahl auf ein Ziel zu, und zwar höchstens um maxStep und niemals darüber hinaus. Wird die Funktion in jedem Frame mit einem Schritt aus Geschwindigkeit mal Time.deltaTime aufgerufen, bewegt sich die Zahl unabhängig von der Bildrate mit dieser Geschwindigkeit in Einheiten pro Sekunde:
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);Bei einem Wert von 16 für laneSpeed dauert ein Spurwechsel über 2.5 Einheiten etwa 0.16 Sekunden: schnell, aber sichtbar.
Aufgabe
Einfach- Füge
public float laneSpeed = 16f;unterlaneWidthhinzu. - Ersetze
float x = targetX;durch die oben stehendeMathf.MoveTowards-Zeile. - Drücke „Spielen“ und wechsle die Spur.
Probier es selbst
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public int lane;
private CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
float targetX = lane * laneWidth;
float x = targetX;
Vector3 move = new Vector3(x - transform.position.x, 0f, 0f);
controller.Move(move);
}
}
Alle Lektionen in Unity-Spiel: Himmelsbahnen
Übe selbstständig: Unity-Playground