Jump to content
Unity Insider Forum

Preview Generator


Hellhound

Recommended Posts

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...