程式化模型

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

ProceduralModels 是一種以參數驅動的 Model,讓你使用程式碼建立和生成 3D 物件。你不是手動編輯模型的內容,而是通過一個 生成模組 和一組屬性定義其結構。當這些屬性改變,或當模型被調整尺寸時,生成器會自動運行以更新模型。

程式化模型使得以下幾點變得更容易:

  • 透過更改參數而非重建模型,非破壞性地調整模型。例如,在螺旋樓梯上更改 StepSize 值會自動重新生成帶有更新步數的樓梯。
  • 透過實現單一的 OnGenerate 函數,自動與現有的 Studio 系統如撤銷/重做、團隊創建和拖曳工具整合。
  • 保持性能高效,模型在參數變更之前表現得像標準物件。
  • 在編輯時和運行時生成內容,使用 Studio 和遊戲中的相同系統。
  • 在創作者商店分享參數化模型,使資源更靈活和可定製。
示例:程式化模型根據桌子的寬度或長度動態添加更多椅子。

插入程式化模型

你可以透過以下方式將程式化模型添加到你的遊戲中:

  • 手動將 ProceduralModel 物件插入到工作區。此選項包含一個範本生成器 ModuleScript 以幫助你入門。

    Explorer 視窗的特寫視圖。 一個模型物件被突出顯示,裡面有三個嵌套的子物件。
  • 使用 助手Roblox Studio MCP 伺服器 生成程式化模型。

  • 從創作者商店插入一個程式化模型以使用或自訂現有模型。

要自訂程式化模型的生成方式,你可以定義自己的生成器模組。

OnGenerate 函數

OnGenerate 函數是每個 ProceduralModel 的核心,以 OnGenerate(params, targetContainer) 形式存在。

這個開發者定義的函數負責根據提供的參數生成模型的內容,並將結果寫入指定的容器。

OnGenerate 有兩項主要責任:

  • 處理輸入參數以確定模型的結構
  • 根據該結構將生成的結果寫入提供的 targetContainer

以下部分描述:

  • 引擎何時以及如何調用 OnGenerate
  • 引擎如何處理寫入 targetContainer 的內容

生成器模組

OnGenerate 函數是在稱為 生成器模組ModuleScript 中定義的。ProceduralModel 通過其 Generator 屬性識別要使用的生成器模組。

生成器模組是標準的 Luau 模組,但由引擎直接要求作為生成過程的一部分。它們遵循定義的結構並返回具有標準化字段的表。

生成器模組結構

local MyGenerator = {}
MyGenerator.Attributes = {
DoSomething = true,
AmountOfSomething = 137,
}
type Params = {
Size: Vector3,
Attributes: typeof(MyGenerator.Attributes),
Pause: (self: any) -> (),
}
function MyGenerator.OnGenerate(params: Params, targetContainer: GeneratedFolder)
end
return MyGenerator

標準化的字段包括:

  • Attributes: 定義參數名稱及其默認值的映射。
  • OnGenerate: 接收 params 表和 targetContainer 的函數。

OnGenerate 中的 params 表包含:

  • Attributes: 一個表,包含模組定義的屬性或如果未指定則包含所有模型屬性。
  • Size: 一個參數,反映模型在比例為一的情況下的尺寸。
  • Pause: 一個方法,允許在複雜的生成任務中高效地進行生成。

OnGenerate 函數應該在 targetContainer 的原點附近生成內容。它不應直接修改主 DataModel 層級。

參數

參數 是控制生成的輸入。這些包括 ProceduralModel 的內建 Size 屬性,以及在生成器模組中指定的自訂屬性。這些 顯式參數 直接傳遞給 OnGenerate隱式參數,如模組的源代碼或沙盒狀態,當改變時也會觸發再生,但不會傳遞給 OnGenerate

完整的參數集合包括:

  • 顯式:
    • Size: 定義圍繞原點生成內容的區域。
    • Attributes: 一個包含當前輸入屬性值的映射。
  • 隱式:
    • 生成器:提供生成邏輯的模組。
    • 源代碼:生成器模組的 Luau 代碼的變更。
    • 沙盒:生成器模組的沙盒狀態的變更。

再生行為

為了保持性能和簡化 API 互動,當參數改變時不會立即調用 OnGenerate。相反,ProceduralModel 被標記為 dirty,表示再生已待處理。這一待處理的再生通常會在同一幀的稍後進行。

如果再生失敗,髒狀態會在發生另一個參數變更之前被清除。如果在模型髒的情況下儲存地方,其狀態會保留,並且模型會在下一次遊戲載入時添加到生成隊列中。

執行過程

當有可用的處理時間時,引擎通過執行以下步驟來重新生成髒模型:

  1. 載入生成器模組,必要時暫停。
  2. 開始生成過程的新執行緒。
  3. 構建參數表,根據模型當前的比例規範化 Size
  4. 對任何缺少的屬性應用默認屬性值。
  5. 初始化一個臨時的 GeneratedFolder 作為 targetContainer
  6. 調用 OnGenerate
  7. OnGenerate 返回後:
    • 如果成功,將 targetContainer 中的結果遷移到 ProceduralModel
    • 如果生成失敗,則使用失敗佔位符。

如果在生成執行緒被暫停時參數再次改變,未完成的生成會被取消並使用更新的參數重新啟動。

生成結果

將生成的結果置入模型涉及以下步驟:

  1. 終止生成過程中泄漏的任何子執行緒。
  2. 使用 PivotTo 將結果放置。
  3. 如果模型的 Scale 不是 1,使用 ScaleTo 來撤消尺寸的規範化。
  4. 將結果歸屬於模型的 GeneratedFolder
  5. 如果生成器模組是沙盒的,確保結果中的 ModuleScripts 不超過生成器模組的能力。
  6. 用其默認值填充模型中缺失的任何屬性。
  7. 清除模型的髒狀態。

生成細節

除了核心生成流程外,以下細節描述影響 ProceduralModel 生成工作的一些行為和考慮事項。

尺寸調整

由於在生成期間應用的比例規範化,ProceduralModel 支持多種尺寸調整工作流:

  • 更改 Size 屬性會使用新內容重新生成模型。
  • 更改 Scale 會使用 ScaleTo 均勻縮放現有結果。

超時

作為一個安全機制,執行太多工作而不進行暫停的生成器模組會被終止。如果生成遇到 "Script Timeout" 錯誤,請添加額外的 parameters:Pause() 調用,以便讓引擎將剩餘的工作推遲到稍後的幀。

調用 parameters:Pause() 是非常廉價的,通常在正常生成執行期間立即返回,所以可以在循環的開始處隨意調用,而不會影響性能。

撤銷歷史

生成的結果與觸發它們的參數變更一起使用撤銷路徑覆蓋進行分組。如果在同一幀中發生多次參數變更,則結果將與最近的路徑相關聯。

沙箱

ProceduralModel 支持沙盒。你從創作者商店插入的所有第三方程式化模型默認為沙盒,以幫助防止對你的遊戲進行不必要的變更。

生成代碼在生成器模組的上下文中運行,並使用該模組的沙盒狀態。這些設置默認情況下不可見。要查看或修改它們,請設置 Workspace.SandboxedInstanceMode = Experimental。這會顯示 ModuleScript 上的 SandboxedCapabilities 屬性。

一個沙盒的生成器模組通常至少需要以下能力:

  • RunServerScript(執行模組)
  • CreateInstances
  • Basic

ProceduralModel 和其生成器模組的沙盒狀態彼此獨立。應用於生成器模組的沙盒不影響 ProceduralModel 中的正常運行時腳本。這讓你保持編輯時生成的嚴格限制,而不影響遊戲內的行為。

嵌套

ProceduralModels 可以生成其他 ProceduralModels。當這發生時,引擎在可能的情況下在同一生成步驟中自上而下處理層級,深度嵌套的模型最後生成。

限制

  • Actor 實例中不支持生成。
  • 模型不能轉換為包。
  • 使用啟用關節表面的拖拉工具時創建的關節在 ProceduralModel 再生過程中不會被保留。
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。