Bedingungen in Unity sind ein Weg, Objekte auf Ereignisse reagieren zu lassen, Zustände zu überprüfen und Entscheidungen im Code zu treffen. Zum Beispiel kann eine Spielfigur nur springen, wenn sie auf dem Boden steht, ein Gegner kann angreifen, wenn der Spieler in der Nähe ist, und eine Tür kann sich per Knopfdruck öffnen.
Bei solchen Prüfungen verwenden wir oft
Vergleichsoperatoren (wie ==
,
!=
, >
) und
logische Operatoren (wie &&
und
||
). Wir haben sie schon in der vorherigen Lektion gesehen
– jetzt helfen sie uns, je nach Situation das richtige Verhalten zu
bestimmen.
In Unity (und generell in C#) erlaubt uns die
if
-Anweisung, einen bestimmten Codeblock nur dann
auszuführen, wenn eine bestimmte Bedingung erfüllt ist. Mit
else
wird festgelegt, was passiert, wenn die Bedingung
nicht zutrifft.
In die runden Klammern nach if
schreiben wir eine
Bedingung. Das ist ein Ausdruck, der überprüft wird
und entweder wahr (true) oder
falsch (false) ergibt. Ist das Ergebnis wahr, wird
der Codeblock in geschweiften Klammern ausgeführt. Ist es falsch, wird
der Block übersprungen – oder else
wird ausgeführt, wenn
vorhanden.
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
int health = 10;
// Start wird einmal beim Start des Objekts aufgerufen
void Start()
{
}
// Update wird einmal pro Frame aufgerufen
void Update()
{
if (health > 0)
{
// Spieler lebt noch
Debug.Log("Steh auf und kämpfe!");
}
else
{
// Spieler ist tot
Debug.Log("Game Over");
}
}
}
Hier prüfen wir, ob die Lebenspunkte größer als null sind. Wenn ja, zeigen wir eine Nachricht, dass der Spieler noch im Kampf ist. Wenn nicht, ist es Zeit, das Level neu zu starten. So funktioniert ein Großteil der Logik in Spielen.
In Unity werden sehr häufig
boolesche Variablen geprüft – zum Beispiel
isJumping
, isDead
, isGrounded
.
Diese sind praktisch, weil sie klar anzeigen, ob etwas aktiv ist oder
nicht, ob etwas passiert oder nicht.
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
bool isDead = true;
// Start wird einmal beim Start des Objekts aufgerufen
void Start()
{
}
// Update wird einmal pro Frame aufgerufen
void Update()
{
if (isDead)
{
// Figur ist tot
Debug.Log("Game Over");
}
}
}
Bedingungen können auch ineinander verschachtelt werden, um mehrstufige Prüfungen durchzuführen. Das ist nützlich, wenn eine Aktion von mehreren Faktoren abhängt – etwa wenn eine Figur nur springen darf, wenn sie am Boden ist und die Sprungtaste gedrückt wurde. In solchen Fällen kann man aber auch logische Operatoren verwenden, um alles in eine einzige Zeile zu schreiben.
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
bool isGrounded = true;
bool jumpKeyPressed = true;
// Start wird einmal beim Start des Objekts aufgerufen
void Start()
{
}
// Update wird einmal pro Frame aufgerufen
void Update()
{
// Verschachtelte Bedingungen
if (isGrounded)
{
if (jumpKeyPressed)
{
Debug.Log("Sprung ausgeführt (verschachteltes if)");
}
}
// Dasselbe mit logischem Operator
if (isGrounded && jumpKeyPressed)
{
Debug.Log("Sprung ausgeführt (logisches UND)");
}
}
}
Wenn es viele mögliche Werte gibt und du je nach Wert eine bestimmte
Aktion ausführen möchtest, ist switch
sehr praktisch. Es
ist wie ein Menü: Wenn ein bestimmter Fall gewählt ist – führen wir
diesen aus, bei einem anderen Fall – einen anderen.
In die runden Klammern nach switch
schreiben wir eine
Variable oder einen Ausdruck, dessen Wert wir überprüfen möchten.
Danach folgen die case
-Blöcke – also die möglichen Werte.
Wenn einer davon übereinstimmt, wird der entsprechende Code
ausgeführt. Damit das Programm danach nicht einfach weitermacht,
schreiben wir am Ende jedes case
ein break;
.
Falls kein Wert passt, wird der default
-Block ausgeführt.
using UnityEngine;
public class CSharpScript : MonoBehaviour
{
string enemyType = "zombie";
// Start wird einmal beim Start des Objekts aufgerufen
void Start()
{
switch (enemyType)
{
case "zombie":
Debug.Log("Zombie greift an!");
break;
case "robot":
Debug.Log("Roboter schießt!");
break;
case "ghost":
Debug.Log("Geist verschwindet!");
break;
default:
Debug.Log("Unbekannter Gegner...");
break;
}
}
// Update wird einmal pro Frame aufgerufen
void Update()
{
}
}
💡Der Befehl break;
beendet den aktuellen
case
. Wenn man ihn weglässt, läuft das Programm einfach
weiter durch alle folgenden Blöcke – auch wenn sie nicht passen. Das
nennt man Fall-Through. Manchmal ist das gewollt, aber oft
vergisst man es – und bekommt dann unerwartete Ergebnisse.