從 3D 模型渲染物品圖示
將遊戲自身的預置體透過程式碼轉換成一致的精靈圖示:一個隔離的預覽場景、正交攝影機搭配三盞定向光源、每個模型自動選擇姿勢、2× 超取樣渲染、預乘 Alpha 降採樣,並加上暗色外框,使圖示在任何背景上都清晰可讀。可重複執行——每當美術資源或物品形狀改變時,即可重新產生。
工作流程
- 檢查渲染管線。 範本預設目標為 URP(
UniversalAdditionalCameraData)。若使用 Built-in 管線,請刪除該程式區塊;若使用 HDRP,請改用HDAdditionalCameraData,並以相同方式停用後處理。 - 將
templates/Editor/ModelIconRenderer.cs複製到僅限編輯器的資料夾/asmdef(若使用 asmdef 則需引用 URP Runtime),並重新命名命名空間。 - 決定遊戲資料到工作的對應關係:每個物品對應哪個預置體、其儲存格 Footprint(1×1 用於一般圖示;網格背包則使用物品的網格形狀),以及輸出路徑。將此對應關係保存在專案的內容程式碼中,而非渲染器內。
- 從選單項目或內容建置步驟呼叫
ModelIconRenderer.RenderBatch(jobs),然後將產生的精靈指定給物品資料(AssetDatabase.LoadAssetAtPath<Sprite>(path))、SetDirty、SaveAssets。PNG 檔案會以精靈方式匯入(Alpha 為透明度,無 Mipmap)。 - 使用
scripts/icon_sheet.py檢視每個圖示,並針對異常物品進行個別修正(請參閱「審查迴圈」),而非調整全域啟發式參數。 - 透過 Git LFS 提交 PNG 檔案。 請勿將從授權美術資源渲染的圖示提交到公開儲存庫。
姿勢如何選擇
- 細長模型(最長軸超過中間軸 1.6 倍:劍、法杖、箭、魔杖)會沿儲存格的長軸擺放——在直立儲存格中垂直,在寬儲存格中水平,在方形儲存格中則對角線擺放——然後繞該軸旋轉 25°,使側面朝向攝影機。
- 緊湊模型(寶石、藥水、書本、寶箱)從直立 3/4 視角開始,然後掃描偏航角(−90…90)、俯仰角(−50、−25、0)和翻滾角(0…135),渲染一個小型探測畫面,並保留輪廓像素最多的視角。使用像素覆蓋率而非邊界框,可避免細長對角線勝出;正面視角因看起來扁平而扣減 7%;自動姿勢獲得 10% 加成,僅在明顯更好的視角出現時才被取代。
- 長形儲存格中的緊湊模型(覆蓋率 < 30%,儲存格 ≥ 3:1):會在儲存格中複製並排,並帶有輕微的旋轉/縮放變化(例如在 1×3 儲存格中放置三個碎片),而非單一小型模型。
- 面朝方向: 大多數資源包(包括 Synty)的作者將道具面朝 +Z 方向;攝影機沿 +Z 方向觀察,因此模型會先進行 180° 偏航角旋轉(
Options.facingCorrection)。若資源包面朝其他方向,請修改此值。
審查迴圈
永遠不要信任未經檢視的批次。一張聯絡表能捕捉到數百行日誌無法發現的問題。
- 聯絡表:
python scripts/icon_sheet.py <icon_folder> sheet.png --match ^Armor_ Shield --strip-prefix,然後檢視圖片。圖示會保持其原始長寬比,因此 3×1 的物品會顯示為長條,如同在網格中的顯示方式。 - 對每個不良圖示進行分類——修正方式不同:
- 側面 / 平躺 / 背面朝向攝影機 → 使用
rotationOverride設定姿勢。此覆蓋值會以Euler(override) * facingCorrection方式應用,因此接近(0,0,0)的值表示「照原樣,面向攝影機」:輕微傾斜如(-5, 15, 0)可提供直立的 3/4 視角。(0, 180, 0)顯示背面。值為 0 表示「自動」,因此若需要完全照原樣,請使用極小的非零值。 - 邊緣朝上的扁平物體(盾牌、盤子、硬幣) → 預置體通常有一個旋轉的子物件(武器顯示預置體通常會將網格繞 X 軸旋轉 90°,使其在遊戲中平放)。在猜測前先記錄子物件的
localEulerAngles;在覆蓋值中取消該旋轉,並加入翻滾角使長邊沿儲存格擺放,例如在 3×1 儲存格中為扁平橢圓盾牌設為(0, 90, 80)。 - 與儲存格不符的輪廓(方形儲存格中的細長模型:訓練假人、盔甲架、旗杆)→ 旋轉無法解決此問題;請更換模型。
- 側面 / 平躺 / 背面朝向攝影機 → 使用
- 在一次渲染中試用替代模型: 暫時將幾個現有物品指向候選預置體(
item.iconModel = candidate,覆蓋值設為 0),渲染,產生聯絡表,然後挑選。選中的項目再放入內容程式碼中——若內容建置每次執行都會重新指定模型,暫時的指定仍會被覆蓋。 - 將姿勢記錄在內容程式碼中,而不僅記錄在資源上,這樣在「覆寫資料」的重新建置時才能保留。僅在物品沒有自己的姿勢時才應用記錄的姿勢,這樣在 Inspector 中手動調整的姿勢就能保留。
- 重新渲染並重新產生聯絡表,直到每個圖示都能一目了然。
穿戴物的良好模型來源: 靜態模組化角色部件(例如 Synty Modular Fantasy Hero Characters_ModularParts_Static/Chr_Torso_*_Static)製作的胸甲圖示遠優於道具(如盔甲架或訓練假人)——它們能填滿方形儲存格,並立即被辨識為「盔甲」。角色附加預置體(頭盔、肩甲、披風)則適合較小的儲存格。靜態部件使用資源包的一般紋理材質,因此它們會像其他道具一樣轉換為你的著色器。
注意事項
- 預覽場景沒有環境光源或天空盒——若缺少補光和邊緣光,遠離主光源的一側會渲染為黑色。
- 後處理與 MSAA 會破壞 Alpha。 在圖示攝影機上停用後處理(色調映射/泛光會將 Alpha 寫為 1),並使用超取樣代替 MSAA。
- 設定
cam.scene = previewScene,否則攝影機會同時渲染開啟的場景。 - 在實例上移除碰撞器、停用動畫控制器、粒子/軌跡/線條渲染器——否則視覺特效子物件和綁定姿勢動畫控制器會擴大邊界或顯示為條狀污跡。
- 降採樣時預乘 Alpha,否則透明邊緣會從清除顏色中拾取暗色邊緣。
- 蒙皮角色會以綁定姿勢(T 姿勢)渲染;請為它們提供
rotationOverride或已經擺好姿勢的預置體變體。 - 調色板紋理的低多邊形模型若其調色板紋理具有 Mipmap,則會看起來偏灰(請參閱
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 函式庫)。