Jump to content
Unity Insider Forum

Animator Boolean dauerhaft aktiv


checkalord3

Recommended Posts

Guten Tag liebe Community,

Ich arbeite zwar schon etwas mit der Unity-Engine, aber noch nicht lange mit dem Animator. Ich habe es geschafft eine Animation, bzw. drei davon, auf einem Gameobject anzulegen. Nun habe ich einen Code aus dem Internet genommen, damit ich diese drei Animationen abspielen kann (Learning by doing). Ich habe ihn immer weiter umgewandelt, damit ich verstehe, wie es funktioniert. Das Problem ist nun, dass dieser Script anscheinend nicht von einem Profi geschrieben wurde, denn die Booleans (Paramater des Animators) werden niemals deaktiviert. Ich weiß nicht, ob jemand mein Problem versteht, aber vielleicht hilft mein Code:

#pragma strict

var animator : Animator;


function Start () {
    animator.enabled = true;
    animator.SetBool("Seite"false);
    animator.SetBool("Zahl"false);
    animator.SetBool("Kopf"false);
}

public function Knopf () {
var number = Random.Range(1,101);

    animator.SetBool("Seite"false);
    animator.SetBool("Zahl"false);
    animator.SetBool("Kopf"false);


if (number > 98) {

    animator.SetBool("Seite"true);
    animator.SetBool("Zahl"false);
    animator.SetBool("Kopf"false);    
    animator.enabled = true;
}    

if (number  >= 49 && number <= 98) {
    animator.SetBool("Seite"false);
    animator.SetBool("Zahl"true);
    animator.SetBool("Kopf"false);
    animator.enabled = true;
}

if (number >= 1 && number <= 48) {
    animator.SetBool("Seite"false);
    animator.SetBool("Zahl"false);
    animator.SetBool("Kopf"true);
    animator.enabled = true;
 
 }
}

 

Dieser Code soll den Coinflip darstellen. Immer wenn ich den Knopf drücke, welcher das Script aktiviert, wird der Boolean festgesetzt und nicht mehr deaktiviert. Somit kann die gleiche Animation niemals öfter als einmal hintereinander stattfinden. Beispiel

Es werden vier Zahlen erstellt:

1,99,75,57

Die 1 lässt den Coin so drehen, dass der Kopf nach oben zeigt.

Die 99 lässt den Coin so drehen, dass er auf der Seite liegt.

Die 75 lässt den Coin so drehen, dass er mit der Zahl nach oben liegt.

Die 57 tut das selbe wie die 75, aber da der Boolean immernoch aktiv ist, wird die Animation diesmal nicht aktiviert.

 

Grüße

Danke im voraus!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du hast das schon richtig erkannt. Wenn es keine Änderung in der Variable gibt oder gab, dann bleibt natürlich der Zustand erhalten.

Du musst als etwas einbauen, damit die Variable automatisch auf false gesetzt wird.

Das könntest du im Code machen, indem du z.B. nach einer gewissen Zeit die Variable wieder auf false setzt. Also kurz nachdem sie die Animation gestartet hat.
Oder aber du setzt irgendwo in den Animationen ein Event (das ist dieser senkrechte dicke Strich links neben der Animationsspur) der eine Funktion aufruft, in der dann diese Variable zurück gesetzt wird. ( Diese Funktion muss in einem Script sein, welches auch auf dem Objekt mit der Animator Komponente ist)
Am besten sollte jede einzelne Animation dann eine Transition zu einem Empty State haben, in der keine andere Animation gestartet wird. Dieses State dient nur als Startpunkt für all die Animationen die du hast.
Eine Variable ist auf true und es wird über eine Transition in die entsprechende Animation geblendet. Am Ende dieser Animation wird das Event aufgerufen, was die Variable wieder auf false setzt. oder aber die Variable wurde vorher schon im Code auf false gesetzt. Nach dem Ende der Animation (Haken bei"Has Exit Time") geht es über die Transition wieder zum Empty State. Egal welche Variable dann true ist, es wird wieder zur richtigen Animation geblendet .

 

Ach so: Willkommen im Forum! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Stimmt! Den gibt's ja jetzt auch! :D

In diesem Beispiel hier, würde das auch gut funktionieren. Nachteil beim Trigger ist leider, dass die Animation eine Exittime haben muss, um von "alleine" in einen neutralen State zurück zu kommen. Wenn man dann über eine Zusatzbedingung in einen anderen State kommen will, blendet die Animation wegen der Extittime erst über, wenn sie ihr Ende erreicht hat und dass kann unschön aussehen. Aber das ist halt immer eine Frage wie man die Logik im Animator umsetzen will oder welcher Aufbau einem persönlich am meisten liegt. Hier ist der Trigger jedenfalls eine gute Lösung.

Ich nutze gerne die Events, weil ich darüber dem Code einfach und unkompliziert sagen kann, dass die Animation oder eben ein gewisser Teil davon jetzt fertig ist. Die Exittime ist bei mir fast nie an, da ich zum einen selbst entscheiden will wann eine Animation fertig ist und außerdem viele Animationen geloopt sind. Aber das nur so am Rande. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klingt beides sehr logisch, aber ich habe mich jetzt für die Script Variante entschieden. Jetzt versteh ich aber nicht, wieso die Animation immer noch aktiv ist. Sobald die Animation fertig ist, ist der "Ladebalken", der anzeigt wie weit die Animation ist, immer noch da (der blaue Balken). Es muss doch eine Stop Funktion geben, die genau das verhindert, bzw. die Animation komplett abschließt, damit die Animation mehrmals hintereinander aufgerufen werden kann.

Ich habe nun ein Event ganz am Schluss der Animationen gesetzt und ein neues JS Script angefangen. Der Script:

#pragma strict

var animator : Animator;

function Aus () {
    animator.enabled = false;
    animator.SetBool("Seite"false);
    animator.SetBool("Zahl"false);
    animator.SetBool("Kopf"false);
    print("Aus");
}


Damit sollen die Bools deaktiviert werden. Soweit so gut. Starte ich das ganze per Knopfdruck, wird der Aktive Bool am Schluss der Animation auf false gesetzt => passt.

Kommt jetzt aber nochmal der gleiche Bool, wird der Bool aktiviert, aber die Animation nicht nochmal gestartet.

 

Beispiel:

Vor Knopfdruck

Bool:
Zahl         X
Kopf        X
Seite       X

Während Knopfdruck

Bool:
Zahl         X
Kopf        X
Seite       Aktiv

1. Klick ---> Seite

Animation startet

Animation endet -> Bool alle deaktiviert

Vor Knopfdruck

Bool:
Zahl         X
Kopf        X
Seite       X

Während Knopfdruck

Bool:
Zahl         X
Kopf        Aktiv
Seite       X

2. ---> Kopf

Animation startet

Animation endet -> Bool alle deaktiviert

Vor Knopfdruck

Bool:
Zahl         X
Kopf        X
Seite       X

Während Knopfdruck

Bool:
Zahl         X
Kopf        Aktiv
Seite       X

 

3. ---> Kopf

Animation startet schon nicht -> Kein deaktivieren der Bools

Bool:
Zahl         X
Kopf        Aktiv
Seite       X

Fazit:

Obwohl der Bool deaktiviert wurde, ist wohl die Animation "Kopf" immer noch aktiv und kann so nicht 2x hintereinander gestartet werden

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja du brauchst ne Transition zu einem anderen State.

Von irgendwo geht es ja hin zur Animation. Da sollte es auch wieder zurück gehen. Also einen Pfeil zur Animation (Bedingung dass bool true ist), und einen zurück. Beim Zurück entweder keine Bedingung, dann aber Exittime bei der Animation anhaken. Oder aber mit Bedingung, wobei du dir dann aussuchen kannst ob die Exittime genutzt wird.

Du brauchst in deinem Setup eine Transition, die aktiviert wird, wenn die Bool auf false steht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Stunden schrieb malzbie:

Eine Variable ist auf true und es wird über eine Transition in die entsprechende Animation geblendet. Am Ende dieser Animation wird das Event aufgerufen, was die Variable wieder auf false setzt. oder aber die Variable wurde vorher schon im Code auf false gesetzt. Nach dem Ende der Animation (Haken bei"Has Exit Time") geht es über die Transition wieder zum Empty State. Egal welche Variable dann true ist, es wird wieder zur richtigen Animation geblendet .

 

Ach so: Willkommen im Forum! :)

Genau diesen Teil versteh ich aber nicht.

Ich habe 3 Animationen. Also habe ich diese im Dreieck angeordnet und jedes mit jedem verbunden. Jeweils hin und zurück.

Also:

vom Entry zur 1. Animation. Von der 1. Animation zur 2. und 3. und jeweils zurück.

Wo genau soll ich jetzt Has Exit Time einsetzen?

 

PS: Danke fürs Willkommen heißen ;)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mach mal einen Stern. In der Mitte erstellst du ein Empty State und klickst mit rechts drauf um ihn zum Default state zu machen.

Jetzt gehst du von diesem empty auf alle 3 Animationen. Jewils mit der Transition dass die dazugehörige bool true sein soll.

Von diesen Animationen, das sind ja auch States, machst du jetzt auch je eine Transition zum Empty State. Und da stellst du jeweils ein, dass die entsprechende Bool, die ja vorher auf true war, jetzt false sein soll, um über die Transition wieder zum Empty zu kommen.

Bei den Transitions siehst du ja auch dann das Überblenden, also diese blauen Balken, und da drüber ist ein Kästchen wo "Has Exit Time" dabei steht.
Wenn das angehakt ist, dann wartet die Transition so lange, bis sie zum anderen State blendet, bis die Animation am Ende angekommen ist. Ist der Haken nicht gesetzt, wird sofort, sobald die Variable auf false ist, übergeblendet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich versteh das ganze Konzept irgendwie nicht. Die Transitionen gehen zwar zu den States, aber am Ende nicht zurück zu Empty State. Entweder bin ich inkompetent oder das Programm will mich ärgern. Hätte jemand zufällig ein Video parat, welches mir dieses Beispiel verstärkt demonstriert?

Wäre sehr nett.

 

Ich kann auch ein Video machen, wenn ihr mein Zeugs überarbeiten wollt und meine Fehler finden wollt. Aber das wäre halt etwas Arbeit ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe es genau so gemacht, wie in dem Video gezeigt. Ich bin das Video 3 mal durchgegangen. Leider bleibt die Animation weiterhin hängen. Ich habe jetzt einfach mal ein Video gedreht, damit ihr versteht, was ich meine. Ich weiß nicht, wieso die erste Animation immer funktioniert, aber dann die nächste hängen bleibt. Das ist mir ein Rätsel.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Tja... einen logischen Fehler sehe ich jetzt nicht. Und jedes Mal, wenn die Animation gestartet wird, kommt sie auch zum Event, denn sonst würdest du ja nicht deine Meldungen in der Konsole bekommen. Es scheint fast so, als wäre die Animation nach dem ersten Durchlauf irgendwie immer noch am Ende der Spur und somit direkt beim Event.

Zwei Sachen kannst du nochmal durchgehen. Schau mal ob der AnimationTake auf Loop steht und wenn ja dann mach den Haken mal weg. Und dann lass mal das Animator Enablen und Disablen weg. Ich sehe keinen Sinn darin, den Animator ständig ein- und auszuschalten. Vielleicht ist dieses Dekativieren das Problem, weil er dann nicht sauber abarbeiten kann.

Das sind aber nur Vermutungen, denn ich habe jetzt nix getestet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist, dass das Event zweimal aktiviert wird! Wieso, dass weiß ich nicht. Das Event ist so gelegt, dass es nur am Schluss der Animation startet, aber immer wenn ich zum 2. mal den Knopf drücke, wird das letzte Event nochmal aktiviert und dann startet erst die Animation des neuen Klicks.

Problemlösung:

Einfach die Transitions zurück auf Has Exit Time gestellt und einfach Enablen und disablen weg. Hat funktioniert, wieso auch immer. Vielen Dank für Eure starke Hilfe und Eure (dadurch) verlorene Zeit ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Falls ihr jetzt noch das Problem lösen könntet, dass das Event 2x ausgeführt wird, wäre das sehr hilfreich, da es stört.

 

Hab es durch zufälliges ausprobieren gelöst.^^ War einfach nur, dass ich das Event an den Anfang aller Animationen zu setzen. Leider kann ich jetzt nicht mehr die Funktionen nutzen, die ich am Schluss der Animation benutzen wollte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Event wird normalerweise echt nur einmal ausgeführt. Ich vermute dass es mit dem Disablen des Animators zusammen hängt.

Ich nutze die Events ständig und bei mir wird ein Event nie mehrmals ausgeführt.

Hast du das Disablen des Animators Testweise mal abgeschaltet?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...