Jump to content
Unity Insider Forum

Animationen werden nicht richtig abgespielt


Stefan.R2

Recommended Posts

Hi Leute!

Ich habe erst kürzlich (mit mäßiger Erfahrung in C#) mit der Spieleentwicklung auf Unity angefangen und bin nun vor folgendes Problem gestoßen:

Meine Figur soll hüpfen - tut sie auch, wenn ich die Animation über das AnimationFenster abspiele. Wenn ich die Animation allerdings über den Code abspielen möchte, wird die Animation zwar abgespielt, aber nicht vollständig...d.h. die Figur macht die von mir vorher eingestellte Hüpfbewegung, bewegt sich aber in y-Richtung kein Stückchen.(Die Arme und Beine werden aber korrekt wiedergegeben!!!) Ich habe bereits probiert, die fehlende Vertikalbewegung per Code zu erreichen - allerdings hat diese Methode die Figur hüpfen zu lassen keinen besonderen optischen Reiz^^

Ich hoffe jemand versteht mein Problem und kann mir einen (anfängergerechten erklärten) Tipp geben ;)

Lg:D

Stefan.R2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstens solltest du prüfen, ob bei deiner Animation beim Importer Rootmotion aktiviert ist. Die Rootmotion sorgt für die Bewegung in Y-Richtung (oder in XZ).
"Animations" => "Root Transform Postion (Y)" => "Bake into Pose" (kein Haken)  
Zusätzlich muss die Verwendung dieser Rootmotion noch in der Animatorkomponente gesetzt werden:
"Apply Root Motion" (Haken gesetzt)

Sollte das auch nicht helfen, könnte es auch sein, daß deine Animation keine Rootmotions besitzt. Dann kann man die Y-Bewegung tatsächlich nur per Code ergänzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort ;)

Ich habe noch eine Kleinigkeit vergessen: Es handelt sich um ein 2D Spiel...Der Haken bei Apply Root Motion ist gesetzt...Allerdings "Bake into Pose" habe ich jetzt nirgends gefunden.

Könntest du das bitte nochmal genauer erklären?...für mich die Idiotenversion :P

Lg :D

Stefan.R2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe jetzt noch herausgefunden, dass man das Problem per Code mit dem Befehl "Rigidbody2D.AddForce(Vector2);" lösen könnte....jedoch tut sich hier ebenfalls nichts...mein Objekt des Rigidbodys heißt "Rb"...könnte mir diesen Befehl bitte jemand genauer Erklären?

Allerdings habe ich auch noch andere Animationen die ein bisschen komplizierter ablaufen, bei denen die Bewegung in x und y Richtung ebenfalls nicht funktioniert...kann ich eine Rotation auch per Code erreichen, sodass sie nicht einfach überspringt, sondern langsam passiert?...Wenn ja, mit welcher Funktion geht das?

Danke im Vorraus

Stefan.R2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ist es erklärt und auch wo du den Haken finden kannst:
https://docs.unity3d.com/Manual/RootMotion.html

Und normal hast du hast Recht, bei einem Sprung ist es durchaus üblich, die Rootmotion in Y zu deaktivieren (siehe oben) und die Sprungbewegung in Y über eine Kraft in Y-Richtung auf den RB zu simulieren.

Hier ist ein Beispiel, wie man eine Kraft für einen Sprung in 2D hinzufügen kann:
https://docs.unity3d.com/ScriptReference/Rigidbody2D.AddForce.html

Was passiert dabei, es wird eine Kraft dem Rigidbody hinzugefügt, die in Richtung des lokalen Y-Vektors wirkt (=lokaler grüner Vektor des Transforms an dem der RB hängt).

Die Rootmotion für die Bewegung der Animation in x und y musst du ebenfalls im Animationsclip (Importsettings) selbst setzen (siehe oben RootMotion.html).
"Animations" => "jeweiliger Animationsclip" => "Root Transform Postion (XZ)" => "Bake into Pose" (!Haken rausnehmen!)  

Was meinst du mit Rotation?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke habs mit der .AddForce geschafftB)

Sorry, vielleicht bin ich einfach zu blöd...aber ich finde den "Animation Clip Inspector" nicht:o

Und was ich mit Rotation meine: Ich habe ein leeres Objekt erstellt und dem die einzelnen Grafiken hinzugefügt...d.h. arme, beine, kopf, körper...und diese animiert...und zusätzlich die position und rotation des objekts animiert...und so entsteht beispielsweise meine sterbeanimation....welche ich nicht mehr so einfach mit AddForce umsetzen kann...

Könntest du mir bitte nochmals Schritt für Schritt (am besten auf Deutsch ;) ) erklären wie ich zu diesem Haken komme...bzw. wo das "Animation Clip Inspector" - Fenster zu finden ist.

Lg, Danke

Stefan.R2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich versuche es mal ^^:
- im Projektfenster das Gameobjekt suchen, welches die Animationen enthält. Meistens ist das ein FBX file (ist so ein kleiner blauer Würfel mit nem kleinen weißen Zettel) 
- im Inspektor sollten oben nun 3 Buttons zu sehen sein: "Model" "Rig" und "Animations"
- gehe auf Animations
- dann auf den entsprechenden Clip, den du einstellen möchtest
- hier solltest du dann unten die entsprechenden Haken sehen

Wenn du es immer noch nicht findest, so ist es vielleicht eine "*.anim"-Datei. Diese wurden vermutlich über Unity selbst erstellt und es kann sein, daß du diese Animationen nicht weiter "einstellen" kannst (das was ich beschrieben habe sind nämlich Importsettings für die Animationen eines FBX). Da kann ich aber leider nicht weiterhelfen, ich weiß nur, daß man diese Animationen sehr gut über die Unity-eigene Animationskomponente bearbeiten / editieren kann. Also man beispielsweise eine Transformverschiebung selbst hinzufügen könnte (ist aber schon ein etwas fortgeschrittenes Thema).

Wenn ich das mit der Rotation richig verstehe, ja kannst du mit "Time.deltaTime". Damit wird deine Rotation unabhängig von deiner Framerate. Möchtest du die Rotation noch weiter verlangsamen, dann verkleinere den Faktor 10, welchen ich unten eingeführt habe:
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html

In diesem Beispiel rotiert er 1x um die lokale X-Achse und dann noch einmal um die globale Y-Achse.

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    void Update()
    {
        float speed = Time.deltaTime * 10;
        // Rotate the object around local X axis at 10 degree per second
        transform.Rotate(Vector3.right * speed);
    }
}

Hier nur um die lokale X-Achse (10x so schnell).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok...danke für die genaue erklärung...ich hab .anim Dateien:(...ich denke das die Transformverschiebung von der du geschrieben hast genau das ist was bei mir nicht richtig funktioniert...d.h. die wird zwar im Animationsfenster angezeigt, jedoch wenn ich die Animation dann per Code abspiele ist von dieser Transformverschiebung nichts mehr zu sehen.

Danke auch für das Beispiel, es hat mir sehr geholfen ;)

Lg

Stefan.R2

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am einfachsten den Winkel des Transforms prüfen:
https://docs.unity3d.com/ScriptReference/Transform-eulerAngles.html

und wenn die 180 Grad überschritten werden könnten, nicht weiter drehen. Ich habe allerdings den lokalen Winkel verwendet:

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    void Update()
    {
        float speed = Time.deltaTime * 10;
        
        if (transform.localEulerAngles.x + 10) > 180 return;
        
        // Rotate the object around local X axis at 10 degree per second
        transform.Rotate(Vector3.right * speed);
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...