Skip to content
docs / wall-walkthrough
更新日誌 ← 回到網站 GitHub

沿線鋪 kit

在這之前,ClaudeUnreal 蓋的每一道牆都是 agent 一個控制點一個控制點規劃出來的 ——幾何只存在 agent 腦裡、每集重算一次、也沒辦法交給你當一個能拖的東西。 /cu:wall 把線本身變成工具:一小組具名樣式、參數以模組計、一條真實的 Spline actor 讓你在蓋之前先調整,以及兩種沿線鋪 kit 的方式。

它假設 kit 已經存在——/cu:kit 跑過, pieces.json 裡有 curtain 與 tower。

第 23 集就是這一趟的實錄,從空山谷到蓋好的整圈城牆:

步驟工具寫入人工停點
檢查get_pack_status無—
畫線wall_spline一個 Spline actor(BP_WallSpline)沿這條線鋪牆嗎?
計畫build_wall_spline無—
蓋build_wall_spline + apply牆件;walls.json—
拆wipe_wall_spline移除牆件與紀錄—

牆蓋在當時開著的關卡——那是你的世界,軌道從不切換關卡。walls.json 跟 parts.json、pieces.json 放在一起,位於 <Project>/KitRecords/<Pack>/;它記下鋪了 什麼(模式、binding、對齊後的點、數量),應該進版本控制。

樣式參數(模組)形狀
ringrx, ry;towers_every=4、jitter=0.0、seed周長為整數模組的橢圓;每 towers_every 個模組一個頂點——一座塔
rectw, h;corner="tower"|"chamfer"、chamfer=1、towers_every=4角落是頂點;chamfer 把每個角切 45°;長邊每 towers_every 個模組一個頂點
starr;sides=5、bastion_depth=2、shoulder=0.35每一邊一座稜堡;尖角小於 60° 會被拒絕
arcr, sweep_deg;start_deg=0、towers_every=4開放;正面背向圓心
tracepoints [[x, y], …] 或 actor_label;closed=false、min_angle=60你自己的線——或你自己的 Spline actor,不會生成新東西

每種樣式都吃 cx, cy——中心,單位是公分——所以「繞那座山」是先讀山的位置, 不是畫在原點。正面朝行進方向的左側;每個封閉樣式都以外側在左繞行,trace 的正面在你點序的左邊。

白色城堡牆面與塔樓沿著雪山山脊排開

/cu:wall /Game/WhiteCastle 把整件事當一條軌道跑,只停一次——在線這裡,因為這是 唯一值得一雙眼睛看的東西。你回答之後的每一步(計畫、檢查城垛、生成、記錄、拍成果) 都不會再問你。

  1. 開始。

    /cu:wall /Game/WhiteCastle——繞那座山一圈城牆,每四個模組一座塔

    Claude 檢查 kit 的紀錄、說出目前開著的關卡、讀取山的位置。接著 wall_spline 在那裡立一條 Spline actor——比方說 12 × 9 模組的環——控制點已經對齊到每條邊都是 整數個模組,然後把俯視照片推到 Preview 分頁。

  2. 回答閘門。

    好

    或先在編輯器裡拖幾個控制點——把環拉到崖邊、在道路穿過的地方往內推——再說好。 build_wall_spline 讀的是 actor 當下的點,重新對齊到整數模組(一個點最多動 半個模組,否則拒絕並點名),然後鋪 kit:預設 tile——每條邊一列 curtain 共用同一個 水平基座(那條邊底下最低的地面),每個頂點一座塔、站在它兩條邊較低的那個基座上, 落差就在塔這裡吸收。Claude 會先自己讀計畫:地面爬升超過塔能遮住的頂點會被標為 overtopped,它會告訴你而不是硬蓋。

  3. 要什麼再說——或不說。

    改成 bend,南邊那段開一座門

    bend 每個模組鋪一段 SplineMesh,curtain 本身順線彎、沒有塔;只接受素面件 (一片直的 tile 加一片 cap——範例包裡是 WC_Curtain_P,用 curtain_plain recipe 做的)。城門可以放在你指定的任一邊,取代那幾個模組。同一條線重跑就是整段換掉; 給新的 name 則在旁邊立第二條線。

Terminal window
# 0. kit 的紀錄,以及目前開著的關卡
.claude/cu exec get_pack_status --params-json '{"path":"/Game/WhiteCastle"}'
# 1. 畫線——12 × 9 模組的環,對齊 WC_Curtain_A 的長度;俯視照片推到 Preview 分頁
.claude/cu exec wall_spline --params-json \
'{"style":"ring","params":{"rx":12,"ry":9,"cx":-30000,"cy":-8000,"curtain":"WC_Curtain_A"},"name":"Wall_Ring"}'
# 2. 計畫——不生成任何東西;第一段拍一張斜角照
.claude/cu exec build_wall_spline --params-json \
'{"actor_label":"Wall_Ring","mode":"tile","binding":{"curtain":"WC_Curtain_A","tower":"WC_Tower_A"}}'
# 3. 蓋——actor 命名為 WhiteCastle_Wall_Ring_<edge>_<module> 與 _T<vertex>;寫入 walls.json
.claude/cu exec build_wall_spline --params-json \
'{"actor_label":"Wall_Ring","mode":"tile","binding":{"curtain":"WC_Curtain_A","tower":"WC_Tower_A"},"apply":true}'
# 同一條線改 bend——換掉 tile 的牆;裝飾件會被拒絕並列出不合格的層
.claude/cu exec build_wall_spline --params-json \
'{"actor_label":"Wall_Ring","mode":"bend","binding":{"curtain":"WC_Curtain_P"},"apply":true}'
# 城門:第 0 邊、置中、寬兩個模組(由城門件的長度決定)
.claude/cu exec build_wall_spline --params-json \
'{"actor_label":"Wall_Ring","mode":"tile","binding":{"curtain":"WC_Curtain_A","tower":"WC_Tower_A","gate":"WC_Doorway_A"},"gate":{"edge":0,"at":"centre"},"apply":true}'
# 4. 拆——牆件與紀錄移除;線留著,除非 keep_spline 設為 false
.claude/cu exec wipe_wall_spline --params-json '{"actor_label":"Wall_Ring"}'
  • 永遠是整數模組。 每條邊都是整數個 curtain 長度;畫線時對齊一次、蓋的時候再 對齊一次,控制點從不移動超過半個模組。
  • kit 配得上這條線。 wall_spline 把對齊用的模組長度存在 actor 上;用不同長度的 curtain 來蓋會被拒絕,兩個長度都會列出。
  • 城垛是水平的。 每條邊的基座是它底下取樣到的最低地面——頂點加上每個模組邊界。 落差發生在塔,塔遮不住的落差會在蓋之前就點名。
  • 只有素面件能彎。 彎過的窗是梯形、彎過的柱墩會歪、彎過的拱廊不對稱——所以 bend 拒絕裝飾件並列出不合格的層。
  • 重蓋是乾淨的替換。 先生成新件、再拆舊件、最後才寫紀錄——中途失敗,舊牆還站著。

上面除了成品名稱以外沒有任何 WhiteCastle 專屬的東西。對你的包跑一次 /cu:kit、綁它的 curtain 與 tower,同樣的樣式就能鋪—— 模組長度來自你的 curtain。

工具的完整說明——每個樣式參數、對齊規則、tile、bend、gate 與紀錄——在儲存庫的 docs/mcp-tools/kit.md。