CharacterController.Move
Teil des Abschnitts Echte Spiele entwickeln der Unity-Journey von Coddy. Lektion 37 von 56.
Ein CharacterController ist die Unity-Komponente für eine gehende Spielfigur: eine Kapsel, die sich nur bewegt, wenn dein Skript controller.Move(motion) aufruft. motion ist die Strecke, um die sie sich in diesem Frame bewegen soll, also eine Geschwindigkeit multipliziert mit Time.deltaTime. Move lässt die Kapsel an Wänden entlanggleiten, statt durch sie hindurchzugehen, geht Steigungen bis zu ihrem Slope Limit (45 degrees) hinauf und steigt auf Kanten bis zu ihrem Step Offset (0.3 units). Sie ist kein Rigidbody: keine Kräfte, keine Schwerkraft, kein Abprallen und nichts, was sie schiebt. Sie bewegt sich genau dorthin, wohin Move sie schickt – genau das, was präzise Spielsteuerungen benötigen.
Die Schwerkraft musst du selbst hinzufügen, ebenso die Erkennung des Bodens. isGrounded ist true, wenn die letzte Move-Aufruf etwas unterhalb berührt hat, daher findet eine Bewegung ohne Abwärtskomponente niemals den Boden. Ein Move, der kürzer als die Min Move Distance des Controllers (0.001) ist, bewirkt überhaupt nichts. Daher meldet ein Controller, der sich nur seitwärts bewegt hat, sobald er stillsteht, dass er nicht am Boden ist. Dieser Kurier läuft mit den Pfeiltasten und drückt sich bei jeder Bewegung ein wenig nach unten:
public class Courier : MonoBehaviour
{
public float speed = 6f;
CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = -2f; // immer nach unten drücken, damit der Boden erkannt wird
controller.Move(move * Time.deltaTime);
if (!controller.isGrounded)
{
Debug.Log("Off the ground");
}
}
}Die Kapsel hält zu dem, was sie berührt, ihren Skin Width (0.08) Abstand. Daher ruht ein 2 Einheiten hoher Controller auf einem Boden bei y = 0 auf y = 1.08 und nicht auf 1. Außerdem beginnt Move an der Position, an der die Physik den Controller zuletzt gesehen hat. Deshalb kann ein transform.position, das darauf gesetzt wird, beim nächsten Move rückgängig gemacht werden: Um ihn zu teleportieren, setze controller.enabled = false, bewege ihn und aktiviere ihn wieder.
Aufgabe
MittelDer Entdecker steht auf einer Steinplattform, hinter ihm befindet sich eine Wand und links eine Kante. Schreibe Explorer.cs für den Player, der über einen CharacterController verfügt. Im Inspector werden speed (4) und fallSpeed (3) festgelegt, und Start() findet bereits den Controller und den Renderer des Entdeckers.
- Mit den Pfeiltasten (oder WASD), die über die Rohachsen ausgelesen werden, bewegst du ihn mit
controller.Movemit einer Geschwindigkeit vonspeedEinheiten pro Sekunde: links und rechts entlang der x-Achse, oben und unten entlang der z-Achse. Die Wand muss ihn aufhalten. - Bei jeder Bewegung geht es außerdem mit
fallSpeedEinheiten pro Sekunde nach unten, sodass der Entdecker auf der Plattform bleibt und über ihre Kante fällt. - Wenn der Controller geerdet ist, ist der Entdecker
Color.green; andernfallsColor.red.
Drücke Play, gehe gegen die Wand und über die Kante, dann Check.
Probier es selbst
using UnityEngine;
public class Explorer : MonoBehaviour
{
public float speed = 4f;
public float fallSpeed = 3f;
CharacterController controller;
Renderer rend;
void Start()
{
controller = GetComponent<CharacterController>();
rend = GetComponent<Renderer>();
}
void Update()
{
// Bewege dich mit controller.Move und färbe dann den Explorer entsprechend isGrounded ein
}
}
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 Bank8Charaktersteuerung
CharacterController.MoveSchwerkraft von HandSpringenDinge schiebenDorthin bewegen, wohin du schaustRückblick: Doppelsprung