Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Frage Animation Constraints to Unity
#1
Hallo zusammen,

ich habe einen Character modelliert mit dem Ziel diesen in Unity als NPC zu verwenden. Aktuell arbeite ich an der Animation. 
Der Character ist mit einer Armature verbunden und besitzt als separates Childobject eine Pistole. Die Animation sieht so aus, dass 
der Character die Pistole im Holster an seinem Körper trägt, dann die Waffe zieht, abfeuert und wieder in den Holster steckt. 

Heute musste ich mich erstmal in das Thema Constraints arbeiten, aber mittlerweile habe ich es geschafft, dass die Pistole sich so verhält wie sie soll, 
nämlich zunächst den Bewegungen des Oberschenkelknochens im Holster folgt und dann wenn die Hand an der Waffe ist, dem Handgelenksknochen folgt. 

Das Problem ist jetzt aber, dass wenn ich die Animation Bake und in Unity hereinbringe, ich immer nur zwei einzelne Animationen erhalte, d.h. einmal
wo sich der Character ohne die Waffe bewegt und einmal wo sich die Waffe ohne Character bewegt??? Ich weiß nicht warum, das passiert.
Zitieren
#2
Hallo,

bisher ist es nicht möglich, blenderconstraints nach Unity zu bringen (kann sein, dass sich da etwas in den allerneuesten Unity Versionen geändert hat).

Die Waffe wird nicht animiert.

Übliche Vorgehensweise:
Empty 1 ist Child des Holsters
Empty 2 Child eines Mittelhandknochens

Animationen (und states):
0 - Ausgangsanimation (idle, walk, …)

1 - Hand bewegt sich zur Waffe (und ggf Angriffsposition)

2 - Waffe wird gezogen und in Schussposition gebracht

3 - Schießen (ggf loop)

4 - Waffe ins Holster

5 - Hand in Ausgangsposition für die folgende Animation (und ggf Normalposition)

- beim Wechsel von state 1 zu state 2 wird der Waffenparent von Empty 1 zu Empty 2 gewechselt

- beim Wechsel von state 4 zu state 5 wird Empty 1 wieder der Parent (wenn der NPC im Kampf stirbt und die Waffe aufgesammelt werden kann, muss der Parent ganz entfernt werden)

Wenn saubere Übergänge nicht so wichtig sind, kann die Anzahl der benötigten Animationen reduziert werden.

Grüße Malthea
Zitieren
#3
(19.07.2024, 12:22 AM)Malthea schrieb: Hallo,

bisher ist es nicht möglich, blenderconstraints nach Unity zu bringen (kann sein, dass sich da etwas in den allerneuesten Unity Versionen geändert hat).

Die Waffe wird nicht animiert.

Übliche Vorgehensweise:
Empty 1 ist Child des Holsters
Empty 2 Child eines Mittelhandknochens

Animationen (und states):
0 - Ausgangsanimation (idle, walk, …)

1 - Hand bewegt sich zur Waffe (und ggf Angriffsposition)

2 - Waffe wird gezogen und in Schussposition gebracht

3 - Schießen (ggf loop)

4 - Waffe ins Holster

5 - Hand in Ausgangsposition für die folgende Animation (und ggf Normalposition)

- beim Wechsel von state 1 zu state 2 wird der Waffenparent von Empty 1 zu Empty 2 gewechselt

- beim Wechsel von state 4 zu state 5 wird Empty 1 wieder der Parent (wenn der NPC im Kampf stirbt und die Waffe aufgesammelt werden kann, muss der Parent ganz entfernt werden)

Wenn saubere Übergänge nicht so wichtig sind, kann die Anzahl der benötigten Animationen reduziert werden.

Grüße Malthea

Hi,

vielen Dank für deine Antwort. Also wenn ich dich richtig verstanden habe, dann teile ich den animationsclip in sinnvolle, kleinere Animationen auf, und animiere mit zwei Objekten derselben Waffe, die jeweils mit einem anderen Bone der Armature verbunden sind. In Unity switche ich dann SetActive, beim Wechsel der Animation? 
Zitieren
#4
Hallo,

im blender wird der NPC animiert (natürlich kann man die Waffe als constraint dazu nehmen - die kommt aber nicht mit in die Animation) und so die Einzelanimationen erstellt - die Empties, die Waffe(n) und die Logik kommen erst in Unity dazu.

In Unity bewegen sich die Empties mit dem Char (und natürlich auch die Waffe, die Child ist).

An die Empties können unterschiedliche Waffen geparentet werden - hierbei ist zu beachten, das im blender der jeweilige Waffen-Objektorigin so gesetzt wird, das er dem Empty-origin in Unity entspricht => einfachere Ausrichtung der Waffe in Unity durch Drehung / Bewegung des Emptys und man hat danach eine Empty-Position, die man für unterschiedliche Waffen nutzen kann.

Durch die Einzelanimationen hat man eine einfache Möglichkeit, den Zeitpunkt festzustellen, an dem der Parent gewechselt werden muss - dieser entspricht dem Wechsel state 1 -> state 2 bzw state 4 -> state 5 aus dem Beispiel. Am einfachsten ist es, im state 2 und state 5 ein StateMachineBehaviour Script zu erstellen und in diesen beiden Scripts in der OnStateEnter-Funktion den Parent-Wechsel zu erledigen (man könnte auch in den Vorgänger-States die OnStateExit-Funktion nutzen - ist aber nicht zu empfehlen).
Auf diese Art muss man keine komplizierten Abfragen (ist die Animation so-und-so beendet?) scripten.

In Unity switche ich dann SetActive, beim Wechsel der Animation?

Das ist nur sinnvoll für den Wechsel zu state 1 im Triggerscript, die anderen states sollten dann starten, wenn der vorangegangene state "abgearbeitet" ist - ansonsten müsstest du irgendwo andauernd abfragen, ob die Animation zu Ende ist. Du solltest auch bools im Animator für Ausstiegsbedingungen setzen (Feind weg oder tot, Munition alle usw).

Grüße Malthea
Zitieren
#5
(19.07.2024, 12:15 PM)Malthea schrieb: Hallo,

im blender wird der NPC animiert (natürlich kann man die Waffe als constraint dazu nehmen - die kommt aber nicht mit in die Animation) und so die Einzelanimationen erstellt - die Empties, die Waffe(n) und die Logik kommen erst in Unity dazu.

In Unity bewegen sich die Empties mit dem Char (und natürlich auch die Waffe, die Child ist).

An die Empties können unterschiedliche Waffen geparentet werden - hierbei ist zu beachten, das im blender der jeweilige Waffen-Objektorigin so gesetzt wird, das er dem Empty-origin in Unity entspricht => einfachere Ausrichtung der Waffe in Unity durch Drehung / Bewegung des Emptys und man hat danach eine Empty-Position, die man für unterschiedliche Waffen nutzen kann.

Durch die Einzelanimationen hat man eine einfache Möglichkeit, den Zeitpunkt festzustellen, an dem der Parent gewechselt werden muss - dieser entspricht dem Wechsel state 1 -> state 2 bzw state 4 -> state 5 aus dem Beispiel. Am einfachsten ist es, im state 2 und state 5 ein StateMachineBehaviour Script zu erstellen und in diesen beiden Scripts in der OnStateEnter-Funktion den Parent-Wechsel zu erledigen (man könnte auch in den Vorgänger-States die OnStateExit-Funktion nutzen - ist aber nicht zu empfehlen).
Auf diese Art muss man keine komplizierten Abfragen (ist die Animation so-und-so beendet?) scripten.

In Unity switche ich dann SetActive, beim Wechsel der Animation?

Das ist nur sinnvoll für den Wechsel zu state 1 im Triggerscript, die anderen states sollten dann starten, wenn der vorangegangene state "abgearbeitet" ist - ansonsten müsstest du irgendwo andauernd abfragen, ob die Animation zu Ende ist. Du solltest auch bools im Animator für Ausstiegsbedingungen setzen (Feind weg oder tot, Munition alle usw).

Grüße Malthea

Hallo Malthea,

danke für deine erneute Antwort. Ich war jetzt länger im Urlaub und habe aber mittlerweile versucht alles so umzusetzen, wie du es vorgeschlagen hast. Das arbeiten mit StateMachineBehaviour-Scripten war neu für mich, aber es hat letztlich geklappt. Das einzige Problem jedoch was ich nun noch habe ist der Umstand, dass sich die Waffe beim Wechsel vom ParentEmpty1 zu ParentEmpty2 nicht so verhält wie sie sollte. 
Wenn ich zum Beispiel beginne zu Animeren und die Waffe befindet sich noch im Holster und ist an ParentEmpty1 geknüpft, so ist alles in Ordnung. Auch in Unity. Aber wenn der Charakter die Waffe in die Hand nimmt, und die Waffe zu ParentEmpty2 wechseln soll, dann verhält sie sich nicht so, wie in der Animation beabsichtigt war. Ich habe zwar schon verstanden, dass die Waffe nicht mitanimiert werden soll, wenn man z.B. im Sinn hat, diese später durch andere Waffen zu ersetzen. Aber habe ich jetzt in Unity dann zwei Objekte von derselben Waffe, die jeweils mit Parent1 bzw. Parent2 verbunden werden oder nur ein Waffenobjekt, welches die Parents je nach State wechselt? Weil wenn ich nur ein Waffenobjekt habe, wie soll ich dann sicherstellen, dass sie beim Wechsel auf Parent2 richtig in der Hand des Charakters liegt? 
Zitieren
#6
Hallo,

der Gang der Handlung ist einfach: Schon beim Modellieren der Ausrüstungsgegenstände im blender darauf achten, das zB der Lauf der Waffe in Richtung der positiven y-Achse zeigt (in unity ist das dann die positive z-Achse).

Dann wird in unity an passender Stelle in der Armature die jeweiligen "Zielempties" eingefügt - im Beispiel "HutEmpty".

   

Bei einfachen Ausrichtungsänderungen kann im Inspector Transformpanel das Empty passend gedreht werden, nachdem die Transform auf "local" gestellt worden ist.

   

Ansonsten parented man den Ausrüstungsgegenstand an das Empty und dreht / bewegt dann im 3D-Fenster das Empty, bis alles passt.

   

Grüße Malthea
Zitieren
#7
Nachtrag zu: Aber habe ich jetzt in Unity dann zwei Objekte von derselben Waffe, die jeweils mit Parent1 bzw. Parent2 verbunden werden oder nur ein Waffenobjekt, welches die Parents je nach State wechselt? Weil wenn ich nur ein Waffenobjekt habe, wie soll ich dann sicherstellen, dass sie beim Wechsel auf Parent2 richtig in der Hand des Charakters liegt?

Man kann natürlich die Waffe im Holster zerstören und eine neue Instanz in der Hand erzeugen, aber da ich vermute, dass sich die Hand am Ende der ersten Teilanimation dicht beim Holster befindet, kann man genauso gut eine Waffe benutzen (vielleicht können Collider am Holster, der Waffe und am NPC Probleme verursachen - diese ggf zeitweise deaktivieren). Das Empty2 muss natürlich auch so ausgerichtet werden, dass die Waffe passend in der Hand liegt.

Grüße Malthea
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste