Jump to content
Unity Insider Forum

Hellhound

Members
  • Content Count

    86
  • Joined

  • Last visited

  • Days Won

    2

Hellhound last won the day on March 31 2017

Hellhound had the most liked content!

Community Reputation

7 Neutral

About Hellhound

  • Rank
    Advanced Member

Recent Profile Visitors

1,196 profile views
  1. Moin, Moin, Cxyda83, habe am Wochenende ein bissl rumgespielt und bin letztendlich auf das Gleiche Vorgehen gestoßen wie Du es beschrieben hast. Das bringt wie Du schon sagst keinerlei Vorteil außer noch mehr Komplexität und unnötiges Objekt geschleppe. Hab es daher abgebrochen und werde weiterhin auf Events und Delegates setzen. Danke Dir für Deinen Input. Viele Grüße Hellhound
  2. Moin, moin Cxyda, erst mal danke für die Infos. Wie Du auch setze ich für die Konfiguration meiner Objekte sehr stark Scriptable Objects ein. Mein gesamtes Inventory basiert auf SOs und ist wie ein Baukastensystem 100% dynamisch konfigurier und erweiterbar. Damit bin ich sehr damit zufrieden und fand die Idee sehr charmant Events und geteilte Variablen wie im Talk vorgestellt zu entkoppeln. Zumal ich so recht einfach Daten in andere Szenen oder auch generell übertragen kann. Ich will auch nicht zu 100% darauf setzen und habe bisher sehr stark auf Events und Delegates gesetzt. Wollte es mal ausprobieren und hab gemerkt das es nicht trivial ist. Bin vorhin sogar über einen Blogpost von Ryan gestolpert wo er selbst sagt, das es nicht trivial ist. Leider sind seine Infos sehr spärlich: Gruß Hellhound
  3. Sagt mal, hat jemand von Euch Erfahrungen gemacht mit ScriptableObject Variablen und Events, wie es von Ryan Hipple auf der United 2017 präsentiert wurde? Ich finde den Beitrag sehr interessant, da ich ein großer Freund von Modularisierung und Entkopplung bin. Ich habe das komplette Konzept dahinter verstanden, allerdings ist das Beispiel wie in Talks üblich ziemlich trivial. Sobald ich in den Bereich von mehreren Instanzen komme, die sich keine konstanten Daten teilen habe ich jedoch ein Problem. Z.B. wenn ich ein Prefab habe, von dem beliebig viele Instanzen existieren können, wie z.B in einem RTS oder RPG. Eine Überlegung wäre es, beim Instanziieren des Prefabs auch die SO Elemente zu klonen die dynamisch sind, wir wollen ja nicht das alle Instanzen ein und die selben Wert zur Laufzeit hat, z.b. Health. Nur wie bekommen das die eigentlich entkoppelten Elemente mit, die das Original referenzieren? Irgendwie fehlt mir da die Idee zur richtigen Umsetzung. Hat jemand von Euch sich schon mal daran versucht bzw. eine Idee?
  4. Hallo zusammen, ich arbeite mich aktuell etwas in die Thematik der Behaviour Trees ein um eine AI umzusetzen. Dabei stellt sich mir die generelle Frage in welche Richtung ich das Design sinnvoller weise zu legen habe. Ich kann ja einerseits die Logik zum Großteil auf den Tree legen oder aber diesen mehr als übergeordnete Struktur nutzen und die Kernlogik in Eigenimplementationen legen. Ein einfaches Beispiel, was mir grad sozusagen vor die Füsse gefallen ist: Ich möchte, das die AI (und auch die Spielereinheit selbst) eine Einheit angreift, wenn diese in Reichweite gelangt ist und bestimmte Konditionen erfüllt sind. Dafür brauche ich spezifische Animationen (Zielen, Feuern, Laden, Mündungsfeuer) und auch Werte für die Gewichtung. Ich könnte nun die Logik durch spezifische Action-Tasks im Baum Abbilden: z.b. Wenn Ammo > 0. -> Sequenz -> Zielen -> Animation Schuss abspielen -> Animation Mündungsfeuer abspielen -> Ammo dekrement und von vorn bzw. Erweitern. Ich könnte auch einen komplexeren Action-Task, z.b. Schuss schreiben der die Punkte nach Zielen mit abdeckt und über Variablen im Blackboard referenziert. Das macht zumindest den Baum in identischen Abläufen schlanker. Grad bei Elementen mit einer hohen Varianz in der Ablauffolge sehe ich aber das Problem, dass ich mich hier tot modellieren kann, da ich je nach Waffe unterschiedliche Animationen, Sounds, MuzzleFlashes und auch Verhaltensweien haben kann (Bsp. M1 Grand das beim Wert Ammo == 0 immer den berühmten Pling Sound abspielen muss). Oder sollte ich hier den Behavour-Tree nur als Ankerpunkt nehmen, über Events in spezifische Implementationen wechseln, die anschließend über Events wieder Einfluss auf den Baum ausüben? Der Baum kann an sich ja schon recht komplex werden, wenn die AI mehrere Entscheidungen abwegen soll und nicht nur einfache Ablauffolgen wie: Eat, Sleep, Code, Repeat abdecken soll 😉 Hat hier jemand von Euch Erfahrung? Wie würdet Ihr vorgehen? Leider scheint es dazu wenig Input im Netz zu geben und die Beispiele reduzieren sich dann doch schnell auf solche simplen Ablauffolgen ...
  5. Ok, zumindest das Türschwellen Problem konnte ich dank der Unity-Doku beheben, das hatte ich zuvor übersehen. Durch erhöhen des Voxel-Space auf 10 wurden die engen Türen erkannt und können jetzt passiert werden. Sollte ich für Häuser generell ein eigenes NavMeshSurface nutzen? Aber soweit ich das verstehe, gibt es dann wieder autom. Links zwischen den NavMeshSurfaces, und damit auch ein WARP korrekt? Die Frage mit den Obstacles besteht nach wie vor ...
  6. Hallo zusammen, ich habe aktuell ein Problem mit den Unity Navmeshes. Aktuell verwende ich bereits die Unity Navmesh Components und nutze das NavmeshSurface zum Baken anstelle des Basis Baking-Mechanismus. Soweit so gut, klappt auch sehr gut. Nun habe ich in meiner Szene diverse Häuser, die begehbar sein müssen um hier später statische Deckungsposition definieren zu können. Wie man auf dem Screenshot gut sehen kann, wird das Gebäude selbst auch gut im Baking eingebunden, mit Ausnahme der Türen. An jeglichen Türen gibt es aktuell einen Bruch des Navmesh (rot markiert). Ich könnte hier, wie auch schon ausprobiert NavMeshLinks einsetzen um dies zu überbrücken. Das gefällt mir jedoch nicht, da es hier zu einem Warp des Avatars kommt, was total bescheuert ausschaut. Gibt es eine Möglichkeit das zu überbrücken? Ich habe auch schon versucht an den Sellen Panels/Cubes zu verwenden die kaum merklich über die Schwelle gehen um diese als Layer zu verwenden. Klappt aber nicht, das wird von Unity komplett ignoriert, wie man es an der Tür im Süden gut erkennen kann (das weiße Quad ist hier Walkable und kein Obstacle). Seht Ihr noch eine Möglichkeit? Desweiteren habe ich das Problem, das ich das Haus nicht gleichzeitig als Obstacle und Begehbares Objekt verwenden kann. D.h. im Normalfall wird das Haus zwar als Begehbare Fläche erkannt, dann kann aber der Avatar durch Wände laufen. Ich habe mir jetzt damit geholfen rund um das Gebäude kleine Quads zu sezten (Planes gingen aus irgen einem Grund nicht), die an den Stellen als Obstacle dienen (Im Screenshot deutlich als weiße Flächen zu erkennen). Ist aber sehr nervig, fisst enorm viel Zeit und zwingt mich manuell jedes Gebäude an zu fassen, zu modifizieren und ein Prefab zu erstellen. Hattet Ihr damit auch schon mal Probleme? Gibt es eine bessere Lösung? Viele Grüße Hellhound
  7. Wie es ausschaut gibt es in Unity keine Möglichkeit beide Canvas-Typen gleichzeitig zu nutzen. D.h. sie können zwar gleichzeitig genutzt werden, dürfen sich aber nicht überlappen. Der Overlay-Canvas scheint immer die höhere Priorität zu haben. Und wenn, wie in meinem Fall, ein UIElement über dem 3D-Objekt liegt, wird in den dahinter liegenden Objekten kein Hit mehr ermittelt. Die Sort-Order der Canvas-Objekte hat scheinbar hier keine Wirkung. D.h. ich muss in meinem Fall sicherstellen, dass der Hit über dem 3DObjekt nicht blockiert. Das kann ich auf 2 Arten erreichen: Deaktivieren des Raycasters am Overlay Canvas (Bringt mir nichts, da ich ja noch die UIElemente im Overlay nutzen will) Hinzufügen einer Canvas-Gruppe auf dem überdeckenden UI-Element und hier explizit das Blocking der Raycasts deaktivieren Durch den 2ten Schritt erreiche ich, dass die unter dem Overlay liegenden UIElemente am WorldCanvas auf die Events reagieren, nun muss ich halt zusätzlich, klassisch am 3D-Objekt ein Eventhandler einbauen um hier auf Click-Ereignisse reagieren zu können, damit ich mein Objekt rotieren kann ...
  8. Ich habe aktuell das Problem, dass meine WorldSpace Canvas UI-Objekte nicht auf Events reagieren, solange ich im parallel verwendeten ScreenSpaceOverlay-Canvas den Raycaster nicht deaktiviere. Ich muss jedoch beide Canvas parallel betreiben können, da ich über die WorldSpace-Canvas Objekte Menüs, die im ScreenSpace-Overlay angezeigt werden sollen, triggern muss. Folgendes habe ich laut Google schon probiert, alles ohne Effekt: Unterschiedliche Sorting Order in den Canvas Objekten (WorldSpace 0, Overlay 1) Unterschiedliche Layer und Tags WorldSpace-Event-Camera (Eigentlich eigene) auf MainSpace gesetzt und vice versa. Canvas Groups für beide Canvas hinzugefügt Blocking Masks in beiden Raycastern auf Nothing gesetzt Ich habe mal Screenshots meiner aktuellen Konfiguration der Canvas-Objekte und der Objekthierarchie hinzugefügt (Der Raycaster im WorldSpace ist inzwischen wieder aktiviert, das war nur ein Test). Habt Ihr evtl. noch Ideen, wie ich beide zusammen zum Laufen bekomme?
  9. 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 ...
  10. 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
  11. 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?
  12. 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
  13. 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
×
×
  • Create New...