Jump to content
Unity Insider Forum

GaRv3

Members
  • Content count

    286
  • Joined

  • Last visited

  • Days Won

    2

GaRv3 last won the day on May 5 2015

GaRv3 had the most liked content!

Community Reputation

27 Excellent

About GaRv3

  • Rank
    Advanced Member
  • Birthday 07/01/1980

Contact Methods

  • Website URL
    http://www.garvin-gurbat.de

Profile Information

  • Gender
    Male
  • Location
    Köln

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Doch, wenn man die Kanten scharf zeichnen lässt, splittet Unity die Vertices beim Import.
  2. Hmm, okay. Ich glaub, ich hab den Fehler gefunden. Sowohl der von Blender importierte, als auch der Primitive Cube haben 24 Vertices. Also hat jede Ecke ein Vertice pro angrenzendem Face. Dann werden die Normalen entsprechend berechnet und es entstehen die scharfen Kanten. Ich habe mit 8 Vertices (eins je Ecke) gearbeitet. Daher stehen die Normalen immer diagonal zum Face und der Shader versucht, das ganze abgerundet zu Schattieren.
  3. Hallo zusammen, ich hab gerade ein Problem bei der Darstellung von in Unity erstellten Models. Hier ein Screenshot eines einfachen Würfels: Links: Eigenes Model Mitte: Unity Primitive Cube Rechts: Blender Cube Ich erstelle die Vertices, setze die UV-Koordinaten, erstelle die Polygone und weise alles zu: Mesh mesh = new Mesh(); mesh.Clear(); mesh.vertices = vertices; mesh.uv = uvs; mesh.triangles = tris; mesh.RecalculateBounds(); mesh.RecalculateTangents(); mesh.RecalculateNormals(); mesh.name = "RockMesh"; meshFilter.mesh = mesh; meshCollider.sharedMesh = mesh; Das Material ist bei allen identisch. Jemand spontan ne Idee, wo der Fehler liegt? Komme irgendwie nicht drauf. Vielen Dank und beste Grüße GaRv3
  4. Weil concave MeshCollider in Unity absolut unbrauchbar sind.
  5. Hallo zusammen, ich habe ein paar Objekte, die über seeeeehr viele Box-Collider verfügen. Ich möchte hier bitte nicht über die Frage sprechen, ob Objekte so viele Collider brauchen. In diesem speziellen fall ist es so, da es keine andere Möglichkeit gibt, die Form des Objekts genau genug abzubilden, denn ein Mesh-Collider müsste convex sein, was in dem Kontext aber nicht funktioniert. Mein Problem ist nun folgendes: Beim öffnen der Szene, starten des Play Modes und selektieren eines der Objekte hängt der Editor immer für einige Sekunden. Beim Selektieren eines Objekts liegt das in erster Linie am Rendern des Inspektors - InspectorWindow.DrawEditors() braucht mal eben 8,5s und BoxColliderEditor.OnEnable() dauert bei z.B. 562 BoxCollidern über 3,5s. Nach dem Selektieren des Objekts hängt der Editor also erst mal gute 12 Sekunden. Schlimmer ist es beim Wechsel in den Play Mode bzw. Laden der Szene. Hier hängt der Editor mehrere Minuten, ich kann mir aber noch nicht genau erklären, wieso dies so extrem ist. Eigentlich sollte das ja nicht mit dem Inspektor zusammenhängen. Es ist auch unabhängig davon, ob ich ein Objekt selektiert habe. Das Editorscript der Objekte setzt die HideFlags der BoxCollider immer entsprechend, sodass sie nicht im Inspektor angezeigt werden. Dadurch geht das Selektieren des Objekts ab dem zweiten mal gewohnt schnell. Anscheinend werden die HideFlags aber nicht gespeichert, sodass die Collider bei erneutem Selektieren nach dem Starten/Stoppen des Play Modes bzw. Neuladen der Szene wieder erscheinen und ich die erwähnte Verzögerung habe. Hat jemand eine Idee, wie ich die Collider dauerhaft ausblenden kann und woher die extrem langen Wartezeiten beim Starten/Stoppen/Laden kommen? Vielen Dank und beste Grüße GaRv3 EDIT: Ich konnte nun zumindest herausfinden, was beim Verlassen des Play Modes den Freeze verursacht: Prefabs.MergePrefabs braucht 585 Sekunden(!). Woran kann das liegen? Ich habe zwar einige Prefabs in der Szene, aber das kann nicht normal sein und ist mir bisher so auch noch nie aufgefallen. EDIT 2: Das erste Problem (langsames Rendern des Inspectors) habe ich nun gelöst, indem ich die HideFlags der Collider in OnEnable() des GameObjects selbst setze und nicht im dazugehörigen EditorScript. Merke: Beim Selektieren eines Objekts wird es zunächst selbst aktiviert und erst dann der Inspektor geladen. Bleiben noch die Prefabprobleme! EDIT 3: MergePrefabs braucht auch beim Starten des Play Modes 612 Sekunden.
  6. GaRv3

    Mehrdimensionales NativeArray?

    Danke für deine Antwort. Habe es inzwischen genau so gelöst. Allerdings habe ich aktuell erst mal direkt selbst Threads implementiert. Mit dem Jobsystem werde ich mich in den kommenden Tagen beschäftigen.
  7. Hallo zusammen, ich arbeite mich gerade in das neue C# Jobsystem der aktuellen Beta ein und möchte es u.a. für Performanceoptimierungen von Voxelsystemen nutzen. Naturgemäß nutze ich ein dreidimensionales Array, welches die Informationen der einzelnen Voxel enthält. Das Jobsystem erlaubt aber nicht die nutzung von Arrays, da das Array ein Referenztyp ist und im Jobsystem nur Werttypen erlaubt sind. Macht ja auch irgendwie Sinn, da man sonst wieder in Race Conditions laufen könnte. Meine Frage ist, wie ich ein dreidimensionales Array (Block[,,]) in ein dreidimensionales NativeArray<Block> umwandeln kann. Irgendwie fällt mir dazu nichts ein. Vielen Dank und beste Grüße garv3
  8. Ich habe schon verstanden, wie das ganze funktioniert. Allerdings glaube ich, dass es schon seit einer ganzen Weile nicht mehr über die RGBA-Kanäle läuft, denn man kann inzwischen beliebig viele Texturen auf ein Terrain "malen". Daher wird - wenn ich das richtig verstanden habe - eben nicht mehr auf die vier Kanäle zugegriffen, sondern Splatmaps genutzt, die in der dritten Dimension (eine je Textur) des Splatmap-Arrays gesetzt werden. Die erste und zweite Dimension (x, y) stellen ja die Position auf dem Terrain, also den "Pixel" der Splatmap dar und sind somit auf je 2048 begrenzt. Das Problem ist genau dieses System. Eigentlich liegt es im Shader. Es geht mit ja nur um Echtzeitmanipulation der Texturen. Ich will zur Laufzeit bestimmte Texturen aufzeichnen und wieder entfernen können. Ich kann die einzelnen Werte der Splatmap zwar problemlos per Script anpassen, allerdings müsste ich eine Kopie der ursprünglichen Splatmaps speichern, um die Änderungen an bestimmten Stellen wieder rückgängig machen zu können. Vermutlich bleibt mir aber nichts anderes übrig... :-/
  9. Hallo zusammen, ich würde über die Texturen meines Terrains gern weitere Texturen legen, die aber anders kombiniert werden sollen. Bei dem normalen Terrain werden die Texturen ja über Alphamaps kombiniert. Das ist grundsätzlich auch ok für mich, aber sie werden einfach ungünstig kombiniert. Die Summe der Alphawerte muss immer 1 ergeben. Ist die Summe höher, entstehen unschöne Effekte. Ich hätte gern die Möglichkeit, einzelne "Layer" auf 1 zu setzen, die dann alle darunterliegenden einfach verdecken. Wenn ich bei map[x, y, 0] = 0.6f; map[x, y, 1] = 0.4f; map[x, y, 2] = 0; nur noch Textur 2 Anzeigen will, muss ich die Werte wie folgt ändern: map[x, y, 0] = 0; map[x, y, 1] = 0; map[x, y, 2] = 1; Möchte ich nun aber wieder zurückwechseln, muss ich die Werte für die Texturen 0 und 1 noch kennen. Andernfalls kann ich Textur 2 nicht einfach wieder ausblenden. Gibt es eine Möglichkeit, dass der Alphawert wirklich nur die Deckkraft der jeweiligen Textur bestimmt und sie damit die darunterliegenden einfach verdeckt? Etwa so: map[x, y, 0] = 0.6f; map[x, y, 1] = 0.4f; map[x, y, 2] = 1; Dann könnte ich die 1 bei Bedarf einfach wieder in 0 ändern und hätte die selbe Texturkombination wie zuvor. Das ganze würde ich gern nutzen, um Details auf dem Terrain ein- und wieder auszublenden. Vielen Dank im Voraus für alle Hinweise! garv3
  10. GaRv3

    Listentyp mit schnellem Suchalgorithmus

    Hehe, also ist ein Dictionary praktisch nur eine handlichere Version eines HashTables!? Ich werde erst mal diesen Weg gehen. Vielleicht haut es ja hin. Ich muss halt nur immer eindeutige Hashes erzeugen.
  11. GaRv3

    Listentyp mit schnellem Suchalgorithmus

    Hmm, okay.. Bei einem Hashset kann man keine Elemente auslesen. Daher wird es wohl doch ein Disctionary werden... Ich berichte dann
  12. Hallo zusammen, ich habe eine Klasse "KlasseX" in einer Datei "KlasseX.cs", auf welche ich aus anderen Scripts zugreife. Das funktioniert auch einwandfrei. Das Projekt kompiliert problemlos und startet im Player. Allerdings erkennt Visual Studio die Klasse nicht. Die Datei wird zwar im Projektmappen-Explorer angezeigt, die Klasse (als Kindelement der Scriptdatei) wird aber nicht gefunden. Entsprechend wird in den anderen Scripts bei Verweisen auch der Fehler "Der Typ- oder Namespace "KlasseX" wurde nicht gefunden..." angezeigt. Die Codevervollständigung funktioniert entsprechend auch nicht. Das Problem besteht aber halt nur in VS. In Unity werdern keine Compilerfehler angezeigt. Weiß jemand, woran das liegen könnte? Vielen Dank im Voraus! garv3 Edit: OK, hab die Lösung selbst gefunden: Im Projektmappen-Explorer das Projekt auswählen und auf "Aktualisieren" klicken, führt zum Erfolg. Das ist interessant, da ein Schließen und erneutes Öffnen der Projektmappe nicht geholfen hat.
  13. GaRv3

    Listentyp mit schnellem Suchalgorithmus

    Ja, das sind alles valide Argumente. Ich glaube, das ganze könnte letztendlich doch etwas komplizierter werden. Sobald ich es komplett durchdacht habe, werde ich hier mal die Klassen und meinen Lösungsansatz posten. Ich denke, dann wird alles ziemlich deutlich. Derzeit habe ich sogar eine Theorie im Kopf, die mit einem einzigen HashSet funktionieren könnte, aber das muss ich erst noch überprüfen. Vielen, vielen Dank schon mal für eure Hilfe!
  14. GaRv3

    Listentyp mit schnellem Suchalgorithmus

    Danke für den Denkanstoß! Also erstelle ich drei Hashtables. Aus jedem Objekt erstelle ich dann den jeweiligen Hashcodes und füge es in alle drei Hashtables ein. Bei einer Suche des ersten Typs suche ein oder ggf. zwei mal im ersten Hashtable. Bei einer Suche des zweiten Typs suche ich im zweiten und dritten Hashtable. War das so deine Idee? Grundsätzlich eine gute Idee, obwohl dies natürlich den dreifachen Speicher erfordert. Jetzt stellt sich mir noch die Frage, wie ich eindeutige Hashes erstellen kann. Oder ich nehme HashSets. Die benötigen ja keine eindeutigen Hashes.
  15. GaRv3

    Listentyp mit schnellem Suchalgorithmus

    Hi Sascha, Erstmal vielen dank für deine Antwort! Das sieht grundsätzlich auch nach einer schönen Struktur aus. Leider wird diese in meinem Fall nicht funktionieren. Das liegt im Wesentlichen an zwei Problemen: 1. x und y sind keine Zahlenwerte. Hier habe ich in meinem Beispiel wohl unschöne Bezeichner verwendet. Es handelt sich dabei um eher komplexe Datentypen bzw. u.U. Instanzen anderer Klassen. Daher kann ich leider nicht mit der Summe der beiden Variablen vorsortieren. Das könnte ich aber theoretisch über Hashwerte lösen. 2. Viel entscheidender ist, dass ich x und y (und deren Summe/Hash) eben nicht immer kenne. Im Fall meiner ersten Beispielsuche kenne ich sie, aber im zweiten Beispiel ist nur einer der beiden Werte (suche.x) bekannt. Dieser muss in x und y der Objekte in der Liste gesucht werden, aber unabhängig vom jeweils anderen Wert. Als Beispiel habe ich obj01 - obj07 angenommen, die jeweils in x oder y der Listenelemente stecken können. Hier die Beispielliste (Die Nummerierung ist nur zur Veranschaulichung. Die Liste muss nicht sortiert oder sortierbar sein!): 1. x=obj05; y=obj02 2. x=obj01; y=obj04 3. x=obj04; y=obj03 4. x=obj07; y=obj01 5. x=obj06; y=obj07 6. x=obj04; y=obj01 Beispielsuche 1: "Finde alle Elemente mit obj01 und obj04, also "(x == obj01 && y == obj04) || (x == obj04 && y == obj01)". Das ergibt dann die Einträge 2 und 6. Beispielsuche 2: "Finde alle Objekte, die obj04 enthalten, also "x == obj04 || y == obj04". Das ergibt die Einträge 2, 3 und 6. Hier ist der jeweils andere Wert vor der Suche nicht bekannt. Dadurch kann ich auch nicht nach einem vorher definierten Hasch (oder einer Summe) vorsortieren. Hast du (oder jemand anders) vielleicht noch eine Idee? Dank und Gruß garv3
×