Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Bringe die Spielfigur zum Laufen, Springen und Fallen.

  1. Suche in Start() mit InputSystem.actions.FindAction nach Move und Jump.
  2. Laufe in Update() mit speed: Move's x entlang der x-Achse, sein y entlang der z-Achse.
  3. Addiere gravity * Time.deltaTime zu velocity.y, im geerdeten Zustand und beim Fallen -2f. Ein Sprung setzt den Wert im geerdeten Zustand auf Mathf.Sqrt(jumpHeight * -2f * gravity).
  4. 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

Übe selbstständig: Unity-Playground