Jump to content
Unity Insider Forum

Zer0Cool

Members
  • Posts

    2,040
  • Joined

  • Last visited

  • Days Won

    145

Everything posted by Zer0Cool

  1. Im Model Import-Fenster auf den Tab Animation: Bei der Animation dann Haken rein bei "Look Time" bzw. "Loop Pose" Die grünen Kreise (= ok) zeigen an, ob die Frames für den Loop korrekt gesetzt sind.
  2. Mal ein Videowunsch von mir. Könntest du mal ein Video machen (oder mehrere) für einen totalen Blender-Änfänger mit folgendem Inhalt: - Erklärung der verschiedenen Version - Installation - UI-Basics, also Menüpunkte oder Tastenkürzel die man immer wieder braucht (Einstellung aller UI-Fenster) - Erklärung wichtiger Operationen - Erstellung einiger simpler Geometrie: Treppen, Wände, kleines Haus, Fässer, Felsen (einfache Geometrie die man in einem Spiel so braucht, muss ja nicht gleich ein ganzes Schloss sein) - Texturing, UV-Mapping einzelner einfacher Objekte - Erstellung eines Texturatlas für X-Objekte
  3. Schönes Video, dieses Tool kannst ich noch nicht, warum deaktivierst du sRGB im Diffuse-Slot?
  4. Schönes Ding, dann setz ich da doch mal ein Kommentar drunter damit der Algorithmus es findet
  5. Falls es jemand gebrauchen kann, hier eine kleine Klasse die den Spieler mehrere zuvor zugewiesene Ziele betrachten lässt. Der Spieler dreht dabei seinen Körper und seinen Kopf in Richtung des Ziels welches am besten mit seiner Sichtlinie übereinstimmt. Die Distanz des Ziels wird dabei ebenfalls mit betrachtet, allerdings nur sehr rudimentär. Ich habe noch zusätzlich eingebaut, dass der Spieler seinen rechten Arm in Richtung des aktuellen Ziels bewegt (lässt sich deaktivieren über eine Property). using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))] public class IKControl : MonoBehaviour { public Transform[] lookObj = null; public float weightDamping = 1.5f; public float maxDistance = 10f; public bool RightHandToTarget = true; private Animator animator; private Transform lastPrimaryTarget; private Quaternion savedRotation; private float lerpEndDistance = 0.1f; private float finalLookWeight = 0; private bool transitionToNextTarget = false; void Start() { animator = GetComponent<Animator>(); } // Callback for calculating IK void OnAnimatorIK() { if (lookObj != null) { Transform primaryTarget = null; float closestLookWeight = 0; // Here we find the target which is closest (by angle) to the players view line foreach (Transform target in lookObj) { Vector3 lookAt = target.position - transform.position; lookAt.y = 0f; // Filter out all objects that are too far away if (lookAt.magnitude > maxDistance) continue; // Find best matching object to the players view line float dotProduct = Vector3.Dot(new Vector3(transform.forward.x, 0f, transform.forward.z).normalized, lookAt.normalized); float lookWeight = Mathf.Clamp(dotProduct, 0f, 1f); if (lookWeight > closestLookWeight) { closestLookWeight = lookWeight; primaryTarget = target; } } if (primaryTarget != null) { if ((lastPrimaryTarget != null) && (lastPrimaryTarget != primaryTarget) && (finalLookWeight > 0f)) { // Here we start a new transition because the player looks already to a target but // we have found another target the player should look at transitionToNextTarget = true; } } // The player is in a neutral look position but has found a new target if ((primaryTarget != null) && !transitionToNextTarget) { lastPrimaryTarget = primaryTarget; finalLookWeight = Mathf.Lerp(finalLookWeight, closestLookWeight, Time.deltaTime * weightDamping); float bodyWeight = finalLookWeight * .75f; animator.SetLookAtWeight(finalLookWeight, bodyWeight, 1f); animator.SetLookAtPosition(primaryTarget.position); if (RightHandToTarget) { Vector3 relativePos = primaryTarget.position - transform.position; Quaternion rotationtoTarget = Quaternion.LookRotation(relativePos, Vector3.up); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, finalLookWeight); animator.SetIKRotation(AvatarIKGoal.RightHand, rotationtoTarget); animator.SetIKPositionWeight(AvatarIKGoal.RightHand, finalLookWeight* 0.5f * closestLookWeight); animator.SetIKPosition(AvatarIKGoal.RightHand, primaryTarget.position); } } // Let the player smoothly look away from the last target to the neutral look position if ((primaryTarget == null && lastPrimaryTarget != null) || transitionToNextTarget) { finalLookWeight = Mathf.Lerp(finalLookWeight, 0f, Time.deltaTime * weightDamping); float bodyWeight = finalLookWeight * .75f; animator.SetLookAtWeight(finalLookWeight, bodyWeight, 1f); animator.SetLookAtPosition(lastPrimaryTarget.position); if (RightHandToTarget) { Vector3 relativePos = lastPrimaryTarget.position - transform.position; Quaternion rotationtoTarget = Quaternion.LookRotation(relativePos, Vector3.up); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, finalLookWeight); animator.SetIKRotation(AvatarIKGoal.RightHand, rotationtoTarget); animator.SetIKPositionWeight(AvatarIKGoal.RightHand, finalLookWeight*0.5f * closestLookWeight); animator.SetIKPosition(AvatarIKGoal.RightHand, lastPrimaryTarget.position); } if (finalLookWeight < lerpEndDistance) { transitionToNextTarget = false; finalLookWeight = 0f; lastPrimaryTarget = null; } } } } }
  6. Ich hatte die Punkte und Linien so "gemalt" und den Quellcode unterschlagen, da es quick und dirty war, aber wenn es dir hilft. Diese Klasse an den 2D-Collider hängen der die Collision bekommt (die Gizmos siehst du nur im Sceneview). Wenn gerade keine Collision stattfindet zeichnet er trotzdem die letzte Collision. using System.Collections; using System.Collections.Generic; using UnityEngine; public class DrawCollider2D : MonoBehaviour { private List<Vector3> contactPoints; private List<Vector3> normalPoints; void OnCollisionEnter2D(Collision2D collision) { contactPoints = new List<Vector3>(); normalPoints = new List<Vector3>(); ContactPoint2D[] contactPoint2d = collision.contacts; foreach (ContactPoint2D cPoint in contactPoint2d) { contactPoints.Add(cPoint.point); normalPoints.Add(cPoint.normal); } } void OnDrawGizmosSelected() { if (contactPoints != null) { Gizmos.color = Color.blue; foreach (Vector3 cPoint in contactPoints) { Gizmos.DrawWireSphere(cPoint, 0.02f); } } if (normalPoints != null) { Gizmos.color = Color.red; int i = 0; foreach (Vector3 nPoint in normalPoints) { Gizmos.DrawLine(contactPoints[i], contactPoints[i] + nPoint); i++; } } } }
  7. Wenn du die Kontaktpunkte und die Normalen-Vektoren bei einer Kollision ausliest, dann sieht das in etwa so aus. An der Richtung der (beiden) Normalenvektoren kannst du also erkennen, auf welcher Seite des Box-Colliders die Kollision stattgefunden hat (wie Sascha schon geschrieben hatte). (rot = Normalenvektoren / blau = Kollisionspunkte / grün Boxcollider)
  8. Schau mal ob das Windows-Form oder Formular folgende Eigenschaft hat. Diese Eigenschaft sollte das Formular permanent im Vordergrund halten. this.TopMost = true;
  9. Sehe ich auch so, einige Kurse oder Zertifikate sind das Papier nicht wert auf dem sie stehen. Ich denke ein gutes Portfolio und Referenzen über die Mitarbeit bei anderen Projekten ist hier mehr Wert als solche Zertifikate. Man muss sich immer die Frage stellen, welche Programmierer würde ich selbst für mein Projekt einstellen.
  10. Hab mir nicht alles im Detail angeschaut, aber was er hier macht ist, er erzeugt eine Instanz aus dem Ability-Asset (ScriptableObject) mit dem Namen "_abilityName" und läd das Asset dabei über Resources.Load. Danach packt er diese Ability zu den verfügbaren Abilities des Spielers.
  11. Noch eine kleine Ergänzung. Game Design (in Richtung Level Design) hat für mich auch sehr viel mit Architektur im Allgemeinen zu tun, in gewissem Sinne vermischen sich dabei Skills wie künstlerisches Empfinden die eher in Richtung Art-Design gehen (wie Techniken aus der Malerei, Kunstgeschichte, Farblehre und ähnliches) oder aber auch technische Expertise die eher in Richtung Architektur geht (Techniken der historischen und modernen Architektur). Beides hat damit erst einmal nichts mit Programmieren oder 3D-Design (verwendete Tool oder Expertise mit diesen Tools) zu tun. Versteht man unter den Aufgaben des Game-Designers dann ebenfalls Aufgaben wie Story-Design, Charakter-Design, Game-Logiken und ähnliche Dinge dann kann man den Begriff des Game-Designers um diese Aufgabenbereiche erweitern, was dann ggf. weitere Skills des Game-Designers in diesen Themenbereichen erfordern kann. Gleiches gilt dann eben auch für einen Game-Designer der ebenfalls 3D-Art produzieren kann, was den Vorteil hat, das diese Assets sich dann perfekt in die geplante Game-Architektur (Level-Design) einbinden lassen, da sie diesem Konzept bereits entsprechen.
  12. Ich beziehe mich mal nicht direkt auf URP aber auf deine Frage und gehe davon aus, das sie eigentlich nicht URP-spezifisch ist. Also die Checkbox in den Unity Lightning-Settings für Ambient Occlusion ist für den Lightmapper und hat daher nur einen Effekt wenn du eine Lightmap für die Scene erstellst. Im Postprocessing (auch URP) gibt es einen eigenen Ambient Occlusion-Effekt der aber nichts mit dem Haken in den Unity Lightnings-Settings zu tun hat. Hierbei wird das Kamerabild der Scene nachträglich über diesen Effekt modifiziert. Du kannst also sowohl die AO in deiner erstellten Lightmap aktivieren und extra über einen Kamera-Postprocessing-Effekt abermals AO hinzufügen. Deine letzte Frage mit dem "klares Licht" habe ich nicht verstanden.
  13. Funktionieren die Lampen auch ohne Post-Processing-Effekte (vor allem Bloom?) und HDR oder anderes formuliert funktionieren sie auch im Gamma Color Space ohne HDR (Hintergrund der Frage ist, dass man dann so Sachen in die Assets einfügt wie Point Lights, Spot Lights und Area Lights in verschiedenen Varianten dann auch für den Linear Color Space da man hier dann ja quasi 2 Lichtquellen haben kann mit Emissive Materials). Wenn sie es nicht schon haben, ist es immer gut, wenn jede Lampe ein kleines Script besitzt mit dessen Hilfe man die Eigenschaften der Lampe verstellen kann, wie Farbe, Leuchtkraft usw. Ansonsten schöne Arbeit
  14. Versuch mal den "Library"-Folder des Projektes zu löschen (vorher Unity beenden) und dann das Projekt neu in Unity zu öffnen (vorher aber am besten ein Backup machen wie immer). Wenn das alles nicht geholfen hat, dann könnte man auch die Projektsettings komplett zurücksetzen (d.h. das Verzeichnis "ProjectSettings" ebenfalls löschen), aber das würde ich erstmal nicht machen (weil hier kann man auch "Projektdaten" verlieren wie gesetzte Tags / Layers usw.).
  15. Macht schon wesentlich mehr her, nun sieht man auch das der Charakter sich ansonsten "frei" bewegen kann Ich denke man könnte noch viel an der Kamera basteln, aktuell sieht die Verfolgung des Charakters sehr "steif" aus (vielleicht auch nur ein Smooth-Follow-Setting an deiner aktuellen Kamera) und dadurch sieht es so aus als ob die Geometrie sich unter dem Charakter dreht. Ansonsten muss man sich halt überlegen wie man dem Zuschauer über die Kamera das Bewegen des Charakters über die Oberflächen noch besser vermittelt.
  16. Schaut nice aus, aber nun musst du auch springen, sonst gibt es ja keinen Gravitationseffekt Zudem kannst du ja mal den Unity Character aus den alten Unity-Standard-Assets nehmen, damit du auch eine Laufanimation hast, den Rest kann man ja einfach über Board werfen. Übrigens die alten Unity Standard-Assets kann man sich noch über die Downloadseite holen (oder im Store aber die Version schien mir älter): https://unity3d.com/de/get-unity/download/archive Dann auf Unity 2018 und ganz nach unten zur Version "Unity 2018.1.9" (hab ich heute auch mal gemacht)
  17. Die angehängten Dateien waren verschwunden, ich habe es mal erneuert (zum Glück waren sie noch auf meiner Platte).
  18. Bin jetzt nicht so der Blender-Import-Profi, aber wenn 2 Meshes unter dem Gameobject in Unity existieren (nachdem man das Asset in die Szene gezogen hat) dann vemute ich das Unity hier ein Mesh mit einem Submesh erzeugt. Es wäre besser diese beiden Meshes jeweils nur einem Gameobjekt zuzuordnen, ich denke das geht auch noch nachdem man das FBX aus Blender in ein Unity-Asset importiert hat. Wenn du die beiden Meshes jeweils einem Gameobject zugeordnet hast kannst du diese dann wieder ganz normal über Code ansprechen oder über eine Unity-Animation animieren. Eventuell kannst du aus dem Originalasset auch gleich 2 Assets in Unity erzeugen, wobei dann jedes Asset dann nur 1 Mesh enthält. Notfalls kann man auch aus einem Gameobjekt in der Szene wieder ein Asset erzeugen (sollte man die Meshes des Assets in der Assetview nicht aufteilen können) Wegen der Materialien, beim Import kannst du unter "Material Creation Mode" "none" angeben, dann importiert Unity keine Materialien aus dem FBX (und erzeugt wohl ein einfaches Diffuse-Material).
  19. In Unity gibt es den alten Textmesh: https://docs.unity3d.com/Manual/class-TextMesh.html oder https://assetstore.unity.com/packages/essentials/beta-projects/textmesh-pro-84126 (kostenlos)
  20. Hallo zusammen, bin wieder "am Start", war 6 Wochen "am Erholen" , aber nun schau ich wieder regelmäßig rein ;)

    1. Kojote

      Kojote

      Na dann Willkommen zurück! ^_^

  21. Ich bin ja immer auf der Suche nach hilfreichen Shadern und Tools. Wer ein fließendes Gewässer in sein Spiel einbauen möchte steht denke ich vor einigen Herausforderungen. Zum einen soll es halbwegs natürlich Ausehen aber eben auch nicht viel Performance fressen (siehe Water Assets von Unity).

    Zudem brauch man auch nicht immer gleich einen ganzen Ozean. Oft möchte man nur kleine Tümpel, kleine Flüsse oder einen Wasserfall visualisieren. Wenn die Lösung dann nichts kostet umso besser.

    Folgenden kleinen Fluss (aus der Demoszene) ist mit einem Shader des Tools "Vertex Painter" erstellt. Diesen kleinen Fluss habe ich zudem um eine Reflectionmap angereichert. 

    Das Tool ist leider nicht einfach zu Bedienen, also wenn ihr Fragen habt ...

    Hier ein kleiner Video wie solch ein kleiner Fluss aussehen kann. Da das Ganze nur ein Mesh mit einem Shader drauf ist, ist die Performance Vernachlässigbar. Zudem kann man Flussrichtung, Reflektionen, Farbe des Wassers, Wellenform einstellen.

    Video:
    https://streamable.com/tnw4f


    yPX9ra7.jpg

    1. Thariel

      Thariel

      Es gibt ein krasses Asset dafür, zum schauen, wie es andere machen :) https://goo.gl/qNwr1f

    2. Zer0Cool

      Zer0Cool

      Ja, das kannte ich auch schon, hab's aber nicht gekauft. Aber mal ehrlich, mal abgesehen vom Sound, den zusätzlichen Partikeleffekten (und dem passenden Flussbett) finde ich nicht, daß es optisch besser aussieht.

      Aber klar, für alle "All-In-One-Lösung" und für jemanden der sich nicht durch den obigen Shader "durchwuseln" möchte ist dieses Asset schon recht genial, zum man damit auch gleich die passenden Meshes erzeugen kann und das Abgleichen des Flussmeshes ans Terrain sieht auch interessant aus.

      Muss man das Flussbett eigentlich noch per Hand ergänzen?
      Dies könnte man nämlich auch automatisch erzeugen, indem man die UVs des Terrainmeshes ausliest, die UVs dem generiertem Mesh zuordnet und dem  River-Material-Shader die Splatmaptexturen des Terrains zuweist.
      Oder er schaltet der Material einfach nur auf transparent und man muss das Flussbett selbst ergänzen?

    3. Lonely World

      Lonely World

      Wäre auch interessiert :D

  22. Ich denke du hast die Syntax für ein Insert-Statement erwischt, bei einem Update ist die Syntax so: UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
  23. Ich habe heute weiter an meinem Overlayshader gearbeitet und einen kleinen Helfer programmiert, womit man innerhalb der Sceneview direkt auf einen Mesh eine Maske malen kann. Das Ganze ist ein Editorskript welches in eine Textur zeichnet und diese Textur wird dann an meinen Overlayshader übergeben.
    Der Overlayshader stellt die Textur über einen seiner Slots dar. Über dieses Tool soll man dann im Szeneview eine Maskentextur erzeugen können, um Overlays an bestimmten Stellen ein- und auszublenden zu können:

    Video:
    https://streamable.com/9rys8
    https://streamable.com/sb5wf

    Mit dem im Video gezeigten Tool direkt auf den Mesh gemalt:
    E5cG3xb.jpg

    Der Overlayshader selbst kann mehrere Overlaytexturen auf einer Haupttextur abbilden. Dabei kann sowohl die UV0 als auch die UV1 (Lightmap UV) verwendet werden. Das Overlay kann dabei "Linear" oder "Additive" eingeblendet werden, hat ein eigenes Tiling/Offset und eine eigene Normaltextur. Das Prinzip ist ähnlich wie die Detail Albedo des Standardshaders (und seiner Detailmask) nur das man eben mehrere Overlays verwenden kann, die Stärke der Overlays bestimmen kann (Opacity) und den Overlaymode frei wählen kann. Ansonsten entspricht der Overlayshader dem Standardshader (PBS Surfaceshader).
    Zudem habe ich den Overlayshader nun noch um Vertexfarben erweitert. Damit kann man nun anhand der Vertexfarben ebenfalls die Overlays Ein-  und Aus- oder Überblenden

    Overlayshader:
    KyxzakTg.png


    Definition einer Kante anhand von Vertexfarben (= schwarze Streifen) an der die Overlays ausgeblendet werden sollen:gsTWzo9.png

    Ergebnis (ausgeblendetes Overlay im Bereich der Kante):

    JtkkSh3.jpg
     

    Mal ein Beispielbild einer kompletten Wand die mit 2 Overlays "verziert" wurde:
    7lwfBaY.jpg

    Bilder (c) by Kojote ;)

    1. Zer0Cool

      Zer0Cool

      Ich habe den Mask Painter heute weiter verfeinert, hier einmal ein typischer Anwendungsfall. Man hat eine Overlaytextur auf einer Wand und möchte bestimmte Bereiche dieses Overlays ausblenden. Über den Painter wählt man aus, ob man UV0 oder UV1 des Meshes verwenden möchte (und noch andere EInstellungen) und malt drauf los. Der Painter erzeugt beim Malen eine Textur und legt sie zur Visualisierung als Overlay auf den Overlayshader des aktuellen Wand-Materials. Ist man fertig, wird die erzeugte Textur als PNG gespeichert (und der Alpha invertiert). Zum Schluss verwendet man die so erzeugte Textur nun als Maske im Overlayshader (Material) des Meshes.

      VIdeo:
      https://streamable.com/jzhwa

       

  24. So heute einmal mit "Custom-Editoren" beschäftigt, da ich nun doch einzelne "Decorator-Drawer" im Skript herausgeschmissen habe.

    So Sachen wie Logo's und Label-Bereiche und Buttons waren etwas kniffelig. Zudem gibt es verschiedene Layout-Klassen die man in einem Custom-Editor mixen muss, daß hat Unity nicht gut gelöst...

    Hier das aktuelle Ergebnis:
    CjLqAdU.png

    1. Zer0Cool

      Zer0Cool

      Umpf, eine Coroutine zu erzeugen und eine Progressbar für das Editorskript anzuzeigen (nachdem man einen Button drückt) war ja mal eine weitere Herausforderung oO

    2. Sascha

      Sascha

      Klingt, als hättest du gerne Odin :)

    3. Zer0Cool

      Zer0Cool

      Das wäre bestimmt eine Alternative, aber die internen EditorUI-Methoden von Unity selber können mittlerweile auch schon recht viel, man muss nur immer die richtige Methode finden und wissen wie man sie richtig einbaut..., was halt unschön ist, es gibt mittlerweile 4 Klassen womit man UI-Elemente zeichnen kann, es wäre besser Unity hätte alles in eine Klasse zusammengefasst, so ist man immer am Suchen, welches Layoutelement man über welcher Klasse darstellen muss...

      Mittlerweile funktioniert aber alles über eine Art "Autolayout" (wenn man die richtige Klasse verwendet), was das Erstellen der UI sehr erleichtert.

×
×
  • Create New...