Coroutines sind Funktionen, die parallel zum Hauptausführungszyklus des Spiels ausgeführt werden können...


Die Videoversion dieses Tutorials ist derzeit in dieser Sprache nicht verfügbar. Unten kannst du dir die englische Version mit Untertiteln ansehen; unter dem Video findest du die ins Deutsche übersetzte Transkription.


Videotranskript

Hallo zusammen!

Willkommen zu diesem grundlegenden Tutorial zur Verwendung von Coroutines in Unity.

Coroutines sind Funktionen, die parallel zum Hauptausführungszyklus des Spiels ausgeführt werden können.

In diesem Tutorial verwende ich ein praktisches Beispiel, um das Konzept zu erklären und außerdem die Funktion WaitForSeconds vorzustellen, mit der man die Ausführung einer Operation für eine bestimmte Anzahl von Sekunden pausieren kann.

Dieses Tutorial setzt voraus, dass du ein grundlegendes Verständnis von C#-Programmierung in Unity hast. Es wurde mit der Version 2022 von Unity aufgenommen, aber Coroutines sind in vielen Programmiersprachen und auch in früheren Versionen von Unity verfügbar.

Unser Ziel ist es, die Kanone automatisch alle 3 Sekunden eine Kanonenkugel als Prefab, eine einfache schwarze Kugel, abfeuern zu lassen, bis ein externes Ereignis eintritt, das diese Routine unterbricht.

In diesem Fall besteht das externe Ereignis darin, dass der Benutzer die Taste S drückt, also "Stop".

Zu Beginn müssen wir ein Skript für die Kanone erstellen und es "autoshoot" nennen.

Innerhalb der Hauptklasse definiere ich drei Variablen, um den Startpunkt der Kugel relativ zur Kanone festzulegen:

public GameObject spawnPrefab;

In diese öffentliche Variable verknüpfe ich im Unity Editor das Kanonenkugel-Prefab.

Vector3 spawnPosition;

Quaternion spawnRotation;

Ich habe diesen Punkt und die anfängliche Ausrichtung berechnet, daher initialisiere ich diese beiden Werte innerhalb der Start-Funktion:

spawnPosition = transform.position + new Vector3(-1.2f, 1.8f, 0f);

spawnRotation = Quaternion.Euler(-10f, -90f, 0f);

Es ist klar, dass wir eine Schleife implementieren müssen, die sich unendlich wiederholt, sofern sie nicht durch ein externes Ereignis unterbrochen wird, und die eine Warteanweisung von 3 Sekunden enthält, bevor sie zur nächsten Iteration übergeht.

HINWEIS: Das Kanonenkugel-Prefab enthält ein Skript, das beim Start einen anfänglichen Vorwärtsschub auf die Kugel ausübt und das Objekt nach 3 Sekunden selbst zerstört, damit weder das virtuelle Universum noch der Systemspeicher mit Kanonenkugeln gefüllt werden.

Die Anweisung WaitForSeconds ermöglicht es uns, für eine bestimmte Zeitspanne zu pausieren, in unserem Fall 3 Sekunden.

Nun müssen wir einen WHILE-Block erstellen, um die Hauptschleife auszuführen, die ich derzeit an einer freien Stelle im Skript schreibe.

while(true) {

GameObject cannonBall = Instantiate(spawnPrefab, spawnPosition, spawnRotation, null);

yield return new WaitForSeconds(3);

}

Wo sollten wir diesen WHILE-Block platzieren?

Er kann nicht in Start stehen, da wir dort yield WaitForSeconds nicht verwenden können. Außerdem würde das Platzieren in Update keine Verzögerung bewirken, da Update bei jedem Frame des Spiels aufgerufen wird.

Wir müssen daher eine Funktion mit dem Namen "shoot" erstellen, die den Typ IEnumerator zurückgibt und den WHILE-Block enthält.

Diese Funktion ermöglicht es uns, eine Coroutine mithilfe der Anweisung StartCoroutine zu starten, wobei der Funktionsname als Parameter in doppelten Anführungszeichen übergeben wird.

Da die Kanone sofort mit dem Schießen beginnen soll, schreiben wir:

StartCoroutine("shoot");

innerhalb von Start, unmittelbar nach der Initialisierung von spawnPosition und spawnRotation.

Speichern wir das Skript und wechseln in den Editor, um das bis hierhin definierte Skript zu testen.

Um die Coroutine stoppen oder neu starten zu können, gehen wir zurück ins Skript und fügen zwei Anweisungen hinzu.

Wir können die Coroutine stoppen, indem wir prüfen, ob die Taste S gedrückt wird, und dann die Funktion StopCoroutine mit der Coroutine "shoot" als Parameter aufrufen.

Ebenso können wir die Coroutine neu starten, indem wir prüfen, ob die Taste R gedrückt wird, und die Funktion StartCoroutine mit "shoot" als Parameter aufrufen.

Also schreiben wir in Update:

if(Input.GetKeyDown(KeyCode.S)) StopCoroutine("shoot");

if(Input.GetKeyDown(KeyCode.R)) StartCoroutine("shoot");

Nachdem wir diese Anweisungen hinzugefügt haben, speichern wir das Skript und wechseln zurück in den Unity Editor, um es auszuprobieren.

Das war alles für dieses kurze Tutorial. Ich hoffe, es war hilfreich für dich. Bis bald!

Tutorials durchsuchen

Geben Sie eine Suchphrase oder mehrere durch Kommas getrennte Schlüsselwörter ein.

Dies ist eine persönliche Website und kein Verkaufskanal. Die Seiten zu den 3D-Modellen dokumentieren eine Auswahl meiner Arbeiten und enthalten weder Angebote noch Preise, Kaufmöglichkeiten oder kommerzielle Links. Derzeit nehme ich keine Anfragen für individuelle Auftragsarbeiten, Beratungen oder andere berufliche Kooperationen an.


ERWEITERTE DATENSCHUTZ- UND COOKIE-VERWENDUNGSRICHTLINIEN