Hellhound Geschrieben 8. Oktober 2017 Melden Share Geschrieben 8. Oktober 2017 Hallo zusammen, ich bin wiedereinmal an dem Punkt in meinem Customizer angekommen, wo ich versuchen will, Preview Images für meine Assets dynamisch zu erzeugen. Die Idee ist es aktuell dies direkt bei der Asset-Generierung zu machen, indem das ScriptableObject, welches dem Asset das Prefab zuweist auf dessen Basis auch das Rendering durchführt. Soweit so gut, hier einmal der dirty code, aus dem Editor-Skript des ScriptableObject: public void OnEnable() { //this.preview = AssetPreview.GetAssetPreview(prefab); this.texture = null; if (this.prefab != null && this.texture == null){ Debug.Log("Generate preview!"); string id = this.prefab.name; renderTexture = new RenderTexture(2048, 1600,(int)RenderTextureFormat.ARGB32); renderTexture.name = this.prefab.name; //Fake, später auf eigene Instanz umstellen this.camera = Instantiate<Camera>(GameObject.Find("Preview-Camera").GetComponent<Camera>()); if (camera != null) { Debug.Log("Camera instanz gefunden!" + this.prefab.name); camera.targetTexture = renderTexture; camera.gameObject.SetActive(false); //camera.cullingMask = LayerMask.NameToLayer(id); GameObject go = (GameObject)Instantiate(prefab); go.transform.position = new Vector3(0.0f, 1.0f, 0.0f); //go.transform.rotation = Quaternion.identity; this.SetLayerRecursively(go, LayerMask.NameToLayer("Weapon")); go.SetActive(true); camera.Render(); RenderTexture.active = camera.targetTexture; Texture2D texture = new Texture2D(camera.targetTexture.width, camera.targetTexture.height, TextureFormat.ARGB32, false); texture.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0); texture.Apply(); RenderTexture.active = null; this.texture = texture; Debug.Log("Camera instanz gerendert "); GameObject.DestroyImmediate(go); GameObject.DestroyImmediate(camera.gameObject); } } } Soweit so gut, klappt auch bei einem einzelnen Objekt. Dumm ist nur, wie ich festgestellt habe, das Unity die OnEnable Aufrufe der Scriptable-Objects parallel abarbeitet. Dies führt dazu das beim ersten Aufruf noch alles passt, dann aber in den Folgeaufrufen mehrere Objekte übereinannder gerendert werden, da die Aufrufe parallel sind und die vorherigen Objekte nicht schnell genug gelöscht werden. Die Idee die ich hatte war dann separate Scenen zu erzeugen. Darf ich aber nicht aus der OnEnable-Methode heraus. Für jedes Objekt Temporär einen Layer erzeugen, setzen, rendern und Löschen geht auch nicht so einfach. Jetzt gehen mir aktuell die Ideen aus. Da es sich später um größere Mengen an Objekten handelt, hätte ich das ganze gern einmalig gehabt, automatisch beim Anlegen des Scriptable Objektes und nicht dauerhaft zur Laufzeit ... Hat jemand von Euch evtl. einen Vorschlag für mich? Gruß Hellhound Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 8. Oktober 2017 Melden Share Geschrieben 8. Oktober 2017 Ich kenne mehrere Methoden, eine einfache Methode wäre, du speicherst dir die bereits belegten Position der Objekte - die gerade gerendert werden sollen - in einem globalen Array und gibst jedem Objekt (und zugehöriger Kamera) eine neue (nicht bereits belegte) Position in der Szene, damit können sich die Objekte nicht mehr überlagern. Es gibt auch noch eine Methode mit nur einer Kamera (ohne Verschiebung der Objekte) , aber dies ist deutlich komplexer und passt auch nicht zu deinem aktuellen Ansatz Helper-Objekte pro Scriptable zu erzeugen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Hellhound Geschrieben 8. Oktober 2017 Autor Melden Share Geschrieben 8. Oktober 2017 Danke für den Schlag auf den Hinterkopf. Manchmal sieht man echt den Wald vor lauter Bäumen nicht, wenn man sich irgendwo festbeist. Klingt machbar, wenn natürlich nicht so schön sauber, auch wenn es letztendlich egal ist, da die Objekte eh zerschlagen werden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.