เรียนรู้
Engine Class
ProceduralModel

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่


สรุป
สมาชิกที่ได้รับทอด

เอกสารอ้างอิงเกี่ยวกับ API
คุณสมบัติ
GenerationError
อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน
ความสามารถ: Basic
ProceduralModel.GenerationError:string

Generator
อ่านพร้อมๆ กัน
ความสามารถ: Basic
ProceduralModel.Generator:ModuleScript
ตัวอย่างโค้ด
โมดูลเจนเนอเรเตอร์เริ่มต้น
-- โมดูลเจนเนอเรเตอร์คือ ModuleScript ที่กำหนดว่าฟังก์ชัน ProceduralModel สร้างเนื้อหาของมันอย่างไร
-- ดูที่ https://create.roblox.com/docs/reference/engine/classes/ProceduralModel สำหรับรายละเอียด
--
-- เพื่อใช้เป็นเจนเนอเรเตอร์ โมดูลสคริปต์ต้องส่งคืนตารางที่มีฟิลด์สองฟิลด์:
-- * `Attributes` - ตำแหน่งที่มีข้อมูลค่าเริ่มต้น แต่ละกุญแจจะกลายเป็นพารามิเตอร์ใน
-- ProceduralModel ที่ใช้เจนเนอเรเตอร์นี้ ผู้ใช้สามารถปรับแต่งพาราเมตเหล่านี้
-- ในแผงคุณสมบัติเพื่อรันการสร้างด้วยค่าป้อนใหม่
-- * `OnGenerate` - ฟังก์ชันที่เครื่องยนต์เรียกใช้เพื่อสร้าง (สร้างใหม่) เนื้อหาของโมเดล
--
-- ไม่มีอะไรเกี่ยวกับสคริปต์หรือการวางที่พิเศษ มันสามารถอยู่ที่ไหนก็ได้ใน DataModel
-- และคุณสมบัติ `Generator` บน ProceduralModel สามารถกำหนดค่าใหม่เพื่อชี้ไปที่มันได้
-- การประกาศประเภทด้านล่างเป็นทางเลือกแต่ถูกบันทึกไว้ที่นี่เพื่อให้รูปร่างที่จำเป็นชัดเจน
-- `GenerationFunctionParams` จะถูกส่งไปที่ `OnGenerate` ทุกครั้งที่การสร้างรัน มันแสดง:
-- * `Attributes` - ค่าพารามิเตอร์ปัจจุบันบน ProceduralModel
-- * `Size` - ปริมาตรการใช้งานเพื่อสร้าง (จาก `ProceduralModel.Size`)
-- * `Pause` - การพักแบบร่วมมือเรียก `parameters:Pause()` ภายในลูปยาวเพื่อลดการหน่วง
-- การสร้างที่มีขนาดใหญ่ให้อยู่ภายในเธรดการเรียก; เครื่องยนต์อาจจะเริ่มใหม่คุณทีหลัง
ประเภท GenerationFunctionParams<Attributes> = {
Attributes: Attributes,
Size: Vector3,
Pause: (self: GenerationFunctionParams<Attributes>) -> (),
}
-- `GeneratorModuleDefinition` คือตารางที่โมดูลสคริปต์ต้องส่งคืน
-- `OnGenerate` ต้องไม่ส่งคืนค่า; ต้องสร้างบิดาไปที่ `targetContainer` แทน
-- สิ่งใด ๆ ที่ถูกให้เป็นพ่อแม่กับ `targetContainer` (หรือบุตรหลานของมัน) จะกลายเป็นผลลัพธ์ของการสร้าง
ประเภท GeneratorModuleDefinition<Attributes> = {
Attributes: Attributes,
OnGenerate: (
parameters: GenerationFunctionParams<Attributes>,
targetContainer: GeneratedFolder
) -> (),
}
-- พารามิเตอร์เริ่มต้น แต่ละรายการที่นี่แสดงขึ้นในฐานะพารามิเตอร์ที่แก้ไขได้บน ProceduralModel
-- `RandomSeed` คงที่ทำให้การสร้างมีความแบบคงที่: ค่าป้อนเดียวกันจะสร้างผลลัพธ์เดียวกันเสมอ
-- ซึ่งสำคัญเพราะการสามารถรันการสร้างหลายครั้งเมื่อผู้ใช้แก้ไขคุณสมบัติ
local defaultAttributes = {
BorderThickness = 1,
RandomSeed = 142376088,
}
local Generator: GeneratorModuleDefinition<typeof(defaultAttributes)> = {
Attributes = defaultAttributes,
OnGenerate = function(parameters, targetContainer)
-- ค่าป้อน `parameters.Attributes` สะท้อนค่าที่ผู้ใช้ตั้งบน
-- ProceduralModel; `parameters.Size` คือกรอบกว้างที่ต้องสร้าง
local borderThickness = parameters.Attributes.BorderThickness
local random = Random.new(parameters.Attributes.RandomSeed)
local size = parameters.Size
-- ค่าที่ได้ด้าย `random` ข้างต้นทำให้สิ่งเหล่านี้สามารถสร้างใหม่ได้ต่อ `RandomSeed`
local minSize = math.min(size.X, size.Y, size.Z)
local baseColor = Color3.fromHSV(random:NextNumber(0.5, 0.8), 0.7, 0.8)
local outlineColor = Color3.fromHSV(random:NextNumber(), 0.4, 0.25)
-- ตัวช่วยเล็กน้อยเพื่อทำให้การก่อสร้างข้างล่างอ่านจากบนไปล่าง คุณไม่จำเป็นต้อง
-- ตัวช่วยแบบนี้เพื่อเขียนเจนเนอเรเตอร์; มันจะช่วยลดการซ้ำซาก
local function assignProperties(instance: Instance, properties: { [string]: unknown })
-- ตั้งค่า Parent สุดท้ายเพื่อให้พารามิเตอร์อื่นอยู่ในตำแหน่งก่อนที่อินสแตนซ์จะเข้า
-- DataModel และเรียกใช้งานคำเปลี่ยนแปลง
for name, value in properties do
if name ~= "Parent" then
(instance :: any)[name] = value
end
end
if properties.Parent ~= nil then
instance.Parent = properties.Parent :: Instance
end
return instance
end
local function createInstance(className: string, properties: { [string]: unknown })
return assignProperties(Instance.new(className), properties)
end
local function createPartWithDefaults(properties: { [string]: unknown })
-- ส่วนที่สร้างขึ้นมักจะถูกยึดและไม่ชนกัน; ให้กำหนดสิ่งเหล่านี้เพื่อตอบสนองต่อตัวต่อ
local part = createInstance("Part", {
Anchored = true,
CanCollide = false,
Color = baseColor,
Material = Enum.Material.SmoothPlastic,
BottomSurface = Enum.SurfaceType.Smooth,
TopSurface = Enum.SurfaceType.Smooth,
})
return assignProperties(part, properties)
end
-- ทุกสิ่งด้านล่างจะเป็นบิดาใน `targetContainer` ซึ่งเป็นวิธีที่อินสแตนซ์กลายเป็น
-- ส่วนหนึ่งของผลลัพธ์ที่สร้างขึ้น อินสแตนซ์ที่ไม่เป็นพ่อแม่ที่นี่จะถูกทิ้ง
-- ส่วนขอบเขตที่มองไม่เห็นใช้เป็นกระดานโฆษณา
local bounds = createPartWithDefaults({
Name = "Bounds",
Parent = targetContainer,
Transparency = 1,
Size = size,
})
-- แพลตฟอร์มลึกที่มีขอบด้านล่าง
local base = createPartWithDefaults({
Name = "PlatformBase",
Parent = targetContainer,
Color = baseColor,
CFrame = CFrame.new(0, (-size.Y + 1) / 2, 0),
Size = Vector3.new(
size.X - 2 * borderThickness,
1.01,
size.Z - 2 * borderThickness
),
})
local outline = createPartWithDefaults({
Name = "PlatformOutline",
Parent = targetContainer,
Color = outlineColor,
Position = Vector3.yAxis * (-size.Y + 1) / 2,
Size = Vector3.new(size.X, 1, size.Z),
})
-- โฆษณา "Hello World!" เจนเนอเรเตอร์สามารถสร้างประเภทอินสแตนซ์ใดก็ได้ไม่ใช่เพียงแค่ส่วน
local billboard = createInstance("BillboardGui", {
Name = "Text",
Parent = targetContainer,
Adornee = bounds,
LightInfluence = 0,
Size = UDim2.fromScale(minSize, minSize),
})
local textLabel = createInstance("TextLabel", {
Name = "HelloWorld",
Parent = billboard,
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundTransparency = 1,
Position = UDim2.fromScale(0.5, 0.5),
Size = UDim2.fromScale(1, 1),
Text = "สวัสดีชาวโลก!",
TextColor3 = baseColor,
TextScaled = true,
TextStrokeTransparency = 0,
})
local textStroke = createInstance("UIStroke", {
Parent = textLabel,
Color = outlineColor,
Thickness = borderThickness * 3,
})
end,
}
-- การคืนค่าโมดูลนิยามเป็นสิ่งที่ทำให้ ModuleScript นี้ใช้งานได้ในฐานะ `Generator`
return Generator
โมดูลสร้างบันไดคลาสสิก
-- โมดูลสร้างเป็น ModuleScript ที่คืนค่าตารางที่มี `Attributes` และ `OnGenerate`.
-- การกำหนด ModuleScript นี้ให้กับคุณสมบัติ `Generator` ของ ProceduralModel จะเรียกใช้ `OnGenerate`
-- ทุกครั้งที่ขนาด รุ่น หรือแหล่งที่มาของโมดูลเปลี่ยนแปลง.
-- ดูที่ https://create.roblox.com/docs/reference/engine/classes/ProceduralModel.
local ClassicRobloxLadderGenerator = {}
-- ค่าคุณสมบัติเริ่มต้น ค่าที่แต่ละคีย์กลายเป็นคุณสมบัติที่แก้ไขได้บน ProceduralModel ใดๆ ที่
-- ใช้ตัวสร้างนี้ และแสดงในแผงคุณสมบัติของ Studio ภายใต้ Attributes การแก้ไข
-- ค่าของพวกมันทั้งหมดจะเรียกใช้ `OnGenerate` อีกครั้งด้วยค่าที่ใหม่.
ClassicRobloxLadderGenerator.Attributes = {
RungSpacing = 2,
RungThickness = 1,
PostSize = 1,
Color = Color3.new(0.5, 0.3, 0),
}
-- `OnGenerate` จะถูกเรียกโดยเอนจินเพื่อสร้างเนื้อหาของโมเดล.
-- สัญญา:
-- * `parameters.Size` - กล่องขอบเขต (จาก `ProceduralModel.Size`) ที่จะสร้างภายใน.
-- * `parameters.Attributes` - ค่าคุณสมบัติปัจจุบันบน ProceduralModel.
-- * `parameters:Pause()` - การหยุดชะงักร่วมมือ; เรียกใช้ภายในลูปยาวเพื่อให้การสร้างขนาดใหญ่
-- ไม่หยุดการทำงานของเธรด.
-- * `targetContainer` - สิ่งใดก็ตามที่เป็นพ่อแม่ที่นี่ (หรือไปยังลูกหลานของมัน) จะกลายเป็นผลลัพธ์.
-- * อย返回ค่าจาก `OnGenerate`; ผลลัพธ์จะสื่อสารผ่าน `targetContainer`.
ClassicRobloxLadderGenerator.OnGenerate = function(parameters, targetContainer)
local size = parameters.Size
local rungThickness = parameters.Attributes.RungThickness
local postSize = parameters.Attributes.PostSize
local count = (size.Y - rungThickness) // parameters.Attributes.RungSpacing + 1
local function createPart(position, size)
local part = Instance.new("Part")
part.Size = size
part.Position = position
part.Anchored = true
part.Color = parameters.Attributes.Color
part.TopSurface = Enum.SurfaceType.Smooth
part.BottomSurface = Enum.SurfaceType.Smooth
-- การเพิ่มเข้าไปใน `targetContainer` คือสิ่งที่เพิ่มชิ้นส่วนไปยังผลลัพธ์ที่สร้างขึ้น.
part.Parent = targetContainer
end
-- ขั้นบันไดที่วางซ้อนจากด้านล่างของกล่องขอบเขตขึ้นไป.
local position = Vector3.new(0, -size.Y / 2 + rungThickness / 2, 0)
for i = 1, count do
-- หยุดชะงักระหว่างขั้นบันไดเพื่อให้บันไดที่มีหลายขั้นไม่หยุดการทำงานของเธรด.
parameters:Pause()
createPart(position, Vector3.new(size.X - 2 * postSize, rungThickness, size.Z))
position += Vector3.new(0, parameters.Attributes.RungSpacing, 0)
end
-- เสาซ้ายและขวาที่ขยายจากความสูงทั้งหมด.
createPart(Vector3.new(-0.5 * size.X + postSize / 2, 0, 0), Vector3.new(postSize, size.Y, size.Z))
createPart(Vector3.new(0.5 * size.X - postSize / 2, 0, 0), Vector3.new(postSize, size.Y, size.Z))
end
-- การคืนค่าคำนิยามโมดูลคือสิ่งที่ทำให้ ModuleScript นี้ใช้งานได้เป็น `Generator`.
return ClassicRobloxLadderGenerator

Size
อ่านพร้อมๆ กัน
ความสามารถ: Basic
ProceduralModel.Size:Vector3

วิธีการ
ForceGeneration
ความสามารถ: Basic
ProceduralModel:ForceGeneration():boolean
ส่งค่ากลับ

WaitForGenerationAsync
ผลตอบแทน
ความสามารถ: Basic
ProceduralModel:WaitForGenerationAsync():boolean
ส่งค่ากลับ
ตัวอย่างโค้ด
การสร้างล้มเหลว
local proceduralModel = ...
proceduralModel:SetAttribute("ThrowAnError", true) --> ล้มเหลวโดยเจตนา
print(proceduralModel:WaitForGenerationAsync()) --> false

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ