Jump to content
Unity Insider Forum

Animation fertig


Ich

Recommended Posts

Hey, ich habe nicht viel Erfahrung mit Unity und frage euch wie ich es hinbekomme.

Und zwar wenn ich auf ein Knopf drücke und los lasse wird eine Animation (Hoch) abgespielt und ich gelange zum nächsten Raum/Szene. Doch diese Animation (Hoch) wird unterbrochen weil wenn ich sofort den Knopf los lasse gehe ich zum nächsten Raum und das möchte ich nicht. Ich möchte das die Animation erst fertig abgespielt wird und das ich dann zum nächsten Raum/Szene gelang

Kurz gesagt: Wie kann ich warten, bis eine Animation abgeschlossen ist?

Kann mir bitte jemand helfen :)

Ich weiß nicht ob Ihr mit den Informationen helfen könnt... Falls ihr noch Informationen brauch dann einfach sagen welche.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Damit habe ich auch eine ganze Weile kämpfen müssen um eine Rotation vor dem Bewegungsablauf zu realisieren zu können. D.h. ich wollte, dass der Charakter sich zunächst per Animation auf das Bewegungsziel ausrichtet bevor er losläuft. D.h. meine Rotationsanimation muss abgeschlossen sein, bevor er mit dem eigentlichen Bewegungsablauf, der durch den NavMeshAgent realisiert ist, starten kann.

Letztendlich habe ich das nur durch eine Coroutine lösen können, die prüft ob die Animation schon beendet ist:

protected IEnumerator OnCompleteRotationAnimation()
{			
	Debug.Log("Wait on correct animation: " + Time.time);
	while(!animator.GetCurrentAnimatorStateInfo(0).IsName("TurnOnSpot")){
		yield return null;
	}

	Debug.Log("Correct animation started to wait for complete: " + Time.time);
	while (animator.GetCurrentAnimatorStateInfo(0).normalizedTime < animationEndThreshold){
		yield return null;
	}

	Debug.Log("Correct Animation stop: " + Time.time);
	this.signedAngle = 0f;
}

Die Prüfung erfolgt in zwei Schritten: Zunächst prüfe ich ob die korrekte Animation aktiv ist, dann prüfe ich ob sie beendet ist, wenn die normalisierte Zeit meinen Grenzwert erreicht oder überschritten hat.

Das hat mich allerdings dazu gezwungen die eigene Bewegungsmethode ebenfalls zu einer Coroutine zu machen. Zudem habe ich eine weitere Coroutine zur anschließenden Korrektur der Position, da das Ergebnis der Rotationsbewegung im Animator nur eine Annäherung auf den eigentlichen Wert ist.

Vielleicht kannst Du damit etwas anfangen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja nen bissl Transferleistung ist schon erforderlich. Hätte mich überrascht wenn mein Code bei Dir läuft ... 

Grundsätzlich sollte die Coroutine gehen mit leichten Anpassungen:

1. Animator ist die Referenz auf den Mechanim Animator den ich im Start Teil des Skriplets mit GetComponent abfrage und als Member sicher.

2. Du musst schon den Namen Deines AnimationState oder Trees abfragen. Der 2te Fehler sollte sich mit der Animator Referenz erledigen.

3.Den letzten Fehler kannst Du streichen da Du den Member nicht hast und nicht benötigst.

Schau Dir bitte in der API an wie Du die Coroutine aufrufst. Habe grad den Code nicht zur Hand ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Unity hat seit nicht allzu langer Zeit einige praktische "YieldInstructions", die das ganze etwas hübscher machen können.

public void DoStuff()
{
  StartCoroutine(DoStuffCoroutine());
}

private IEnumerator DoStuffCoroutine()
{
  StartAnimation();
  yield return new WaitWhile(() => AnimationIsPlaying());
  SwitchLevel();
}

Mit WaitWhile und WaitUntil kann man sich wunderbar die Schleifen sparen.

StartAnimation(), AnimationIsPlaying() und SwitchLevel() sind hier natürlich Platzhalter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Einfach ein Animationsevent ans Ende der Animation setzen und darüber eine Methode aufrufen die dein Szenenwechsel freigibt ...

Möchte man größere Geschütze auffahren, dann kann man auch ein State Maschine Behaviour an den Animationsstate anhängen:
https://unity3d.com/de/learn/tutorials/modules/beginner/5-pre-order-beta/state-machine-behaviours

siehe OnStateExit()

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb Ich:

Ok und was sollte ich jetzt anstatt  StartAnimation(), AnimationIsPlaying() und SwitchLevel() eingeben ? :D 

Wie gesagt "Ich habe nicht viel Erfahrung mit Unity" :)

Na, dann würde ich mit ein paar Tutorials anfangen, z.B. das über Mecanim-Animationen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...