從零件素材包做出 kit
很多 Fab 素材包是零件包:幾百片牆面、樑、簷口、拱、扶壁,各有作者自己的 pivot 與朝向,沒有一片是完整的牆。ClaudeUnreal 的 kit 工具把這種包變成 可鋪排的成品,可以直接交給城堡組裝器或城鎮規劃器——你不用量 pivot、翻面、 算間距。
下面的提示詞就是你在編輯器 Claude Code 分頁裡打的話。每一條走完一個步驟, 串起來就是完整流程。示範系列第 22 集就是這條流程一刀未剪的實錄,從空白場景到成品:
工具各自保證什麼
Section titled “工具各自保證什麼”| 步驟 | 工具 | 寫入 | 人工停點 |
|---|---|---|---|
| 搭台 | stage_pack_kit | /Game/Maps/<Pack>_KitStage | — |
| 勘查 | survey_pack | 無 | 你從清單挑角色 |
| 格式化 | format_pack_part | /Game/<Pack>_Formatted/SM_<part>_F | 烤之前確認正面視圖 |
| 組合 | compose_pack_piece | /Game/<Pack>_Formatted/Pieces/SM_<name> | 烤之前確認三視圖 |
| 檢查 | get_pack_status | 無 | — |
素材包自己的資料夾永遠不會被寫入。<Project>/KitRecords/<Pack>/ 底下的兩個
純 JSON——parts.json(確認過的朝向)與 pieces.json(每塊成品的 recipe ×
binding)——就是紀錄,應該進版本控制。它們刻意放在 Content/ 之外:編輯器會監看
內容目錄裡有沒有來源檔變動,而 .json 正是它認得的可匯入格式,紀錄放在那裡會讓
工具每寫一次就打斷你一次。
範例 binding
Section titled “範例 binding”Recipe 會點名的角色,以及我們綁到 WhiteCastle 的 mesh。右欄換成你自己包的 mesh。
| 角色 | 範例 mesh(WhiteCastle) | 是什麼 |
|---|---|---|
surface | SM_Surf_Plane_005 | 牆皮——單面片;決定模組長度 L 與每層高度 |
cap | SM_Floor_Plane_003 | 蓋在牆頂的地板片 |
buttress | SM_Det_WCArchElemContrforce2_1 | 實心柱墩——不是 Contrforce_1,那個雖然叫扶壁,其實是鍍金尖頂飾 |
slit | SM_Gat_WCArchElemWindow1_Full、SM_Gat_WCArchElemWindow2_Full | 窄窗(兩種變體) |
band | SM_Det_WCArchElemBeam_2 | 飾帶(string course) |
cornice | SM_Gat_WCArchElemCornice_2_Full | 女兒牆下的簷口 |
arch | SM_Gat_WCArchElemArch_2_Full | 圓拱 |
所有 mesh 都在 /Game/WhiteCastle/Meshes/ 底下。這就是第 22 集結尾的 binding;
Claude 看著勘查表提出來,人一個字都沒改。

/cu:kit /Game/WhiteCastle 把整條流程當成一條軌道跑完。它只停三次,因為真正需要
眼睛的只有三個時刻——中間所有事(量測、格式化、生成、合併、存檔、檢查、驗證成品
鋪得起來)都不會問你。
-
開始。
/cu:kit /Game/WhiteCastle/Game/WhiteCastle要換成你自己素材包的內容資料夾——你的零件 mesh 放在哪裡就 填哪裡。WhiteCastle 只是示範剛好用的包,外掛並不附帶它。Claude 先替素材包搭一個專屬舞台——以包名命名、平地、均勻打光的關卡,切換前會先把 你原本開著的關卡存好——之後每張表都在那裡拍,不會拍到剛好載入的地形。接著勘查 素材包、自己讀 Preview 分頁裡的清單,回來提一份 binding——牆面、頂蓋、柱墩、窗、 飾帶、簷口、拱各建議用哪個 mesh——並明說那只是提議。
-
一行修正 binding。
yes, but use SM_Det_WCArchElemBeam_2 for band或直接說「looks right」。Claude 接著把每件零件的朝向提案在同一張表上:被綁定 的零件排成一列,正面與斜角各一張,編號對應一張列出真實尺寸與建議轉向的表格。 每件背後有一塊灰色板——它將來要貼上的那面牆。朝向錯的零件會明顯離板懸空。

-
一行確認朝向。
3 turn 90, rest are fine或直接說「yes」。Claude 把全部烤好、組出成品,再給你看三視圖。你說「bake it」, 就得到一片可鋪排的牆——外加三份並排生成好讓你看接縫,看完自動清掉。

軌道跑完會再搭一次舞台,那就是你看成果的地方:你綁定的零件排成一列,旁邊基座上是
它們變成的成品。layout="recipes" 會把每塊成品放在它的零件後面,那個視角最能說明
組合器做了什麼。

軌道只是五個指令的外殼。想單獨格式化一件零件、試自己的 recipe、或重開編輯器後檢查 狀態時,直接用它們。
# 0. 搭台——素材包專屬的平地打光關卡;最後再跑一次就能看到整套 kit.claude/cu exec stage_pack_kit --params-json '{"path":"/Game/WhiteCastle"}'
# 1. 勘查——量過、不排序、什麼都不寫.claude/cu exec survey_pack --params-json '{"path":"/Game/WhiteCastle","show":true}'
# 2. 朝向——整包一張表,什麼都不寫.claude/cu exec format_pack_part --params-json \ '{"mesh_paths":["/Game/WhiteCastle/Meshes/SM_Surf_Plane_005", "/Game/WhiteCastle/Meshes/SM_Floor_Plane_003"]}'
# ……然後用確認過的 yaw 逐件烤.claude/cu exec format_pack_part --params-json \ '{"mesh_path":"/Game/WhiteCastle/Meshes/SM_Surf_Plane_005","yaw":90,"apply":true}'
# 3. 組合——先提案,看過再加 "apply": true.claude/cu exec compose_pack_piece --params-json \ '{"recipe":"curtain_buttressed","name":"WC_Curtain_A","binding":{ ... }}'
# 4. 狀態——紀錄對磁碟,重開編輯器後先跑這個.claude/cu exec get_pack_status --params-json '{"path":"/Game/WhiteCastle"}'內建 recipe:curtain_plain、curtain_buttressed、curtain_capped
(一段牆的最後一塊,末端封起來)、doorway_plain、doorway_banded、
tower_plain 與 tower_buttressed(sides 把同一片牆折成多邊形鼓身,
所以塔用牆的 binding 就組得出來)。其他情況傳 recipe_dict——兩層牆、每模組四扇交替的窗、半高一條
飾帶等等。所有驗證問題會在生成任何東西之前一次報完。
單件零件仍有自己的提案(只給 mesh_path、不給 apply),批次裡某一件朝向不對、想
單獨看仔細時就用它。
軌道會替你檢查的事
Section titled “軌道會替你檢查的事”- 沒有東西浮空。 每個裝飾都貼皮:背面貼外皮(
flush: "front")或內皮。 - 沒有東西壓在接縫上。 會跨過模組邊界的複本會被點名拒絕;成品永遠剛好 L 長。
- 烤出來的尺寸如約。 merge 後成品會被生成並量 bounds 跟 recipe 承諾比對;不符 就回報失敗並點名軸向,什麼都不記錄。
- 每個朝向與 binding 都是你決定的。 工具只呈現與寫入,從不排序、不代選。
鋪排檢查由 Claude 自己在回報前做完——三份並排、拍照、刪掉。看得到接縫就是某件零件 的 yaw 錯了;說是哪一件,它會重烤。
上面除了 mesh 名稱,沒有任何東西是 WhiteCastle 專屬的。要換包:
- 勘查它的資料夾,挑出對應的零件。
- 逐件格式化(朝向閘門會抓到正面朝錯的零件——這是唯一沒有規則能知道的事)。
- 用同樣的 recipe 名稱配你的 binding。模組長度、層高、厚度全部來自你的牆面零件。
Recipe 的完整說明——每種 layer kind 與每個鍵——在 repo 的 docs/mcp-tools/kit.md。