Community画像github.com

qhenshaw/unity-model-icon-renderer

Unity(URP)プロジェクトの3Dモデル/プレハブから、透明で輪郭線付きのスプライトアイコンをレンダリングします。インベントリ、ショップ、アイテムカード、グリッドバックパック用に、アイテムのセルフットプリントに合わせたサイズで、長い武器は斜めに配置され、コンパクトなプロップはスロットに収まるように自動ポーズ調整されます。プロジェクトに3Dアートからアイテム/インベントリアイコンが必要な場合、プレースホルダーや不足アイコンがある場合、アート変更後にアイコンを再生成したい場合、またはBackpack Battlesスタイルのグリッドアイテムアートを求める場合に使用します。

unity-model-icon-renderer とは?

このスキルは、Unityプロジェクトにおいて、3Dモデルやプレハブから自動的に一貫性のあるアイコンスプライトを生成するためのツールです。主な用途は、インベントリ、ショップ、アイテムカード、およびグリッド型バックパックで使用する透過背景・輪郭線付きのアイコンをコードから生成することです。ゲーム内のプレハブを利用するため、プレースホルダーアイコンを置き換えたり、アートアセットの変更後にも手軽にアイコンを再生成できます。このスキルは、孤立したプレビューシーン、三方向ライトを持つ正投影カメラ、モデルごとに選択されるポーズ、2倍スーパーサンプリング、乗算ダウンサンプル、そして暗い輪郭線を特徴とし、どのような背景でもアイコンが読みやすくなるよう設計されています。対応パイプラインはURPがデフォルトで、Built-inパイプラインやHDRPへの修正も可能です。ポーズ選択はモデルの縦横比に基づき自動化されており、細長いモデルは斜めに、コンパクトなモデルはシルエットピクセル数による最適化が行われます。また、Pythonスクリプト `scripts/icon_sheet.py` を使って生成されたアイコンの一覧シートを確認し、手動でポーズオーバーライドを行うレビューループも提供されています。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/qhenshaw/quins-unity-skills/tree/HEAD/skills/unity-model-icon-renderer

Installed? Explore more 画像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

3Dモデルからレンダリングされたアイテムアイコン

ゲーム自身のプレハブを、コードから一貫したアイコンスプライトに変換します。分離されたプレビューシーン、3つの方向ライトを持つ正投影カメラ、モデルごとに選択されるポーズ、2倍スーパーサンプリングレンダリング、乗算ダウンサンプル、そして暗い輪郭線により、アイコンがどの背景でも読みやすくなります。再実行可能で、アートやアイテムの形状が変更されたときはいつでも再生成できます。

ワークフロー

  1. パイプラインを確認します。 テンプレートはURPをターゲットにしています(UniversalAdditionalCameraData)。Built-inパイプラインの場合はそのブロックを削除してください。HDRPの場合はHDAdditionalCameraDataを使用し、同様にポストプロセスを無効にします。
  2. templates/Editor/ModelIconRenderer.csをコピーして、エディタ専用フォルダ/asmdefに配置し(asmdefを使用する場合はURPランタイムへの参照を追加)、名前空間をリネームします。
  3. ゲームデータからジョブへのマッピングを決定します。各アイテムを表すプレハブ、そのセルフットプリント(通常のアイコンは1×1、グリッドインベントリの場合はアイテムのグリッド形状)、出力パスを決めます。このマッピングはレンダラーではなく、プロジェクトのコンテンツコードに保持します。
  4. メニュー項目またはコンテンツビルドステップから**ModelIconRenderer.RenderBatch(jobs)を呼び出し**、結果のスプライトをアイテムデータに割り当てます(AssetDatabase.LoadAssetAtPath<Sprite>(path)、SetDirty、SaveAssets)。PNGはスプライトとしてインポートされます(アルファは透過、ミップマップなし)。
  5. scripts/icon_sheet.pyですべてのアイコンを確認し、グローバルなヒューリスティックを調整する代わりに、外れ値のアイテムごとに修正します(レビューループ参照)。
  6. Git LFSでPNGをコミットします。 ライセンスされたアートからレンダリングされたアイコンを公開リポジトリにコミットしないでください。

ポーズの選択方法

  • 細長いモデル(最長軸が中間軸の1.6倍以上:剣、杖、矢、ワンド)は、スロットの長軸に沿って配置されます。縦長スロットでは垂直、横長スロットでは水平、正方形スロットでは斜めに配置され、その軸周りに25°回転して側面がカメラを向くようにします。
  • コンパクトなモデル(宝石、ポーション、本、宝箱)は、直立した3/4ビューから開始し、ヨー(-90…90)、ピッチ(-50、-25、0)、ロール(0…135)をスイープして小さなプローブをレンダリングし、最もシルエットピクセル数が多いビューを保持します。境界ではなくピクセルカバレッジを使用するため、細い対角線が勝ってしまうことを防ぎます。真正面からのビューは平らに見えるため7%ペナルティが課されます。自動ポーズには10%のボーナスが与えられ、明らかに優れたビューのみが置き換えます。
  • 長いスロット内のコンパクトモデル(カバレッジ < 30%、スロット ≥ 3:1):1つの小さなモデルではなく、コピーがスロットに沿ってわずかな回転/スケールバリエーションで並べて配置されます(1×3スロットに3つの破片)。
  • 向き: ほとんどのパック(Synty含む)はプロップを+Z方向に向けて作成しています。カメラは+Z方向を見ているため、モデルは最初に180°ヨーが適用されます(Options.facingCorrection)。パックが別の方向を向いている場合は変更します。

レビューループ

確認していないバッチを信頼してはいけません。1枚のシートは、100行のログよりも多くの情報を提供します。

  1. シート: python scripts/icon_sheet.py <icon_folder> sheet.png --match ^Armor_ Shield --strip-prefix を実行し、画像を確認します。アイコンはアスペクト比を保持するため、3×1のアイテムはストリップとして表示されます。グリッド内と同じように見えます。
  2. 不良アイコンを分類します。修正方法は異なります。
    • 横向き / 寝ている / 背面を向いている → rotationOverrideでポーズを指定します。これはEuler(override) * facingCorrectionとして適用されるため、(0,0,0)に近い値は「作成されたまま、カメラの方を向いている」ことを意味します。小さな傾き(例:(-5, 15, 0))は直立した3/4ビューを与えます。(0, 180, 0)は背面を表示します。(0,0,0)は自動を意味するため、作成されたポーズをそのまま使用したい場合は微小な非ゼロ値を使用します。
    • 薄いエッジオンなもの(盾、プレート、コイン) → プレハブには通常回転した子オブジェクトがあります(武器表示プレハブはメッシュをX軸に90°回転させて、ゲーム内で平らになるようにすることがよくあります)。オーバーライドを推測する前に子のlocalEulerAnglesをログに記録します。オーバーライドでそれを打ち消し、スロットに沿って長辺を配置するロールを追加します。例:3×1スロットの平らな楕円形の盾には(0, 90, 80)。
    • スロットに対して間違ったシルエット(正方形スロット内の細長いモデル:訓練用ダミー、アーマースタンド、ポール上のバナー)→ 回転では修正できません。モデルを交換します。
  3. 代替モデルを1回のレンダリングで試聴します。 既存のいくつかのアイテムを一時的に候補プレハブにポイントし(item.iconModel = candidate、オーバーライドはゼロ)、レンダリング、シート、選択を行います。その後、勝者をコンテンツコードに配置します。コンテンツビルドが実行ごとにモデルを再割り当てする場合、一時的な割り当ては上書きされます。
  4. コンテンツコードにポーズを記録します。 アセットだけに記録しないでください。そうすれば「データを上書き」で再ビルドしても保持されます。記録されたポーズは、アイテムに独自のポーズがない場合にのみ適用されます。これにより、インスペクタで手動調整されたポーズが保持されます。
  5. すべてのアイコンが一目で認識できるまで、再レンダリングと再シートを繰り返します。

ウェアラブルのための優れたモデルソース: 静的なモジュラーキャラクターパーツ(例:Synty Modular Fantasy Hero Characters_ModularParts_Static/Chr_Torso_*_Static)は、アーマースタンドや訓練用ダミーなどのプロップよりもはるかに優れた胸部防具アイコンを作成します。正方形のスロットを埋め、すぐに「防具」として認識されます。キャラクターアタッチメントプレハブ(ヘルメット、肩パッド、ケープ)は小さなスロットに適しています。静的パーツはパックの通常のテクスチャマテリアルを使用するため、他のプロップと同様にシェーダーに変換されます。

注意点

  • プレビューシーンには環境ライティングやスカイボックスがありません。フィルライトやリムライトがないため、キーライトから離れた側は黒くレンダリングされます。
  • ポストプロセスとMSAAはアルファを壊します。 アイコンカメラでポストプロセスを無効にし(トーンマッピング/ブルームはアルファ=1を書き込みます)、MSAAの代わりにスーパーサンプリングを使用します。
  • cam.scene = previewSceneを設定します。 そうしないと、カメラは開いているシーンもレンダリングします。
  • インスタンス上のコライダーを削除し、アニメーター、パーティクル/トレイル/ラインレンダラーを無効にします。 VFXの子やバインドポーズアニメーターは、バウンドを膨らませたり、スメアとして表示されたりします。
  • ダウンサンプリング時に乗算合成を行います。 そうしないと、透明なエッジがクリアカラーから暗い縁取りを拾います。
  • スキニングされたキャラクターはバインドポーズ(Tポーズ)でレンダリングされます。rotationOverrideまたはポーズ付きプレハブバリアントを指定します。
  • パレットテクスチャを使用したローポリモデルは、パレットテクスチャにミップマップがある場合、灰色に見えることがあります(unity-asset-pack-extractionスキルを参照)。

ファイル

  • templates/Editor/ModelIconRenderer.cs - RenderBatch(IconJob[], Options)、IconJob(model, cells, pngPath, rotationOverride)、メニュー Tools > Icons > Render Selected Prefabs(各プレハブの隣のIcons/フォルダに1×1アイコンを出力)。
  • scripts/icon_sheet.py - レンダリングされたアイコンのラベル付きコンタクトシート。名前でフィルタリング可能(Pillowが必要)。

関連スキル