Jump to content
Unity Insider Forum

Script zwischen Animator States


Jatoll
 Share

Recommended Posts

Hallo, ich versuche gerade Animationen mit Zwischenschritten hinzubekommen.

Kurzgesagt: Von meinem Anystate Knoten geht es immer in die entsprechende Animation, je nachdem welche gerade getriggert wird. Das mache ich über Bools. Jetzt hab ich aber ein paar Animationen bei denen sich das Kerlchen vorher hinsetzen soll und hab quasi einen Zwischen-State eingebaut. Dann hab ich aber das Problem, dass dauernd dieser Zwischenstate von Anystate angesteuert wird, sobald ich mich im Knoten dahinter (also der eigentlichen Sitzanimation) befinde.

[Anystate] -- Sitzen bleiben True --> [Hinsetzen] -- Sitzen bleiben True --> [Sitz-Animation]

Jetzt dachte ich mir, dass ich ein Script bei [Hinsetzen] als behavior mitgebe, aber ich versteh nicht wie ich da jetzt auf die Bools zugreifen kann.

Oder gibt es da eine bessere Methode?

Link to comment
Share on other sites

Hi!

Anystate ist für dein Vorhaben nicht gut. Anystate bedeutet ja, dass über diesen Pfad eine Animation gestartet werden soll, egal welche Animation gerade ausgeführt wird.
Das würde z.B. Sinn machen, wenn in die Idle Animation gesprungen werden soll. Also egal, ob man gerade läuft, geht, tanzt oder schießt.
Man kann zwar auch beim Anystate mehrere Bedingungen verknüpfen, aber eigentlich sind Animationen ja fortlaufend, so wie bei dir.
Man muss sich ja erst hinsetzen, bevor man sitzen tut. Und wenn man dann sitzt, kann man nicht sofort laufen, denn man muss zuerste wieder aufstehen.
Also sind die Transitions meistens von einer Animation zur nächsten, wie in einer Kette, aufgebaut.

Dann ist es wichtig den richtigen Parametertyp zu wählen. Man kann zwar fast immer boolsche Typen nehmen, aber die muss man dann auch immer wieder zurücksetzen.
Ein guter Weg ist es die boolschen Typen als obersten Zustand zu nutzen. Z.B. wenn du bei der Bewegung zwischen laufend, gehend oder hockend unterscheidest. Oder aber du hast unterschiedliche Animationsbereiche, je nachdem welche Waffe oder welches Werkzeug dein Player in der Hand hat.
Du kannst das natürlich so machen, wie es dir am besten gefällt. Ob Trigger oder bool. Beide haben Vor- und Nachteile.

Wenn du von Anystate her kommst, bietet sich der Trigger-Typ an. Den setzt man einmalig und er setzt sich selbst zurück. Steht also nicht dauernd an wie eine bool.
Wenn du nur eine Bool nutzen willst, kannst du nicht von Anystate gehen, dann muss die Transition von einer anderen Animation wie z.B. die Idle Animation her kommen, weil eben sonst genau das passiert, was du da erlebst.

Wenn Trigger "hinsetzen" gesetzt wurde oder die Bool "sitzen" true ist, wird die Hinsetzen-Animation abgespielt. Von dieser Animation geht es automatisch, also nach Ablauf der Animationszeit, zur Sitzen-Animation. Also stellst du bei der Transition "Has Exittime" an und stellst den Wert auf 1. Die Sitzen-Animation ist dann wahrscheinlich auf loop gestellt, die über eine andere Bedingung beendet wird. Hier dann "HasExittime" ausschalten.
Wenn dann die Bool "sitzen" auf false geschaltet wird oder der Trigger "aufstehen" gesetzt wurde geht es zur Aufsteh-Animation, die wieder abläuft und automatisch zur Idle Animation geht.

 

 

 

Link to comment
Share on other sites

Ok, also macht es mehr Sinn wenn ich das Anystate weg lasse und dann quasi in der Mitte einen "Übergangsstate" habe, der praktisch nix macht außer als "Flur" quasi zu den jeweiligen Animationen zu dienen? Und dann halt immer hin und her verschalten und mit bools das ganze dann ein und ausschalten?

Ich weiß noch nicht so ganz wann trigger besser wären. Also ich weiß was sie machen, aber bin mir noch nicht sicher wann sich besser sind in meinem Fall.

Link to comment
Share on other sites

Anystate ist immer dann gut, wenn du unbedingt eine Animation ändern musst, egal wo der Animator gerade rum macht.
Bei den UI Buttons ist das z.B. immer über Anystate gelöst. Da soll ja ein Button sofort animiert werden, sobald die Maus da drüber ist oder geklickt wird.

Interessant wird Anystate dann auch, wenn du mit mehreren Layern arbeites, also zusätzliche Teilanimationen zu den Grundanimationen hinzu mischt. Z.B. wenn ein Player wärend des Laufens von einer Kugel getroffen wird und diesen Hit sofort mit einer Animation darstellen soll.

Ich habe früher, als es noch keine Trigger gab, auch alles mit boolschen Typen gelöst. Der Vorteil dabei ist, dass die Variable immer wieder im Code gesetzt werden kann, weil sie ja true oder false ist. Und wenn sie true ist, bleibt sie true, egal wie oft du die nochmal true setzt. Nur, dann musst du die auch irgendwie zurück setzen. Problematisch wird es dann, wenn eine Animation nur einmal angestupst werden soll. Dann musst du entweder im Code nach kurzer Zeit das Dingen wieder auf false setzen, oder aber du baust dir ein Event in die Animationen ein, über den dann in eine Methode gesprungen wird die das Rücksetzen tut.
Da ist der Trigger natürlich viel besser, weil er sich selber zurücksetzt.

Du hast also 2 unterschiedliche Arten den Animator zu bestücken.
Beispiel für einen Player der von Idle zu Walk und wieder zurück zu Idle animiert werden soll:
Bei der boolschen Art gehst du in die geloopte Walkanimation rein, sobald die Variable true ist. Dort bleibt der Animator dann bis diese Variable wieder false ist.
Idle -(wenn true) -> walk -(wenn false) -> Idle

Bei der Trigger Art brauchst du 2 Variablen. Wenn der Trigger Walk kommt, gehts in die Walk, wenn Trigger Idle kommt gehts zurück in die Idle.
Idle -(trigger walk) -> walk -(trigger idle) -> idle

Für hin und zurück brauchst du also doppelt so viele Parameter. Du kannst den Trigger Idle aber auch bei anderen States nutzen. Der Player hat ja vielleicht ganz viel Tätigkeiten, die alle mit dem Trigger Idle beendet werden können.

Ich persönlich vermische die Arten und nutze alles was für meine Zwecke gut ist. Im Entwicklungsprozess wird dann auch germe mal umgestellt, weil ein anderer Weg dann doch praktischer ist. So ist das! Man kann selten zu Beginn sagen was der richtige Weg sein wird.

Du wirst deinen Weg finden! :)

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...