2016-06-23 4 views
0

Ich habe ein frustrierendes Problem mit Animationen. Ich habe eine Laichplattform, der ich Animationen beigefügt habe, und ich möchte die Plattform von ihrer ORIGINAL Y POSITION einmal wenn ein Spieler-Objekt landet, unten bleiben, während der Spieler darauf sitzt, dann zurück bewegen bis zur ursprünglichen Position, wenn der Spieler die Kollision beendet (dh abspringt).Unity, C# - kann das Objekt bei der Kollision nicht EINMALIG von der aktuellen y-Position wegfahren?

Ich habe meine Hoch- und Runteranimationen erstellt und beide auf ONCE mit dem Animation-Fenster eingestellt. Ich zog dann die Plattform zu meinem Projekt, um es zu einem Prefab zu machen, und steckte es wieder in mein Spawn-Skript.

Wenn der Spieler kollidiert (landet auf der Plattform), nenne ich die Nach-unten-Animation hier:

void OnCollisionEnter (Collision col) { 
     GameObject platform = col.gameObject; 

     //platform.GetComponent<Animation>().Play ("down1"); 
     if (!playedAnim1) { 
      platform.GetComponent<Animation>().Play ("down1"); 

      playedAnim1 = true; 
     } 
     touchingPlatform = true; 
     Debug.Log ("entering platform"); 
    } 

    void OnCollisionExit (Collision col) { 
     playedAnim1 = false; 
     GameObject platform = col.gameObject; 
     //platform.SetActive (false); 
     //platform.transform.position += new Vector3 (0f, -1f, 0f); 
     //platform.GetComponent<Animation>().Play ("up1"); 

     touchingPlatform = false; 
     Debug.Log ("exiting platform"); 
    } 

die Animation nur einmal spielen zu machen, habe ich ein boolesches Flag playedAnim1 genannt. Ich würde denken, das würde die Animation nur einmal spielen lassen, aber wenn der Spieler auf der Plattform landet, wird er mehrmals gespielt. Es ist so, als wenn der Spieler auf der Plattform landet, die Plattform bewegt sich nach oben statt nach unten, obwohl die Animation korrekt ist.

Ich habe versucht, nur die col.transform.position direkt ändern, aber das funktioniert auch nicht. Wie kann ich die Plattform nach unten bewegen und dort bleiben, wenn der Spieler darauf landet, und zurückfahren, wenn er geht?

EDIT: Ich habe Übergänge hier verbunden, mit Down-> Idle unten auf Parameter Bool isDown zu True, Idle Down-> Up auf Bool IsDown zu False, Up -> Idle Up Parameter bool isUp zu True, Idle up -> Down bool isUp zu false.

enter image description here

Hier ist der Code Ive implementiert:

void OnCollisionEnter (Collision col) { 
     Debug.Log ("enter"); 
     col.gameObject.GetComponent<Animator>().SetBool ("isUp", false); 
     animUpSwitch = false; 
     if (!animDownSwitch) { 
      animDownSwitch = true; 
      col.gameObject.GetComponent<Animator>().SetBool ("isDown", true); 
      col.gameObject.GetComponent<Animator>().Play ("down"); 
     } 

     touchingPlatform = true; 
    } 

    void OnCollisionExit (Collision col) { 
     Debug.Log ("exit"); 
     animDownSwitch = false; 
     col.gameObject.GetComponent<Animator>().SetBool ("isDown", false); 

     if (!animUpSwitch) { 
      animUpSwitch = true; 
      col.gameObject.GetComponent<Animator>().SetBool ("isUp", true); 
      col.gameObject.GetComponent<Animator>().Play ("up"); 
     } 

     touchingPlatform = false; 
    } 

Und es ist immer noch auf und ab bewegt unkontrollierbar

Antwort

0

habe ich vier Clips für diese Art von Situation zu schaffen

  1. Move_Down
  2. Idle_Down
  3. move_up
  4. Idle_Up

ich Animator sagen move_down und nach dem Clip ich den Clip Übergang fertig zu spielen, muss es Idle_down wird es also im Grunde zu halten, es sei denn der Clip geändert wird. Wenn der Benutzer von der Plattform springt, spiele ich Move_Up und dasselbe wie vor dem Übergang in den Zustand Idle_Up im Animator nach dem Ende des vorherigen Clips. Der Animator spielt den gleichen Clip, es sei denn, Sie sagen ihm, er soll aufhören oder sich durch Code ändern. Die Leerlaufclips sind Extreme Y-Werte.

Ich benutze die oben genannten Schritte, weil sie sehr einfach zu implementieren sind, während Sie es mit nur zwei Clips arbeiten können, aber ich bevorzuge diese Methode.

So wird der Fluss

sein

Anim.spielen ("move_down") -> Übergang zu "Idle_Down"

, die sie machen nach unten gehen und dort bleiben , wenn Sie es zurückgeben möchten zurück

anim.play ("move_up „) -> Übergang zu‚Idle_Up‘

auch Sie kümmern Clip aus Mitte des Übergangs reanimating nehmen müssen, wenn der Spieler bewegt sich zur nächsten Plattform vor minY der Plattform zu erreichen.

Eine wichtige Sache, die Sie haben hier zu beachten ist, dass, wenn Sie zu versuchen werden Sie Positions- und Rotationswerte ändern von Transformations dann diesen Werten , wenn sie in dem Clip sind dann sollen Sie die Animation als Animator ausschalten Übersteigt die Position/Rotation Werte. Sie können die Animator Position/Rotation Werte in LateUpdate() überschreiben.

Ich hoffe, diese Information ist hilfreich für Sie.

+0

Vielen Dank. Wie kann ich zu einer Animation wechseln? Gibt es eine Möglichkeit, es in Code zu tun? – skyguy

+0

müssen Sie die Animationsclips in Animator hinzufügen. Nachdem Sie Clips erstellt haben, müssen Sie sie verwalten. Bist du zufällig Animator in der Einheit? Dann würde ich Ihnen vorschlagen, sich die Tutorials anzuschauen und durchzusehen. Es ist wirklich einfach zu implementieren. http://unity3d.com/learn/tutorials/topics/animation Die obige Seite enthält alle notwendigen Informationen. –

+0

Ok. Ich habe mehrere Tutorials dort und auf Youtube mit Animationsübergängen durchgespielt und denke, dass ich sie richtig implementiert habe, aber immer noch nicht den gewünschten Effekt erzielen kann. Ich habe meine Frage aktualisiert - brauche wirklich Hilfe. Es ist sehr schwierig hier zu finden – skyguy

Verwandte Themen