Frage von ZerricK, 33

Unity Mehrere WaitForSeconds?

Hallo Community,

Ich hab ein kleines Problem in Unity2D, unzwar benutzt ich einen IEnumerator für die Skills(Wie in WoW), doch das problem ist wenn ich 2 Skills aufeinmal benutzten will gehts nicht und ich weiß auch Warum.

if (beispiel1)
{
    //Mach das
    yield return new WaitForSeconds(sec);
    //Mach dann das
}
if (beispiel2)
{
    //Mach das
    yield return new WaitForSeconds(sec);
    //Mach dann das
}

Wenn ich den Ersten Skill Benutzte und dann den Zweiten, wird der Zweite Skill erst ausgeführt wenn WaitForSeconds beendet wird. Ich wollte fragen wie ich das umgehen kann damit beide sofort ausgeführt werden. btw. Ich programmiere in C#

Danke im Vorraus :D

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Frischmilch, 20

Ich glaube du hast da irgendwie ein Problem in deiner Architektur?!

Folgende Annahme: Deine Skills haben einen Cooldown und evtl. auch noch eine Castdauer/Latenz (Richtig?) In deiner Gameloop solltest du, keine Waits haben, stattdessen lieber für jeden Skill einen Casttimer bzw. Cooldowntimer. Bei jedem durchlauf deiner Gameloop kannst du nun den Status prüfen, und zwar von allen Skills. Casttimer abgelaufen? Dann trigger die Aktion.. Cooldown durch? Dann kann der Skill wieder frei geschaltet werden. Dafür brauchst du keine Wait Statements, die behindern deine Gameloop ohnehin nur.

Das Prinzip lässt sich sicherlich noch weiter verbessern, aber eine Architektur dafür findest du sicher selber besser. Ich kenn ja den Rest des Programms nicht :-)

Kommentar von ZerricK ,

http://pastebin.com/Q0zArFav so ist der Momentane Skript^^ Ich weiß der Stil ist im moment nicht wirklich gut, was ich auch ändern werde da es am Testen war. Ich Probier es grad in der Void Update zu benutzen. Ich melde mich dann später obs besser funktioniert^^

Kommentar von Frischmilch ,

Du könntest dir auch eine abstrakte Klasse "Skill" machen, von der du dann deine bisher zwei konkreten Implementierungen ableitest. Immer wenn ein Skill getriggert wurde, kommt der in eine Liste, die in jeder Gameloop durchlaufen wird und für jeden Skill in der Liste geprüft wird, welcher Zustand der Skill hat und ggf. eine "Action" ausgeführt wird. Wenn du mal mehr als 2 Skills hast, hast du damit weniger "If" Statements in deiner Loop und die konkrete implementierung, also das was die Action macht, wie lange Cooldown etc dauern, sind in deiner Skill-Klasse gekapselt. Wenn nur der Spieler Skills triggern kann, dann könnte die Skill-Klasse sogar statisch sein.

Antwort
von Crysali, 7

Ich schließe mich Frischmilch an. Erstelle eine Klasse namens "Skill", die eine Methode "Cooldown" aufruft, nachdem der Skill genutzt wurde, also deinen IEnumerator mit WaitForSeconds. Du musst also jeden Skill als eigenes GameObject erstellen, in diesem Fall, und die Klasse "Skill" als Component hinzufügen. Wird aber ziemlich hässlich, wenn es darum geht, was der Skill machen soll.

float cd;
bool isReady;

// Methode, wenn der Skill genutzt wird
void OnButton(){
if (isReady){
// DoSomething
Cooldown(cd);
}
}

// Cooldown
IEnumerator Cooldown (float cd){
isReady = false;
yield return new WaitForSeconds(cd);
isReady = true;
}

OnButton() ersetzt du halt mit deiner Methode, die den Skill ausführt/anleitet. Die Methode hier ist natürlich nicht perfekt, funktioniert aber. Benutze sie für mein Spiel und funktioniert, würde mich aber mal interessieren, ob das ein guter Weg ist.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten