🏠 Startseite

Bedingungen in Unity

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.

🔀 Bedingungen: if und else

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)");
    }
  }
}

🎚 Die switch-Anweisung – Auswahl zwischen Optionen

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.