• Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011

Hellhound

Members
  • Content count

    22
  • Joined

  • Last visited

  • Days Won

    2

Hellhound last won the day on March 31

Hellhound had the most liked content!

Community Reputation

5 Neutral

About Hellhound

  • Rank
    Member
  1. Was mir inzwischen aufgefallen ist, das Problem scheint sich rein auf den POSE Modus zu beziehen. Selektiere ich rechts die Armature-Bone Struktur rückt der Avatar wieder an die korrekte Position. Gleiches gilt, wenn ich Hat-Mesh selektiere und dann in den Editor-Modus wechsel, dann "rückt" der Avatar wieder nach vorn und alles passt. Sobald ich allerdings den Armature Root-Knoten auswähle oder den Edit-Modus verlasse tritt der Fehler wieder auf ...
  2. Hallo zusammen, ich bin noch ziemlicher Neuling was das Arbeiten mit Blender angeht und habe bzgl. des Modellierens zwei linke Hände, die sind eher für das Coding geeignet . Für meinen Unity Avatar Customizer versuche ich nun Objekte, die ich als OBJ Datei aus dem FUSE Modell exportiert habe an meinen Avatar zu binden, für den ich zuvor mit dem Mixamo-Rigger die Armature erstellen konnte. Das klappt auch zum größten Teil, wie man diesem Thread entnehmen kann : Nun habe ich mit einzelnen Modellen ein Problem das ich nicht erklären kann. Nach dem ich meinem Base-Avatar das Objekt hinzugefügt habe sieht noch alles korrekt aus, lediglich der Helm ist noch nich ganz richtig positioniert (Screenshot 1: AddObject). Nachdem ich dies Korrigiert habe, markiere ich die Mesh, anschließend das Armature und Weise die Mesh dem Armature per Strg+P zu, wobei ich die Generierung von Auto-Weights für die einzelnen Vertex-Gruppen nutze Und genau hier liegt nun mein Problem. Bei einzelnen Modellen werden nun Teile des Modells an einzelnen Stellen durch die Deformation herausgelöst (Screenshot 2). Im Falle des Helms ist das Glas der Schutzbrile deplaziert. Ich vermute, dass das irgendwie mit den Auto-Weights zusammenhängt, kann mir das aber nicht erklären, warum z.B. nur das Glas deplaziert wird, Teile des Helms aber nicht, obwohl es eine Mesh ist ... Irgendwie habe ich es schon einmal lösen können, dass dies nicht passiert, weiß aber nicht mehr wie. Hat jemand einen Tip, was ich hier falsch mache, bzw. wie ich es ohne Auto-Weights hin bekomme, dass der Helm bei der Animation korrekt mitbewegt wird? Ich bin dankbar für jeden Tip. Gruß Hellhound
  3. Stimmt das mit dem Lambda Ausdruck ist noch eleganter. Da muss ich doch gleich noch mal nachbessern
  4. Naja nen bissl Transferleistung ist schon erforderlich. Hätte mich überrascht wenn mein Code bei Dir läuft ... Grundsätzlich sollte die Coroutine gehen mit leichten Anpassungen: 1. Animator ist die Referenz auf den Mechanim Animator den ich im Start Teil des Skriplets mit GetComponent abfrage und als Member sicher. 2. Du musst schon den Namen Deines AnimationState oder Trees abfragen. Der 2te Fehler sollte sich mit der Animator Referenz erledigen. 3.Den letzten Fehler kannst Du streichen da Du den Member nicht hast und nicht benötigst. Schau Dir bitte in der API an wie Du die Coroutine aufrufst. Habe grad den Code nicht zur Hand ...
  5. Damit habe ich auch eine ganze Weile kämpfen müssen um eine Rotation vor dem Bewegungsablauf zu realisieren zu können. D.h. ich wollte, dass der Charakter sich zunächst per Animation auf das Bewegungsziel ausrichtet bevor er losläuft. D.h. meine Rotationsanimation muss abgeschlossen sein, bevor er mit dem eigentlichen Bewegungsablauf, der durch den NavMeshAgent realisiert ist, starten kann. Letztendlich habe ich das nur durch eine Coroutine lösen können, die prüft ob die Animation schon beendet ist: protected IEnumerator OnCompleteRotationAnimation() { Debug.Log("Wait on correct animation: " + Time.time); while(!animator.GetCurrentAnimatorStateInfo(0).IsName("TurnOnSpot")){ yield return null; } Debug.Log("Correct animation started to wait for complete: " + Time.time); while (animator.GetCurrentAnimatorStateInfo(0).normalizedTime < animationEndThreshold){ yield return null; } Debug.Log("Correct Animation stop: " + Time.time); this.signedAngle = 0f; } Die Prüfung erfolgt in zwei Schritten: Zunächst prüfe ich ob die korrekte Animation aktiv ist, dann prüfe ich ob sie beendet ist, wenn die normalisierte Zeit meinen Grenzwert erreicht oder überschritten hat. Das hat mich allerdings dazu gezwungen die eigene Bewegungsmethode ebenfalls zu einer Coroutine zu machen. Zudem habe ich eine weitere Coroutine zur anschließenden Korrektur der Position, da das Ergebnis der Rotationsbewegung im Animator nur eine Annäherung auf den eigentlichen Wert ist. Vielleicht kannst Du damit etwas anfangen.
  6. Wie versprochen habe ich nun einmal ein erstes Video hochgeladen: http://sendvid.com/go5cpdqv Wie Ihr sehen könnt funktioniert das Customizing in der Basis, was direkte Modelle angeht, die ich aus FUSE entnommen habe. Als nächstes muss ich noch mal schauen, wie ich Objekte hinzufügen kann, die nicht aus FUSE stammen. Da muss ich mich ersteinmal ein bischen in Blender einarbeiten. Dann fehlt noch ein vernünftiges UI und was noch mich noch mehr nervt ist die Optik. Die Kleidungsstücke reflektieren mir zu stark und das obwohl ich lediglich die diffuse Textur nutze (ich habe noch nicht mal Normalmapping aktiv), d.h. ich muss unbedingt das Shading überarbeiten. Aktuell überlege ich zudem wie ich die ganzen Daten am besten handle. Einerseits muss ich per Editor oder später per AssetImporter festlegen welche Kleidungstücke wie ausgewählt und gesetzt werden können, andererseits muss der Krams dann auch persistiert werden, damit eine andere Szene die Daten aufgreifen kann. Persönlich überlege ich zur Zeit hier JSON und evtl. eine NoSQL DB zu nutzen. Haltet Ihr das für sinnvoll oder habt Ihr gar eine bessere Idee?
  7. Das Wochenende ist rum und ich bin nun wieder ein Stückchen schlauer geworden Inzwischen bekomme ich das mit dem Shirt und der Hose gebacken, ich glaub es war ein Blender Versionsproblem. Ich habe einmal von Version 2.74 auf 2.78 geupdated und siehe da, beim FBX Export bleiben die Kleidungsstücke dort wo sie hin sollen. Bei Version 2.74 gibt es unabhängig vom Kleidungsstück Probleme, sobald ein Kleidungsstück auch nur marginal gescaled wurde ... Wenn ich es schaffe, gibt es heute Abend ein Video, ansonsten morgen ...
  8. Ok, so ganz funktioniert es dann wohl doch nicht. Habe nun Probleme mit dem Shirt oder den Hosen. Hier funktioniert zwar alles wie gewünscht wenn ich das gesamte Modell als FBX exportiere, auch das Skinning während der Animationen greift. Entferne ich jedoch die übrigen Meshes von der Armature und Binde das Objekt mit dem Skript wie auch schon die Cap und die Schuhe, dann sieht zwar alles i.O. aus in der Pose im Edit-Modus von Unity, aber sobald die Animation startet wird die Mesh gigantisch groß skaliert und wirkt irgendwie deformiert (gestaucht). Auf den ersten Blick sieht in Blender alles i.O. aus, auch die Skelette sehen identisch aus. Habe aktuell keine Idee wo dieses Verhalten her kommt ... Komischerweise habe ich dies nur beim Shirt und der Hose festgestellt, also Objekten die über mehrere Mesh-Parts gehen.
  9. Danke für Deinen Hinweis mit den nicht übereinstimmenden Rigg. Dank dieser Info habe ich festgestellt, dass FUSE die Modelle beim Generieren leicht verändert, so dass der Mixamo-Rigger tatsächlich unterschiedliche Riggs erstellt, auch wenn das Basismodell gleich war. Das Skelett ist zwar gleich, aber die Bones Ausrichtung variiert leicht. Ich habe einen einfachen Weg gefunden dies über Blender zu korrigieren: Ich lade beide Riggs als DAE File herunter. In Blender werden beide separat importiert und jeweils in ein blend-File umgewandelt. Ausgehend vom Basis-Rigg (Avatar nur mit Body-Skin) Blend-File füge ich nun über die Blender-Append Funktion das entsprechende Mesh für die z.b. Kopfbedeckung aus dem anderem Blend-File hinzu. Anschließend habe ich in Blender 2 separate, geskinnte Meshes auf zwei Armatures. (Bild 1,2) Nun lösche ich die Armature des neuen Mesh-Objektes, so dass nur noch die Mesh mit Ihren Skinning Daten übrig bleibt und setzte anschließend an der Mesh im Object-Modifier (Bild 3) und am Amature-Modifier (Bild 4) auf das die Parent-Referenz des Armature auf die des Basis-Rigg. Damit ist die Mesh dem Basis-Rigg komplett zugeordnet, Skinning Daten wie Vertex-Groups werden 1:1 übernommen. Das Ganze funktioniert in Blender einwandfrei, die Geweichtungen sehen i.O. aus, wenn ich mir nun einen einzelnen Bone heraussuche und rotiere, greift das Skinning und die Mesh wird mit den Bones basieren auf den Vertex-Groups modifiziert. Falls erforderlich führe ich die entsprecheden Modifikationen am Mesh durch, d.h. ich richte es korrekt aus und muss ggfs. auch mal minimal nach skalen um z-Fighting Probleme zu beseitigen. Nun kann ich zum Einen das gesamte Modell als FBX exportieren und in Blender einbinden. Hier habe ich genau das Verhalten, das ich haben möchte. Allerdings noch ein komplettes, erweitertes Modell. Aber ich habe auch eine Lösung gefunden für das Customizen Ich exportiere das Basis-Rigg als Basis-Avatar für Unity als FBX. Ich nehme das erweiterte Basis-Rigg mit dem hinzugefügten Mesh Ojekt und entferne alle anderen Referenzen aus dem Armature, so dass nur das Skelett und die Mesh übrig bleiben. Diese exportiere ich ebenfalls als FBX. 3. Ziehe ich beide Files in der POSE-Position im Edit-Modus in Blender hinein, habe ich perfekt platzierte Objekte. Und auch kein z-Fighting Problem. (Bild 5) Interessant wird nun der Punkt, wie bekomme ich das animiert? Füge ich zum Basis-Rigg eine Animation hinzu, z.B. Idle, dann wird diese korrekt animiert, das separat geladene Mesh-Objekt jedoch nicht. Ich kann auch dem Mesh-Objekt mit dem eigenen Rig einen Animator hinzufügen und auf den gleichen Controller setzen. Dann laufen diese Parallel. Das finde ich jedoch ineffizient, zumal ein Body einige Objekte als Ausrüstung zugewiesen bekommen soll. Bei mehren Charakteren mit x-Animatoren sehe ich das als Laufzeitkritisch. Besser ist es die Mesh unter das Basis-Rigg zu bekommen und nur einmal zu animieren. Das Verschieben des Mesh-Objektes mit dem eigenen Rigg an das entsprechende Bone funktioniert bei mir nicht, das Skinning greift hier nicht. Inzwischen habe ich eine Lösung die skriptseitig die Objekte vereint, bei dem ich nach diesem Unity-Thread vorgehe: https://forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485/ Das ganze funktioniert. Durch das Skript wird das Skelett der Mesh mit dem des Basis-Riggs abgeglichen und die Objektreferenz und der Skinned-MeshRenderer hinzugefügt. Nun kann ich das ganze mit nur einem Animator animieren und ich habe nur noch die Objektstruktur des Avatars in Unity.
  10. Da das ganze Thema recht komplex ist und ich denke, dass mehrere Entwickler hier ein Interesse an meiner Erfahrung habe, will ich einmal diesen Thread nutzen um meine Erfahrung festzuhalten und zudem Fragen mit an dieser Stelle Posten um den Fortschritt zu kommunizieren. Hier ersteinmal ein Update zum aktuellen Stand: Ich habe die letzten Tage einiges ausprobiert und bin inzwischen in der Lage die Kopfbedeckung des Avatars zur Laufzeit auszutauschen und konnte auch das Problem mit dem Culling lösen, indem ich zunächst einmal den Avatar ohne Kopfbedeckung als Basis Skelett nutze und anschließend jeweils einzeln den selben Avatar noch einmal mit der Kopfbedeckung rigge. Ziemliche Probleme hatte ich hierbei mit dem Workflow. Ich habe festgestellt, dass ich grundsätzlich einen festen Weg über Blender nehmen muss, d.h. FUSE -> Mixamo (Rigging) -> Export DAE -> Blender Import -> Export FBX. Zudem muss ich die Animationen von Mixamo ebenfalls als DAE exportieren und den Weg über Blender nehmen, da sonst die Skelettstrukturen nicht zueinander passen. In jedem Fall muss ich sicherstellen, das die Skelette identisch sind. Die einzelnen Kopfbedeckungen erzeuge ich dann, indem ich zunächst das Modell mit der Kopfbedeckung, in Blender als DAE importiere, als Blendfile abspeicher und dann in einer neuen Szene nur die Kopfbedeckung über die Attach-Funktion aus dem Blendfile hinzufüge. Dann habe ich das komplette, korrekte Skelett nur mit der Kopfbedeckung. In Unity kann ich nun beide FBX Modelle importieren und mit der gleichen Animation belegen. Klappt, beide laufen Synchron und ich kann über den SkinnedMesh-Renderer beliebig die Kopfbedeckung ein- und ausblenden und so variieren. Bisher habe ich auch keine Probleme durch Überschneidungen der Geometrie zwischen Kopf und Kopfbedeckung gesehen. Nun habe ich versucht zunächst ohne Skripting die Objekthierarchien zu vereinen, so dass die Kopfbedeckung dem Avatar untergordnet wird und der Animator des Avatars die Animation mit steuert. Da beide Skelette gleich sind habe ich gedacht ich könnte die entsprechende Kopfbedeckung einfach an das Skelett des Base Avatar binden, indem ich entsprechend im SkinnedRenderer das Root-Bone auf das gleiche Objekt lege, nur halt aus der anderen Armature. Lt. Bounding-Boxen wird das auch umgesetzt, entferne ich jetzt jedoch den Animator von derKopfbedeckung dann passt zwar alles Optisch in der Pose, sobald die Animation läuft, jedoch nicht mehr. Ich habe auch schon versucht nur das Mesh-Objekt mit dem SkinnedRenderer dem Avatar unterzuordnen und dann wie oben beschrieben an das Skelett vom Avatar zu binden. Dann sieht zwar alles gut aus, aber in dem Moment, wo ich die Animation starte ist die Kopfbedeckung optisch verschwunden und danach auch dauerhaft in der Pose-Position im Editing-Mode. Daher die Fage, ist das überhaupt möglich? Habe ich hier evtl. gedanklich grad einen Fehler im Vorgehen?
  11. Danke Euch ersteinmal für Eure Antworten. Das ist genau das was ich vermutet habe. Ich habe gestern einmal ein bisschen rumgespielt und mir ein FUSE Modell 3x mit unterschiedlicher Konfiguration heruntergeladen, geriggt und über Blender dann in Unity importiert. Die ersten Versuche zeigen, dass ich einzelne Elemente auf dem gleichen Skelett relativ einfach austauschen kann, z.B. Helm gegen Hut indem ich lediglich die Mesh im SkinnedRenderer und das dazugehörige Material anpasse. Problem ist aktuell hierbei, dass beide Modelle die die Kopfbedeckung tragen, beim export die Vertices unterhalb des Objektes entfernt haben. D.h. ich muss irgendwie das Basis Skelett ohne Kopfabdeckung um die Kopfabdeckung erweitern, so dass ich beim Ausblenden der Kopfbedeckung wenigstens den Kopf vollständig habe. Das sollte aber irgendwie machbar sein und sich der gesamte Mechanismus skripten lassen. Der erste Einstieg ist gefunden, jetzt kann es munter weiter gehen
  12. Hallo zusammen, ich mache mir aktuell grade Gedanken, wie ich in Unity ein Customizing des Avatars realisieren kann. Meine Idee ist es wie z.B. in XCOM, den Sims oder den üblichen RPG's das Aussehen und primär das Equipment des Avatars anpassen zu können. Evtl. später sogar eine einfache Mölichkeit zu schaffen, zusätzliche Elemente hinzuzufügen (modding). Leider gibt es im Netz zu diesem Thema fast keine Informationen. Was ich bisher herausgefunden habe, ist dass ich hier zweigleisig fahren muss. Einerseits gibt es Elemente, die halt relativ einfach ausgetauscht werden können, da sie keinem Einfluss unterliegen, wie z.B. Gegenstände die in der Hand gehalten werden. Problematischer sind all die Gegenstände die direkt mit durch die Bewegung des Charakters beinflusst werden, wie z.B. Kleidung, die am Torso aufliegt. Bei jeder Drehung, muss diese dem Körper folgen und sich mit anpassen (z.B. Hemd, Handschuhe). Bisher nutze ich FUSE für die Erstellung der Avatare und rigge sie mit Mixamo. Hier wird jedoch der Gegenstand direkt mit an das Objekt gebunden und auf das Skelett ausgerichtet. Einfach mal, z.B. Helm gegen Hut tauschen geht hier nicht. D.h. im Endefekt müsste ich so x-Modelle schaffen, die unterschiedlich ausgerüstet/angezogen sind. Das halte ich nicht für akzeptabel. Ich denke eher hier müsste ich den Ansatz fahren, das ich in FUSE einmal einen Charakter modelliere, der alle möglichen Modifikationen aufweist (Handschuhe, Kopfbedeckung, Brille usw.) und diese müsste ich dann zur Laufzeit irgendwie ein/ausblenden, falls vorhanden und ggfs. die Geometrie austauschen. Schwer kann ich mir z.Z. jedoch vorstellen, wie ich hier mit unterschiedlichen Größen umgehe (Frauen Hand/Torso vs. Männer Hand/Torso). Vermutlich müsste ich jeden gegenstand für diese unterschiedlichen Ausprägungen doppeln. Ich habe mir z.B. eine Weste als Asset gekauft (Was Grafik angeht, habe ich 2 linke Hände). Diese müsste ich jetzt irgend wie an den Torso binden. Ich kann zwar ohne weiteres in Unity die Weste scalen und auch dem entsprechendem Spline im Skelett zuweisen, scheiter aber nun daran hier einen skinned Mesh Renderer zu nutzen, so dass sich die Weste mit dem Torso verformen würde. So dreht sich aktuell zwar der Torso, die Weste aber nur bedingt mit dem Transform-Objekt, was natürlich unrealistisch ausschaut und zu Überlappungen führt. Generell, wie gehe ich mit Überlappungen um, wie z.B. einem Zopf? Der soll ja nicht in der Geometrie verschwinden. Da die Objekte an das Skelet gebunden sind, denke ich ist es notwendig für jedes Skelet (daher sollte ich nicht zu viele unterschiedliche Skelette haben) einzeln die Objekte ausrichten/binden und irgendwie Unity seitig zu verknüfen, wobei denke ich die betroffenen Elemente auch als Skinned Mesh gerendert werden, damit bei allen möglichen Animationen das Skinning greift. Kennt Ihr zu dieser Thematik gute Tutorials, Snippeds? Wie würdet Ihr das umsetzen? Ich bin für jeden Denkanstoss und Hinweis danbar. Viele Grüße Hellhound
  13. Inzwischen habe ich herausgefunden, dass wenn ich die Methode OnAnimatorMove mit folgendem Setting nutze und zudem am NavMeshAgent die updatePosition auf false setze, er sich korrekt zum Zielpunkt bewegt und auch das merkwürdige Zucken vor Bewegungsbeginn verschwindet: void OnAnimatorMove(){ transform.rotation = animator.rootRotation; transform.position = navMesh.nextPosition; } Allerdings sind nun Animation und NavMeshAgent nicht synchron, d.h. der Avatar läuft noch eine Weile, obwohl der Zielpunkt erreicht wurde und sowohl der Forward Wert für das Laufen als auch die NavMeshAgent.Velocity auf 0 gesetzt wurden. Hat jemand eine Idee wie ich das in den Griff bekomme?
  14. Hallo zusammen, ich bin mir nicht sicher, ob der Scripting-Thread der richtige Ort für das Thema ist oder ob es eigentlich eher zu dem Animationsbereich gehört ... In der Hoffnung das es skript baisert lösbar ist, poste ich es einmal hier. Ich schreibe aktuell für mich einen click to move basierten Avatar Controller und nutze den NavMeshAgent für die Steuerung/Wegfindung. Besonderheit hierbei ist, das ich die Rotation des NavMeshAgent deaktiviert habe um eine Punktrotation vor der eigentlichen Bewegung zum Zielpunkt durchzuführen. Ausgeführt wird das ganze in mehreren Schritten mit einer Coroutine für die Bewegung: Zunächst prüfe ob der Zielpunkt in einem größeren Winkel +/- 30 Grad zur Blickrichtung liegt. Ist dies der Fall wird durch eine weitere Coroutine zunächst die Bewegungsausführung unterbrochen, bis die Animation für die Rotation im Animator zu 75% abgeschlossen wurde. Anschließend setze ich am NavMeshAgent die Bewegunsrelevanten Daten Im letzten Schitt führe ich durch eine weitere Coroutine eine Korrektur der Rotation zum Zielpunkt durch, da diese i.d.R. durch das Blending nicht vollständig ist. Hier einmal der Code für die Bewegungsausrichtung getriggert durch ein separates Click-Skript: public IEnumerator Move(Vector3 target, float timeToWait){ this.targetDirection = target - animator.rootPosition; this.targetDirection.y = 0f; this.targetPosition = target; Vector3 rootDirection = this.transform.forward; Vector3 axisSign = Vector3.Cross(targetDirection, rootDirection); this.signedAngle = Vector3.Angle(rootDirection, targetDirection) * (axisSign.y >= 0 ? -1f : 1f); // block until rotation animation is complete if (signedAngle > 30f || signedAngle < -30f) { yield return StartCoroutine(OnCompleteRotationAnimation()); } this.navMesh.destination = target; this.navMesh.speed = this.walkSpeed; this.navMesh.acceleration = this.walkAcceleration; this.forward = 0.5f; this.signedAngle = 0f; this.hasValidDirection = true; // make sure we're rotating to face the proper direction this.useCustomRotation = true; while (Vector3.Angle(targetDirection, this.transform.forward) >= 0.25f) { Debug.DrawRay(this.transform.position, this.transform.forward * 5f, Color.blue); Debug.DrawRay(this.transform.position, targetDirection * 5, Color.red); yield return null; } this.useCustomRotation = false; } Und hier der eigentliche Update Code, bei dem ich lediglich die Animationen auf Basis der Entfernung und NavMesh Geschwindigkeit setze und prüfe, ob ich den Zielpunkt erreicht habe, in dem Fall wird die Navigation zurückgesetzt: void Update () { // Calculate our distance from target float distance = Vector3.Distance(targetPosition, navMesh.transform.position); /* Update our speed based on our distance from the target to slow down speed reaching target point position */ var speed = navMesh.desiredVelocity.magnitude * (distance >= 1.0f ? 1f : distance); animator.SetFloat(hashes.forward, speed, animationDampTime, Time.deltaTime); // only handle on active movement if (this.hasValidDirection) { this.Rotate(); if(distance < pathEndThreshold) { this.hasValidDirection = false; this.forward = 0f; this.signedAngle = 0f; this.navMesh.velocity = Vector3.zero; this.navMesh.speed = 0f; } // finally blend rotation value animator.SetFloat(hashes.angle, signedAngle, animationDampTime, Time.deltaTime); } } Das klappt auch soweit ganz gut, wie Ihr dem folgendem Video entnehmen könnt: https://vid.me/tVvC Für die Rotation selbst nutze ich einen Blend Tree mit diversen Mixamo Animationen unter Berüksichtigung des erforderlichen Rotationswinkels. Für die Animation selbst habe ich in dem Fall die RootMotion aktiviert. Aber genau die RootMotion scheint das Problem zu sein da die Animation scheinbar noch "nachläuft" nachdem der Agent gestoppt wurde und die RootMotion den Avatar über den Zielpunkt hinaus bewegt. Deaktiviere ich die RootMotion, dann stoppt der Avatar zwar am konkreten Zielpunkt. Zuckt aber merkwürdig bevor die eigentliche Rotationsanimation beginnt (ich habe keine Idee wo dies her kommt) zudem macht er i.d.R. auch noch einzelne Schritte obwohl er bereits steht, wie man es diesem Video entnehmen kann: https://vid.me/Ewb4 Ich habe auch schon versucht die OnAnimatorMove Methode zu verwenden und hier die aktuelle transform.position des Avatars auf den Wert der NavMesh.nextPosition zu setzen. Dies führt aber lediglich zum gleichen Effekt, wie bei der deaktivierten RootMotion. Ich bin mit meinem Latein inzwischen am Ende und finde zu diesem Thema auch nichts weiter im Netz. Daher bin ich äußerst dankbar für jede Hilfe, da mich dieses Problem schon gut 14 Tage beschäftigt. Gruß Hellhound
  15. Hallo zusammen, für meinen Mixamo Avatar konnte ich erfolgreich verschiedene Blend-Tree Definitionen für die Bewegung i.V.m. dem NavMeshAgent realisieren. Allerdings sieht die Rotation des Agents vor der Bewegungs-Animation unrealistisch aus und wirkt mehr wie ein Rutschen als Drehen, da die Beine nicht bewegt weden. Aus diesem Grund habe ich mir für eine Punkt-Rotation verschiedene Animationen von Mixamo heruntergeladen, mit denen Drehungen in den Winkeln 45, 90, 135 und 180 Grad sowohl nach links und rechts um die eigene Achse möglich sind. Zur Umsetzung der Rotation habe ich einen 1D Blend-Tree definiert, mit der eigentlichen Idle Animation am Wert 0 und einem Threshold Range von -180 bis 180 Grad. Als Paramter nutze ich ein float Facing value. Zudem habe ich in sämtlichen Animationen die Folgenden Flags gesetzt: Root Transform Rotation (Body Orientation) und Root Transform Position (Y, XZ) (Original) zudem ist am Blend-Tree das Foot-IK Flag aktiviert. In der Vorschau sieht soweit auch alles gut aus. Ändere ich den Facing-Wert, dann dreht sich der Avatar entsprechend dem Winkel um die eigene Achse mit Animation. Im Play-Mode allerdings greift das nicht. Hier wird zwar der Avatar entsprechend dem Winkel korrekt rotiert, allerdings ohne jegliche Animation, die Beine bleiben fix auch wenn im Blend-Tree die korrekte Animation laut Animation-Controller ausgeführt wird. Im Avatar Controller-Skript habe ich in der Awake Methode die NavMeshRotation deaktiviert, der Rotationsgrad wird von mir zwischen Zielpunkt und Avatar Position wie folgt ermittelt: var localTarget = this.transform.InverseTransformPoint(moveTarget.position); var angle = Mathf.Atan2(localTarget.x, localTarget.z) * Mathf.Rad2Deg;; this.turn = angle; animator.SetFloat("Facing", this.turn, this.animationDampTime, Time.deltaTime); Zudem setze ich in der OnAnimationMove Methode die Avatar transform.rotation auf den Wert der animator.rootRotation. Was mir hierbei zusätzlich Probleme bereitet ist, dass die Blickrichtung des Avatars sich nicht der Rotations-Animation anpasst. Wenn ich die Blickrichtung debugge bleibt sie immer auf Ausgangsstellung (0,0,1): Vector3 facing = animator.rootRotation * Vector3.forward; Debug.DrawRay(animator.rootPosition, facing *2, Color.green); Dies ist auch der Fall, wenn ich das facing mit transform.forward ermittel. Das führt korrekter weise dazu, das bei einem erneuten Move der Winkel nicht korrekt bestimmt wird. Habe ich mich z.B. zunächst um 175 Grad rechts um die Achse gedreht und bewege mich als nächstes auf eine Position von -175 Grad vom ursprünglichen Winkel aus, dann macht der Avatar auch eine komplette Drehung um die volle Achse anstelle den kürzeren Winkel, basierend auf der neuen Ausrichtung zu nutzen. Hat jemand eine Idee, was ich falsch mache? Viele Grüße Hellhound