Der Parcours
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 49 von 60.
In diesem Kapitel entsteht ein 3D-Plattformer. Du läufst und springst über schwebende Plattformen, fährst auf einer gleitenden Plattform, 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 verwendet einen CharacterController, der über die Aktionen des Input System gesteuert wird. Die Kamera ist ein untergeordnetes Objekt davon 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 Schwerkraft, Sprünge und Time.deltaTime Aufgabe des Skripts, wie im Kapitel zum Character Controller. SimpleMove(speed) erwartet eine Geschwindigkeit in Einheiten pro Sekunde, skaliert sie selbst mit der Zeit des Frames und fügt Schwerkraft hinzu. Der übergebene y-Wert wird ignoriert. Eine damit bewegte Figur stürzt also von Vorsprüngen, kann aber niemals springen. Dieser Schäferhund in einem Hütespiel aus der Vogelperspektive muss nicht springen, daher bilden SimpleMove und die Move-Aktion sein ganzes 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 eigene vertikale Geschwindigkeit und bewegt sich mit Move. Dabei liest er die Aktionen Move und Jump aus, anstatt die Klasse Input zu verwenden. Unity empfiehlt, pro Frame Move oder SimpleMove nur einmal aufzurufen: Das Laufen und das Fallen fließen in denselben Aufruf ein, und isGrounded beschreibt dann die gesamte Bewegung.
Aufgabe
MittelBringe die Spielfigur zum Laufen, Springen und Fallen.
- Suche in
Start()mitInputSystem.actions.FindActionnachMoveundJump. - Laufe in
Update()mitspeed: Move's x entlang der x-Achse, sein y entlang der z-Achse. - Addiere
gravity * Time.deltaTimezuvelocity.y, im geerdeten Zustand und beim Fallen-2f. Ein Sprung setzt den Wert im geerdeten Zustand aufMathf.Sqrt(jumpHeight * -2f * gravity). - Rufe
controller.Move((move + velocity) * Time.deltaTime)einmal auf.
Drücke „Spielen“: Springe zur ersten Plattform. Drücke dann „Prüfen“.
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
}
}
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Übe selbstständig: Unity-Playground