In diesem Tutorial wirst du lernen, wie man in Unity einen Ball zum rollen bringt und ihn mit W-A-S-D und den Pfeiltasten steuert.
Für Anfänger
Dieses Tutorial ist für Anfänger. Wer allerdings noch nie etwas mit der Unity-Engine zu tun hatte, sollte sich zunächst die dreiteilige Einsteigerserie anschauen. Dieses Tutorial baut auf dem Wissen auf.
Zu beginn werden wir eine kleine Szene basteln und uns dann dem Code widmen. Dabei werde ich alles sehr einfach und übersichtlich handhaben. Auch wenn wir ein wenig mit Physik arbeiten werden, wird es ziemlich easy, da uns Unity sehr viele Dinge abnimmt.
Am Ende sollte die Szene so aussehen:
Zwischendurch werde ich einige Dinge tiefergehend erklären. Du kannst das aber gerne überspringen und zu einem späteren Zeitpunkt durchlesen.
Die Szene
Wir starten mit einer 3D Basic Szene. Darin haben wir bereits Kamera, Licht und einen Himmel. Dem fügen wir, wie in der Einsteigerserie gezeigt, einen Boden (Plane) und einen Ball (Sphere) hinzu. Für Boden und Ball erzeugen wir noch je ein Material und weisen eine Textur zu. Vor allem beim Ball ist es nützlich, damit wir die Drehung erkennen. Du kannst hierzu gerne meine Texturen verwenden.
Setze den Ball üben den Boden. Durch unsere Einstellungen wird er zu beginn der Szene herunterfallen und auf dem Boden landen. Bei mir sieht das so aus:
Die Kamera solltest du auf der x-Achse um 45° drehen. Bei mir sehen die Einstellungen für die Kamera so aus:
Dem Ball fügst du einen einen Sphere Collider hinzu. Den brauchst du für die Kollision. Außerdem noch ein Rigidbody. Die Einstellungen sehen bei mir so aus:
Erklärungen
Sphere Collider
Dies ist eine Kollisionskomponente, die eine sphärische Form repräsentiert. Ein Collider in Unity wird verwendet, um festzustellen, ob Objekte miteinander kollidieren. Der Sphere Collider ist speziell darauf ausgelegt, Kollisionen basierend auf einer Kugelform zu erkennen.
Wenn du einen Sphere Collider zu einem Spielobjekt hinzufügst, wird dieses Spielobjekt eine unsichtbare sphärische Hülle um sich haben. Diese Hülle wird für Kollisionen mit anderen Objekten in der Spielwelt verwendet. Wenn sich die Collider zweier Objekte überlappen, wird eine Kollision erkannt, und du kannst dann entsprechend darauf reagieren, indem du beispielsweise Skripte für Kollisionsereignisse verwendest.
Sphere Collider sind besonders nützlich, wenn du Kollisionen in Spielsituationen modellieren möchtest, bei denen eine sphärische Form besser geeignet ist als andere Collider-Typen wie Box Collider oder Mesh Collider. Collider sind nur dann effektiv sind, wenn sie mit einem Rigidbody-Komponente kombiniert werden.
Rigidbody
Rigidbody ist eine Komponente, die einem Spielobjekt physikalische Eigenschaften verleiht. Damit kann ein Objekt den Gesetzen der Physik gehorchen und reagieren, zum Beispiel auf Kräfte, Schwerkraft, Kollisionen und Drehmomente.
Außerdem ist auch Interpolation und Extrapolation möglich. Diese Funktionen helfen, die Bewegung von Objekten zwischen zwei Frames zu glätten, was insbesondere bei schnellen oder unregelmäßigen Bewegungen wichtig sein kann.
Um einen Rigidbody zu einem Spielobjekt hinzuzufügen, kannst du dies entweder über den Unity-Editor tun oder programmatisch in einem Skript. Beachte, dass du in Unity oft auf Kombinationen von Rigidbody und Collidern angewiesen bist, um realistische physikalische Interaktionen in deinem Spiel zu erreichen.
Skript BallController
Eigentlich ist das Skript ziemlich kurz, es wird lediglich durch die Kommentare etwas aufgebläht, also keine Panik.
BallController
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
usingUnityEngine;
// Dieses Skript erfordert ein Rigidbody-Komponente, um korrekt zu funktionieren.
[RequireComponent(typeof(Rigidbody))]
publicclassBallController:MonoBehaviour
{
// Die Kraft, um den Ball zu bewegen
publicfloatmoveForce=100f;
// Das Drehmoment, um den Ball zu drehen
publicfloatrotateTorque=100f;
// Die Referenz auf das Rigidbody-Objekt
privateRigidbody rb;
// Wird einmal beim Start des Spiels aufgerufen
voidStart()
{
// Holen die Referenz auf das Rigidbody-Objekt, das mit diesem Skript verbunden ist
rb=GetComponent<Rigidbody>();
// Setze den angularDrag-Wert auf 0.5f, um die Drehbewegung zu dämpfen
rb.angularDrag=0.5f;
}
// Wird in jedem Frame aufgerufen
voidUpdate()
{
// Bewegungseingaben des Spielers abrufen
floathorizontalInput=Input.GetAxis("Horizontal");
floatverticalInput=Input.GetAxis("Vertical");
// Die Bewegungsrichtung normalisieren, um sicherzustellen, dass die Diagonale Bewegung nicht schneller ist
// Die Kraft berechnen, die auf den Ball angewendet wird, basierend auf der Bewegungsrichtung
Vector3 moveForceVector=moveDirection*moveForce;
// Die aktuelle y-Geschwindigkeit beibehalten, um die Bewegung in der vertikalen Richtung zu ignorieren
moveForceVector.y=rb.velocity.y;
// Die Kraft auf den Rigidbody anwenden
rb.AddForce(moveForceVector);
}
}
}
Erklärungen
Erforderliche Komponente
Das Skript erfordert, dass das Spielobjekt über eine Rigidbody-Komponente verfügt. Dies wird durch die [RequireComponent(typeof(Rigidbody))] Zeile am Anfang des Skripts sichergestellt.
Variablen
moveForce: Die Kraft, die auf den Ball angewendet wird, um ihn zu bewegen.
rotateTorque: Das Drehmoment, das auf den Ball angewendet wird, um ihn zu drehen.
rb: Eine private Referenz auf die Rigidbody-Komponente des Spielobjekts.
Start-Methode
Die Start-Methode wird einmal beim Start des Spiels aufgerufen.
Die Referenz auf die Rigidbody-Komponente wird abgerufen, und der angularDrag wird auf 0.5f gesetzt, um die Drehbewegung zu dämpfen.
Update-Methode
Die Update-Methode wird in jedem Frame aufgerufen.
Die horizontale und vertikale Eingabe des Spielers wird über Input.GetAxis abgerufen.
Die Eingaben werden normalisiert, um sicherzustellen, dass diagonale Bewegungen nicht schneller sind.
Die Rotation des Balls wird basierend auf der Bewegungsrichtung berechnet und auf den Ball angewendet, wenn er sich bewegt.
Bewegung des Balls
Wenn der Spieler die Bewegungstasten drückt (Input.GetButtonDown("Vertical") oder Input.GetButtonDown("Horizontal")), wird die Kraft berechnet, die auf den Ball angewendet wird.
Die aktuelle y-Geschwindigkeit des Balls wird beibehalten, um die vertikale Bewegung zu ignorieren.
Die berechnete Kraft wird dann auf den Rigidbody angewendet, um den Ball zu bewegen.
Die Steuerung erfolgt also indirekt über die Bewegungsrichtung des Spielers. Die Tasten „Vertical” und „Horizontal” werden verwendet, um die horizontale und vertikale Eingabe des Spielers zu erfassen, und die Bewegung des Balls wird dann durch die Anwendung von Kräften und Drehmomenten auf den Rigidbody gesteuert. Wenn du das Skript in deinem Unity-Projekt verwendest, kannst du die Pfeiltasten oder die W-A-S-D-Tasten verwenden, um den Ball zu steuern.
Im vorliegenden Skript wird die Eingabe über die Funktion Input.GetAxis("Horizontal") für die horizontale Richtung und Input.GetAxis("Vertical") für die vertikale Richtung abgerufen. Diese Funktionen in Unity sind standardmäßig so konfiguriert, dass sie auf die Pfeiltasten und die W-A-S-D-Tasten reagieren.
Die Input.GetAxis-Funktion ist darauf ausgelegt, sowohl auf die Pfeiltasten als auch auf die W-A-S-D-Tasten zu reagieren, ohne dass dies speziell im Skript festgelegt werden muss. Unity interpretiert diese Tasten standardmäßig als horizontale und vertikale Eingabe. Wenn du die Pfeiltasten oder W-A-S-D-Tasten auf deiner Tastatur verwendest, reagiert das Skript automatisch auf diese Eingaben.
Diese Einstellungen können auch in den Unity-Eingabeoptionen angepasst werden. Du kannst dies überprüfen, indem du zu „Edit → Project Settings → Input Manager” gehst und die Achsen Horizontal und Vertical überprüfst. Dort siehst du die zugewiesenen Tasten und kannst sie bei Bedarf ändern.
Was fehlt noch?
Du wist schnell bemerken, dass der Ball aus dem Sichtfeld verschwindet, wenn er etwas zu weit rollt. Es wäre also hilfreich, wenn die Kamera dem Ball folgen würde. Darum kümmern wir uns im nächsten Tutorial.
Außerdem bauen wir eine Rampe und eine Wand ein, um die Kollision zu testen.
Wir verwenden Cookies, um unsere Website und unseren Service zu optimieren.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.