Jump to content
Unity Insider Forum
Sign in to follow this  
Deadfish

Animator

Recommended Posts

Guten Tag habe ihr schon, ne menge über das Thema Animation und Animator gelesen.
aber eine Sache finde ich nicht genau ich nutze diesen Code
 

anim.SetBool("IsSwing",true);

um meine Axt soll Schwingen Angreifen wie man es nimmt aber die Animation endet immer unterschiedlich nie wie sie Angefangen hat.
Als Beispiel meine ich
Start ---- Rotation---schwing---zurück zum Start
bei jeden 3 bis 4ten mal macht er aber
start--Rotation--schwing
und bleibt am halben weg zurück stehen, weil er meint Animation beendet.

Kann ich Ihn sagen er soll erst zu Idle zurück wenn die Animation im Animator komplett beendet wurde ?

Achso und kann man Ihn sagen,wenn er Animation Attack Abspielen , soll er Idle verlassen auch wenn die Animation noch nicht ganz durch ist Idle
ist bei mir die Axt bewegt sich etwas hin und her.

Share this post


Link to post
Share on other sites

Das stellst du in den Transitions ein. Es gibt, wenn du die zurück Transuition mal anklickst, im Inspector einen Haken für "Has Exit Time". Das bedeutet, dass die Animation bis zum Ende abgespielt wird und nicht sofort in die neue Animation überblendet, wenn die Bedingung für die Transition erfüllt ist.

Z.B.: Von Idle auf Swing geht es, wenn IsSwing = true ist. Von Swing zurück auf Idle geht es wenn isSwing = false ist. Ohne Exittime wird sofort in dem Moment von Swing nach Idle geblendet. Mit Extittime tut sie das erst wenn Swing abgearbeitet ist.
Wenn du die Exittime nutzt, dann brauchst du auch gar keine Bedingung um über eine Transition zu eine andere Animation zu kommen. Ohne Bedingung würde die Animation genau einmal abgespielt werden und dann zur anderen Animation gehen ( die du ja über die Transition ausgweählt hast).
Beides, also eine Bedingung und einen Haken bei Exittime, ist dann sinnvoll, wenn deine Animation auf loop gestellt ist, du aber immer nur am Ende der Animation überblenden willst. Das könnte bei einer Geh Animation sinnvoll sein.
Hier wäre es so, dass z.B. die Geh-Animation gerade einmal gespielt wurde und schon wieder von vorne anfängt, als die Bedingung (Geh = False) eingetreten ist. Jetzt wird trotzdem solange gewartet, bis die Animation ans Ende gekommen ist und erst dann übergeblendet. Manchmal ist das gut, manchmal ist das schlecht. Das kommt immer auf die Umstände und deine Animationen an.

Du kannst auch mehrere Transitions von Anim A nach Anim B erstellen. Wenn du das machst, hast du 3 Pfeile auf deinem Transition Weg, anstatt einem. Klickst du jetzt die Transition an, kannst du im Inspector ganz oben eine Auswahl sehen. Jede einzelne Transition kann unterschiedliche Bedingungen haben um ausgeführt zu werden. In der einen kann Exitttime drin sein, in der anderen nicht.  

  • Like 2

Share this post


Link to post
Share on other sites

Okay danke das hat mir etwas geholfen, nur leider ist der Hacken bei IsSwing false gesetzt bei idle habe ich ihn entfernt.
trotzdem bleibt die Axt manchmal im Game stehen und ich kann von der Position weiter schlagen.

Habe ich im Code etwas Falsch gemacht ?
 

	void Update () {


		if (canSwing == true) {

			if (Input.GetMouseButtonDown (0)) {
				isSwinging = true;
				canSwing = false;
				Anim.SetBool ("IsSwingAttack", true);

			} else {
				Anim.SetBool ("IsSwingAttack", false);
			}
		}
		if(canSwing == false)
		{
			swingTimer -= Time.deltaTime;
		}

		if(swingTimer <= 0)
		{
			swingTimer = 1;
			canSwing = true;
			isSwinging = false;
			Anim.SetBool("IsSwingAttack",false);
		}
	
	}

 

Share this post


Link to post
Share on other sites

Du hast als beim Schwingen keine Exittime, wenn ich dich richtig verstanden habe. Ja dann kann natürlich die Steuervariable dafür sorgen, dass sofort zur anderen Animation geblendet wird. Dass der Arm in einer seltsamen Pose stehen bleibt, kann daran liegen, dass in der anderen Animation keine Info für die Position des Armes da ist. Wenn das System nicht weiß wo es hin blenden soll, gibt es auch kein Überblenden.

Da ich außerdem nicht weiß, wie deine Transition vom Swing zur anderen Animation aussieht, kann ich da nur raten oder vermuten. Hier wäre mal ein kleins Bild nicht schlecht. ;)
 

In deinem Code machst du etwas, was ich nicht ganz verstehe. Ich gehe da jetzt natürlich davon aus, dass IsSwingAttack in beiden Transitions abgefragt wird. Hin zur Anim, wenn true. Weg von der Anim wenn false.
Du nutzt eine Art Cooldown, damit du nicht ständig schwingen kannst und steuerst dass über den swingTimer und der canSwing Varable.
Sobald canSwing true ist, kann über den Button die isSwingAttack Variable auf true gesetzt werden, was wahrscheinlich für die Transition genutzt wird, also wenn true dann starte die Animation. Jetzt bleibt das so lange auf true, bis dein Timer abgelaufen ist. Dann wird die Variable wieder auf false gesetzt. Dies könnte dann für die Transition zurück zum Idle genutzt werden.
Oben bei der ButtonAbfrage hast du in der else auch das Rücksetzten der Variable drin. Das ist doppelt gemoppelt mit dem Rücksetzen beim Timer.
Du nutzt die Variable isSwinging die aber in diesem Code hier nie abgefragt wird. Sie wird einfach nur auf true oder false gesetzt. Vielleicht fragst du die ja woanders ab. Wenn nicht, dann brauchst du die auch nicht.

Soviel zum Code.

Jetzt kommt es darauf an, ob deine Swing Animation unterbrochen werden darf oder immer bis zum Ende ablaufen soll.
Wenn man sie unterbrechen kann, musst du die isSwingAttack Variable auf den Zustand false abfragen und die Transition darf kein HasExitTime haben.
Soll sie nicht unterbrochen werden können, dann setzt du den HasExitTime Haken rein fragst aber keine weitere Variable ab. Die isSwingAttack Variable nutzt du wirklich nur um die Animation zu starten. Sie kann danach sofort wieder auf false gesetzt werden. Am einfachsten nutzt du jetzt anstatt einer Boolschen Variable einen Trigger.
https://docs.unity3d.com/ScriptReference/Animator.SetTrigger.html

Also Anim.SetTrigger("isSwingAttack");
Oder du setzt die boolsche Variable selber innerhalb kurzer Zeit zurück oder lässt das über die Animation regeln. Dafür brauchst du dann ein Event in der Animation von dem aus du in eine public Methode in deinem Script rein springst.

Die Variable selber so lange anstehen zu lassen, bis die coldown Zeit abgelaufen ist, macht nur dann Sinn, wenn deine Animation loopt und über diese Variable auch unterbrochen werden soll.
 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×