Der Parcours
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 48 von 56.
In diesem Kapitel erstellen wir einen 3D-Plattformer. Du läufst und springst über schwebende Plattformen, fährst auf einer gleitenden Plattform mit, berührst Kontrollpunkte, damit dich ein Sturz nicht zum Start zurückschickt, sammelst Edelsteine, die auf dem Bildschirm gezählt werden, überquerst die Ziellinie zum nächsten Level und versuchst, deine Bestzeit zu schlagen. Das Spiel besteht aus fünf Skripten, die von Anfang an im Projekt vorhanden sind: Player, MovingPlatform, Checkpoint, Gem und FinishLine. Die letzten vier sind vorerst leer, und in jeder Lektion wird eines davon ausgefüllt. Der Spieler ist ein CharacterController, der mit den Aktionen des Input Systems gesteuert wird. Die Kamera ist sein untergeordnetes Objekt und folgt ihm daher ohne Skript.
Ein CharacterController bewegt sich auf zwei Arten. Move(motion) bewegt ihn um eine Strecke und fügt nichts hinzu. Daher sind Gravitation, Sprünge und Time.deltaTime Aufgabe des Skripts, wie im Kapitel „Character Controller“. SimpleMove(speed) erwartet eine Geschwindigkeit in Einheiten pro Sekunde, skaliert sie selbst mit der Zeit des Frames und fügt Gravitation hinzu. Der übergebene y-Wert wird ignoriert. Eine damit bewegte Figur fällt also von Vorsprüngen, kann aber niemals springen. Dieser Schäferhund in einem von oben betrachteten Hüte-Spiel muss nicht springen, daher bilden SimpleMove und die Move-Aktion sein gesamtes Skript:
using UnityEngine;
using UnityEngine.InputSystem;
public class Sheepdog : MonoBehaviour
{
[SerializeField] private float speed = 6f;
private CharacterController controller;
private InputAction moveAction;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
}
}Der Spieler im Plattformer muss springen können. Deshalb verwaltet er seine vertikale Geschwindigkeit selbst und bewegt sich mit Move. Dabei liest er die Aktionen Move und Jump, statt die Klasse Input zu verwenden. Unity empfiehlt, pro Frame Move oder SimpleMove genau einmal aufzurufen: Das Laufen und das Fallen fließen in denselben Aufruf ein, und isGrounded beschreibt dann die gesamte Bewegung.
Aufgabe
MittelBeginne den Plattformer mit dem Spieler. Das Player-Skript hat speed (5), jumpHeight (1.5) und gravity (-9.81), den controller und eine velocity für den Fall. Ermittle die Aktionen Move und Jump einmal in Start und in Update:
- Move bewegt den Spieler mit
speedEinheiten pro Sekunde: rechts und links entlang der x-Achse, vorwärts und rückwärts entlang der z-Achse. - Die Schwerkraft addiert in jedem Frame
gravity * Time.deltaTimezuvelocity.y. Solange der Controller Bodenkontakt hat undvelocity.yunter 0 liegt, setze zuerstvelocity.yauf -2, damit der Spieler auf den Boden gedrückt bleibt. - Jeder Druck auf Jump setzt, solange der Spieler Bodenkontakt hat,
velocity.yaufMathf.Sqrt(jumpHeight * -2f * gravity): einen SprungjumpHeightEinheiten hoch. Wenn du Jump gedrückt hältst, springst du einmal, und Sprünge in der Luft sind nicht möglich. - Rufe
controller.Moveeinmal auf, mit der Gehbewegung undvelocityzusammen, multipliziert mitTime.deltaTime.
Drücke Play und springe zu den ersten Plattformen hinüber, dann klicke auf Check.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// Mit der Move-Aktion laufen, mit der Jump-Aktion springen und durch die Schwerkraft fallen
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Echte Spiele entwickeln
1Text auf dem Bildschirm
Canvas und TextPunktestand anzeigenZahlen formatierenEin Countdown-TimerRückblick: Tachometer4Szenen und Level
Eine Szene ladenDas Level neu startenNächstes LevelZwischen Szenen beibehaltenRückblick: Levelauswahl10Projekt: 3D-Plattformer
Der ParcoursBewegliche Plattformen2Buttons 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 Bank