Jump to content
Unity Insider Forum

2 Animationen gleichzeitig abspielen


SyntaxTalkstoMe

Recommended Posts

Nein, den Avatar brauchst du nur wenn Menschen animieren willst. Im Avatar ist dann festgelegt, welche Bones für welchen Bereich stehen und noch einiges mehr.
Für alles Andere lässt man den Slot einfach leer.

Aber jetzt mal zum Problem:

Es gibt da eine Sache, die man sich verinnerlichen muss. Wenn man mehrere Objektanimationen mit einem einzigen Befehl steuern will, kann man das nicht mit 2 unterschiedlichen Animationen in einem Layer tun. Das Problem ist nämlich, dass der Animator nur einen Weg gehen kann. Er kann nicht gleichzeitig in 2 unterschiedlichen States sein.
Wie man aber unterschiedliche Objekte gleichzeitig animiert, kann ich dir mal mit Bildern aus der Praxis zeigen.

Als Erstes habe ich einen Brunnen, der gleichzeitig den Pumpenhebel, den Eimer und den Wasserstrahl animiert. Dafür nutze ich einen einzigen Parameter und einen einzigen Layer.
Ich habe aber in der Amination alle Objekte gleichzeitig animiert. Das geht, wenn das alles Kinder eines Vaterobjektes sind.
507511774_3objekteeinbefehl.JPG.d7fab407d922f5a849b33da2ab59e772.JPG

Sowas funktioniert natürlich nur, wenn alle Objekte als Ganzes eine Gewisse Animation absipelen sollen. Sollte sich der Eimer mal bewegen und mal nicht, brauchst du einen zusätzlichen Parameter und einen zusätzliche Animation, die aber wieder alle Objekte darin animiert hat.

Wenn du aber jetzt für jedes Objekt eigene Animationsspuren erzeugt hast und diese Objekte auf die gleichen Parameter hören, dann musst du mit Layern arbeiten.
Hier wieder ein Praxisbeispiel:

1031235878_vielelayervieleobjekte1.thumb.JPG.e0a1fcd9d5020409b37f65632193cdd4.JPG


Diese Blume ist wieder ein Vaterobjekt. Dieses Mal sind viele Unterobjekte da, die Animiert werden. Alle werden über einen einzigen Parameter animiert, können aber auch unterschiedliche Parameter bekommen. Das Vaterobjekt hat wieder den Animator drauf und auch das SteuerScript.

Du siehst bei diesem Bild jetzt 3 Animationslayer. Stengel, Blüten und Blätter. Der Blütenlayer ist gerade sichtbar und unten in der Animation siehst du dass gleichzeitig 16 Blütenblätter animiert werden.

Hier im 2. Bild siehst du den Stengel-Layer, der weniger Animationen hat, als die Blütenblätter.

1005776426_vielelayervieleobjekte2.JPG.a666e691ada864bcf2a0f5dfd8164523.JPG

Aber auch dieser Layer nutzt den gleichen Parameter um von einer Animation zur anderen zu kommen.

Und jetzt im 3. Bild siehst du die Paramter. Es ist zwar jetzt der Blätterlayer ausgewählt, aber das ist egal, denn die Parameter sind überall die Selben:

891095381_vielelayervieleobjekte3.JPG.1ed410200f33e270e4ece7da50026ade.JPG

Wie du bei der Transition sehen kannst, wird von raus2 nach raus3 geblendet, wenn der Paramater "status" größer als 3 ist.
Diesen Parameter nutze ich bei allen Layern. Die anderen boolschen Parameter benutze ich gar nicht mehr. Ich musste selber ersteinmal schauen, was der beste Weg ist, und da war das bollsche dann doch zu kompliziert aufzubauen.

Aber wie gesagt, alle Layer teilen sich die Parameter und jetzt können unterschiedliche Animationen mit ein und dem selben Parameter gesteuert werden. Und in jedem einzelnen Layer können die States unterschiedlich verknüpft sein. So ist das auch bei meiner Blume. Solange die Blume wächst, werden die Blätter, der Stengel und die Blütenblätter gleichermaßen animiert. Die Blume kann aber auch welken. Und ab da werden nurn noch die Blütenblätter animiert.

Also nocheinmal:
Es ist nicht möglich 2 unterschiedliche Animationen in einem Layer mit einem Parameter zu steuern. Denn wenn der Animatior in State1 ist und zu State2 und zu State3 jeweils eine Transition hat, die auf z.B. "sprung" hört, dann kann nur einer dieser 2 Wege genommen werden. Entweder zu State2 oder zu State3!!! Welcher das ist, ist genauso zufällig, wie welche Update Funktion zuerst genommen wird.

Wenn du unterschiedliche Objekte gleichzeitig animieren willst, die aber immer im Verbund sind (wie bei meinem Brunnen), dann empfiehlt es sich in den Animationen diese Objekte zusamm zu animieren.

Sollen mehrere Objekte gleichzeitig über einen Parameter gesteuert werden, aber jedes Objekt hat seine eigenen Animationen, dann arbeite mit Layern.

Und ganz klassisch kannst du natürlich auch jedem Objekt einen eigenen Animator geben und dann von einem Script aus ganz vielen Animatoren Parameterwerte übergeben.
Alles ist möglich!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal vielen Dank für den sehr ausführlichen Post Malzbie. Das hat viele Sachen geklärt. Hab es gleich mal archiviert :)

Und Sascha hat auch recht. Es handelt sich um ein ChildObjekt. Ich will einfach, dass eine Wolke entsteht, sobald der Charakter !Grounded ist und wieder verschwindet, wenn er am Boden läuft.

Ich stehe da vor 2 Herausforderungen. Hatte ich es über Layer gemacht, verdrängten sich beide Animationen (DIe vom Spieler und die Wolke) Sie wechselten sich beide ab mit dem abspielen ab.

Mache ich es über ein seperates Objekt, wie ich es eigentlich auch habe, auf dem auch ein Animator drauf ist,  spielt er die Animation überhaupt nicht ab. Ich habe beinahe die Vermutung, dass ich im Animator selbst was falsch mache.

 

Das Child "cloud", siehe Bild 1, ist einfach ein leeres GameObject mit dem Animator drauf, den man auch auf Bild 2 sieht.

SIehe Bild 2:

Ich dachte mir, ich erstelle einen "leeren" State, worauf er zurückspringt, wenn er am Boden läuft. Damit quasi keine Animation abgespielt wird. Und mit dem leeren State, habe ich dann die Wolke verbunden, mittels einem Trigger.

 

1.PNG

2.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm. Hattest du nicht gesagt, der reset sich selbst wieder, nachdem er abgespielt wurde? Hab ich wohl was falsch verstanden. 

 

Hier auch nochmal der Code:

 [SerializeField]
    public Animator cloudAnim;

 if (!dead && !gameOver && GameLogic.gameStartet)
        {
            if (permaRun && Grounded())
            {
                CharakterMove();
                anim.SetBool("run", true);
                
                rb2d.gravityScale = 3f;

                if (ps.isPlaying)
                {
                    ps.Stop();
                }

                if (!audioSource.isPlaying)
                {
                    audioSource.clip = runningSound;
                    audioSource.PlayOneShot(landing);
                }

            }
            if (permaRun && !Grounded())
            {
                CharakterMove();
                anim.SetBool("run", false);
           
                if (cloudAnim != null)
                {
                    cloudAnim.SetTrigger("clouding");
                    Debug.Log("WOLKE WIRD ABGESPIELT");
                }

                if (!ps.isPlaying)
                {
                    ps.Play();
                }

                if (!audioSource.isPlaying)
                {
                    audioSource.clip = fly;
                    audioSource.PlayOneShot(fly);
                }
                rb2d.gravityScale = 4;
            }
        }

 

 

UPDATE:

Hab es jetzt nochmal umgeändert mit dem Trigger. Also er springt defentiv in den State rein. Der Animator scheint sauber zu laufen. Aber warum sehe ich keine Grafik?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast da grundsätzliche Verständnisprobleme mit dem Animator.

Natürlich setzt sich der Trigger von alleine zurück. Er bleibt also nicht stehen wie ein boolscher Parameter, den du per script wieder den anderen Zustand geben musst.

Totzdem braucht der Animator jetzt eine Bedingung um wieder zum Empty zurück zu kommen. Denn nur dann wenn der empty State gerade am laufen ist, kann auch zum Cloudmage State geblendet werden.

Wenn deine Wolke jetzt eine loopende Animation ist, wovon ich ausgehe, und die soll sich solange animieren, wie der Player in der Luft ist, dann ist ein boolscher Parameter wohl die bessere Wahl.

Sobald du nicht mehr grounded bist, setzt du den Parameter mit SetBool("xy", true);  Und wenn du wieder grounded bist setzt du mit SetBool("xy", false); den Parameter xy wieder auf false.
Du machst eine Transition von Empty zu Cloudmage und stellst da die Bedingung xy = true ein.
Ja und dann machst du eine Transition von Cloudmage zu Empty und stellst da die Bedingung xy= false ein.
 

Wenn jetzt der empty state aktiv ist und die xy wird true, dann wechselt der Animator zur Cloudanimation. Diese Animation bleibt solange aktiv bis xy wieder false ist, erst jetzt wechselt er zu empty. Denn das ist die einzige Bedingung, die ihn dazu bringt zu wechseln. Ja und in Empty bleibt er solange, bis  xy irgendwann mal wieder true ist.
Es ist komplett egal, ob eine Animation loopt oder nicht. Der Animator reagiert nur auf die eingestellten Bedingungen die von der momentan aktiven Animation weg gehen. Gibt es von dieser Animation keine Transition also auch keine Bedingung auf die er hört, dann macht der auch nichts und bleibt bis zum Ende da drin.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Alles klar. ICh hatte vorher noch nie mit Trigger gearbeitet außer bei Kollsionen.

Sascha hatte nur geschrieben:

Zitat

Das würd ich lassen. Der Witz am Trigger ist, dass er von alleine sofort wieder ausgeht. ResetTrigger ist mit ziemlicher Sicherheit nur für komische Sonderfälle gedacht.

Von daher dachte ich, es funktioniert irgendwie anders wie mit SetBool. 

Ok, dann werde ich die Trigger auf Bools wieder abändern. Moment.. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich muss grad tief durchatmen.

Also....

Es funktioniert:

Die Transitions, die States, er springt brav in die If Bedingungen. Es funktioniert alles. 

Warum zum Geier wird da kein Bild abgespielt????????? Das war sonst auch nie der Fall.

Ich habe die einzelnen Bilderframes einer Wolke. Die markiere ich alle. Dann ziehe ich sie in die Scene. Er fordert mich auf einen Namen für die Animatiion einzugeben. Voila. Ich habe meine Animation.

 

Ich erstelle ein leeres GameObject. Setze einen Animator drauf. In den Animator mache ich den Controller von der Wolkenanimation. Ich öffne den Animator. Ich setze als State die Animation rein. Füge die Transitions hinzu und den bool Parameter.

Im Code schreibe ich  Animator.SetBool("State", true).  Er tut was ich sage.  Aber warum keine Grafik??????

Mein Character Modell mit seinen verschiedenen States werden doch auch angezeigt??? Warum gerade die jetzt nicht??

 

Ich mach evtl paar Tage Pause und guck es mir nochmal an. Evlt seh ich den Wald vor lauter Bäumen nicht mehr.

 

 

Hab grad zum Spaß mal dieses GameObject  au0erhalb des Characters gezogen in der Hierarchy.

So sieht es aus, wenn die Animation abgespielt wird.

 

 

3.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das wurmt mich. Ich kann nicht pausieren

ICh hab mir das alles nochmal Schritt für Schritt angeschaut. Und da ist mir dasß da aufgefallen, als ich mir die Animation angeschaut hatte:

4.PNG

ICh habe schon angefangen selbst an mir zu zweifeln und mich zu fragen, was ich die ganze Zeit gemacht hatte. 

Beinhaltet nicht das AnimationsFile  die Sprites für die Animation selbst? 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok.

Ich habe jetzt das Wolken Prefab einfach als Child dem Charakter hinzgefügt. Dummerweise läuft die Animation dann ja immer. Aber eigentlich ist es ja nichts anderes wie der Character. Den sieht man ja auch immer. Er nimmt nur verschiedene States an.

Die Wolke einfach aus dem nichts anzeigen zu lassen mittels dem Animator bin ich offenbar zu blöd dazu.

Jetzt hats mir gereicht und hab einfach das Sprite von der Animation deaktiviert wenn er grounded ist. Das klappt. Wenn das jetzt im Hintergrund vor sich hin animiert ist mir das auch ladde. Obwohl es funktioniert, bin ich nicht zufrieden mit der Lösung. Aber bin mit meinem Latein am Ende.

Offenbar mach ich irgendwas fundamentales falsch, dass er die Animation nicht anzeigt. 

Der Code, alles funktioniert. Der Fehler muss irgendwo bei der Grafik sein.

Hab es jetzt aber so:

1.PNG

3.PNG

4.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...