Item-Icons, gerendert aus 3D-Modellen
Verwandle die eigenen Prefabs des Spiels in konsistente Icon-Sprites aus dem Code: eine isolierte Vorschauszene, eine orthografische Kamera mit drei gerichteten Lichtern, eine pro Modell gewählte Pose, ein 2× Supersampling-Render, herunterskaliert mit Pre-Multiplikation und einem dunklen Umriss, damit die Icons auf jedem Hintergrund lesbar sind. Wiederholbar – generiere neu, wenn sich Kunst oder Gegenstandsformen ändern.
Arbeitsablauf
- Pipeline prüfen. Die Vorlage zielt auf URP (
UniversalAdditionalCameraData). Für Built-in: lösche den Block; für HDRP verwendeHDAdditionalCameraDataund deaktiviere Post-Processing auf dieselbe Weise. - Kopiere
templates/Editor/ModelIconRenderer.csin einen Nur-Editor-Ordner/asmdef (verweist auf URP-Runtime, wenn ein asmdef verwendet wird) und benenne den Namespace um. - Entscheide die Zuordnung von Spieldaten zu Aufträgen: welches Prefab repräsentiert welchen Gegenstand, sein Zellenfußabdruck (1×1 für einfache Icons; die Rasterform des Gegenstands für Raster-Inventare) und der Ausgabepfad. Behalte diese Zuordnung im Content-Code des Projekts, nicht im Renderer.
- Rufe
ModelIconRenderer.RenderBatch(jobs)von einem Menüpunkt oder dem Content-Build-Schritt auf, weise dann die resultierenden Sprites den Gegenstandsdaten zu (AssetDatabase.LoadAssetAtPath<Sprite>(path)),SetDirty,SaveAssets. PNGs werden als Sprites importiert (Alpha ist Transparenz, keine Mipmaps). - Betrachte jedes Icon mit
scripts/icon_sheet.pyund korrigiere Ausreißer pro Gegenstand (siehe Review-Schleife), anstatt die globalen Heuristiken zu verändern. - Comitte die PNGs per Git LFS. Committe keine Icons, die aus lizenzierter Kunst gerendert wurden, in öffentliche Repos.
Wie die Pose gewählt wird
- Langgestreckte Modelle (längste Achse > 1,6× die mittlere: Schwerter, Stäbe, Pfeile, Zauberstäbe) werden entlang der Längsachse des Slots gelegt – vertikal in hohen Slots, horizontal in breiten, diagonal in quadratischen Slots – und dann um 25° um diese Achse gedreht, sodass die Seite zur Kamera zeigt.
- Kompakte Modelle (Edelsteine, Tränke, Bücher, Truhen) beginnen mit einer aufrechten 3/4-Ansicht, dann rendert ein Durchlauf von Gier (-90…90), Nick (-50, -25, 0) und Roll (0…135) eine kleine Testprobe und behält die Ansicht mit den meisten Silhouetten-Pixeln. Pixelabdeckung statt Bounding-Boxen vermeidet, dass dünne Diagonale gewinnen; frontale Ansichten werden um 7% bestraft, da sie flach wirken; die automatische Pose erhält einen 10% Bonus, sodass sie nur durch eine klar bessere Ansicht ersetzt wird.
- Kompaktes Modell in einem langen Slot (Abdeckung < 30%, Slot ≥ 3:1): Kopien werden entlang des Slots mit leichter Drehungs-/Skalierungsvariation (drei Splitter in einem 1×3-Slot) anstatt eines winzigen Modells nebeneinander platziert.
- Ausrichtung: Die meisten Packs (einschließlich Synty) erstellen Props, die in +Z-Richtung zeigen; die Kamera blickt entlang +Z, daher erhalten Modelle zunächst eine 180°-Gierdrehung (
Options.facingCorrection). Ändere es, wenn ein Pack eine andere Ausrichtung hat.
Review-Schleife
Vertraue keinem Batch, den du nicht angesehen hast. Ein Blatt zeigt, was hundert Log-Zeilen nicht erfassen.
- Blatt:
python scripts/icon_sheet.py <icon_folder> sheet.png --match ^Armor_ Shield --strip-prefix, dann betrachte das Bild. Icons behalten ihr Seitenverhältnis, sodass ein 3×1-Gegenstand als Streifen erscheint – so wie er im Raster aussehen wird. - Klassifiziere jedes schlechte Icon – der Fix unterscheidet sich:
- Seitlich / liegend / Rückseite zur Kamera → pose es mit
rotationOverride. Es wird alsEuler(override) * facingCorrectionangewendet, daher bedeuten Werte um(0,0,0)„wie erstellt, zur Kamera zeigend“: kleine Neigungen wie(-5, 15, 0)ergeben eine aufrechte 3/4-Ansicht.(0, 180, 0)zeigt die Rückseite. Null bedeutet „auto“, verwende also einen winzigen Nicht-Null-Wert, wenn du die erstellte Pose exakt haben möchtest. - Flaches Objekt (Schild, Platte, Münze) von der Kante gesehen → das Prefab hat normalerweise ein rotiertes Kind (Waffen-Anzeige-Prefabs drehen das Mesh oft um 90° auf X, damit es im Spiel flach liegt). Protokolliere
localEulerAnglesdes Kindes, bevor du rätst; hebe es im Override auf und füge einen Roll hinzu, um die lange Seite entlang des Slots zu legen, z.B.(0, 90, 80)für ein flaches ovales Schild in einem 3×1-Slot. - Falsche Silhouette für den Slot (ein großes dünnes Modell in einem quadratischen Slot: Trainingspuppen, Rüstungsständer, Banner auf Stangen) → keine Rotation behebt das; tausche das Modell aus.
- Seitlich / liegend / Rückseite zur Kamera → pose es mit
- Probiere Ersatzmodelle in einem einzigen Render aus: Weise vorübergehend mehrere vorhandene Gegenstände Kandidaten-Prefabs zu (
item.iconModel = candidate, Override Null), rendere, erstelle ein Blatt, wähle aus. Setze dann die Gewinner in den Content-Code – wenn der Content-Build die Modelle bei jedem Durchlauf neu zuweist, werden die temporären Zuweisungen ohnehin überschrieben. - Zeichne Posen im Content-Code auf, nicht nur in den Assets, damit ein Neubau mit „Daten überschreiben“ sie behält. Wende eine aufgezeichnete Pose nur an, wenn der Gegenstand keine eigene hat, sodass manuell angepasste Posen im Inspektor erhalten bleiben.
- Wiederhole Rendern und Blatterstellung, bis jedes Icon auf einen Blick lesbar ist.
Gute Modellquellen für Anziehbares: Statische modulare Charakterteile (z.B. Synty Modular Fantasy Hero Characters_ModularParts_Static/Chr_Torso_*_Static) ergeben weitaus bessere Brustrüstungs-Icons als Props wie Rüstungsständer oder Trainingspuppen – sie füllen einen quadratischen Slot und werden sofort als „Rüstung“ erkannt. Charakter-Anhang-Prefabs (Helme, Schulterpolster, Umhänge) eignen sich gut für die kleineren Slots. Statische Teile verwenden das normale Texturmaterial des Packs, sodass sie wie jedes andere Prop in deinen Shader konvertiert werden.
Fallstricke
- Vorschauszenen haben keine Umgebungsbeleuchtung oder Skybox – ohne die Füll- und Randlichter wird die dem Hauptlicht abgewandte Seite schwarz gerendert.
- Post-Processing und MSAA zerstören Alpha. Deaktiviere Post-Processing auf der Icon-Kamera (Tonemapping/Bloom schreiben Alpha = 1) und verwende Supersampling anstelle von MSAA.
- Setze
cam.scene = previewSceneoder die Kamera rendert auch die geöffnete Szene. - Entferne Collider, deaktiviere Animators, Partikel-/Trail-/Line-Renderer an der Instanz – VFX-Kinder und Bind-Pose-Animatoren blähen sonst die Bounds auf oder erscheinen als Schlieren.
- Verwende Pre-Multiplikation beim Herunterskalieren, sonst erhalten transparente Kanten dunkle Ränder von der Hintergrundfarbe.
- Geskinnedte Charaktere werden in der Bind-Pose (T-Pose) gerendert; gib ihnen einen
rotationOverrideoder eine geposte Prefab-Variante. - Palette-texturierte Low-Poly-Modelle sehen grau aus, wenn ihre Palettentexturen Mipmaps haben (siehe den Skill
unity-asset-pack-extraction).
Dateien
templates/Editor/ModelIconRenderer.cs–RenderBatch(IconJob[], Options),IconJob(model, cells, pngPath, rotationOverride), Menü Tools > Icons > Render Selected Prefabs (1×1-Icons in einenIcons/-Ordner neben jedem Prefab).scripts/icon_sheet.py– beschriftetes Kontaktblatt von gerenderten Icons, filterbar nach Namen (benötigt Pillow).