Lớp công cụ
ProceduralModel
*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.
Tóm Tắt
Phương Pháp
Thành viên kế thừa
26 thành viên kế thừa từ Model
4 thành viên kế thừa từ PVInstance
57 thành viên kế thừa từ Instance
6 thành viên kế thừa từ Object
Tài Liệu Tham Khảo API
Thuộc Tính
Generator
Mẫu mã
Mô-đun Tạo Mặc Định
-- Một mô-đun tạo là một ModuleScript định nghĩa cách mà một ProceduralModel xây dựng nội dung của nó.
-- Xem https://create.roblox.com/docs/reference/engine/classes/ProceduralModel để biết thêm chi tiết.
--
-- Để được sử dụng như một mô-đun tạo, ModuleScript phải trả về một bảng với hai trường:
-- * `Attributes` - một bảng chứa các giá trị mặc định. Mỗi khóa trở thành một thuộc tính trên mỗi
-- ProceduralModel sử dụng mô-đun tạo này. Người dùng có thể điều chỉnh các
-- thuộc tính này trong bảng thuộc tính để chạy lại quá trình tạo với các đầu vào mới.
-- * `OnGenerate` - một hàm mà engine gọi để (tái) xây dựng nội dung của mô hình.
--
-- Không có gì đặc biệt về script này hoặc vị trí của nó. Nó có thể nằm ở bất kỳ đâu trong DataModel
-- và thuộc tính `Generator` trên một ProceduralModel có thể được gán lại để chỉ vào nó.
-- Các chú thích kiểu bên dưới là tùy chọn nhưng được tài liệu hóa ở đây để hình dạng cần thiết là rõ ràng.
-- `GenerationFunctionParams` được truyền vào `OnGenerate` mỗi khi quá trình tạo chạy. Nó cung cấp:
-- * `Attributes` - các giá trị thuộc tính hiện tại trên ProceduralModel.
-- * `Size` - khối lượng giới hạn để tạo bên trong (từ `ProceduralModel.Size`).
-- * `Pause` - một yield hợp tác. Gọi `parameters:Pause()` bên trong các vòng lặp dài để các
-- quá trình tạo lớn không làm tắc nghẽn luồng gọi; engine có thể tiếp tục bạn sau.
type GenerationFunctionParams<Attributes> = {
Attributes: Attributes,
Size: Vector3,
Pause: (self: GenerationFunctionParams<Attributes>) -> (),
}
-- `GeneratorModuleDefinition` là bảng mà ModuleScript phải trả về.
-- `OnGenerate` không được trả về một giá trị; thay vào đó, hãy cha mẹ các thể hiện được tạo vào `targetContainer`.
-- Bất kỳ thứ gì được cha mẹ vào `targetContainer` (hoặc các con của nó) trở thành đầu ra của quá trình tạo.
type GeneratorModuleDefinition<Attributes> = {
Attributes: Attributes,
OnGenerate: (
parameters: GenerationFunctionParams<Attributes>,
targetContainer: GeneratedFolder
) -> (),
}
-- Các thuộc tính mặc định. Mỗi mục ở đây xuất hiện như một thuộc tính có thể chỉnh sửa trên ProceduralModel.
-- Một `RandomSeed` cố định giữ cho quá trình tạo có tính xác định: các đầu vào giống nhau luôn tạo ra cùng một
-- đầu ra, điều này quan trọng vì quá trình tạo có thể chạy nhiều lần khi người dùng chỉnh sửa thuộc tính.
local defaultAttributes = {
BorderThickness = 1,
RandomSeed = 142376088,
}
local Generator: GeneratorModuleDefinition<typeof(defaultAttributes)> = {
Attributes = defaultAttributes,
OnGenerate = function(parameters, targetContainer)
-- Đầu vào. `parameters.Attributes` phản ánh bất cứ điều gì mà người dùng đã thiết lập trên
-- ProceduralModel; `parameters.Size` là hộp giới hạn để xây dựng vào.
local borderThickness = parameters.Attributes.BorderThickness
local random = Random.new(parameters.Attributes.RandomSeed)
local size = parameters.Size
-- Các giá trị được suy ra. `random` đã được hạt giống ở trên làm cho những điều này có thể tái tạo theo 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)
-- Các trợ giúp nhỏ để làm cho việc xây dựng bên dưới dễ đọc từ trên xuống dưới. Bạn không cần
-- các trợ giúp như thế này để viết một mô-đun tạo; chúng chỉ giảm bớt sự lặp lại.
local function assignProperties(instance: Instance, properties: { [string]: unknown })
-- Đặt Parent cuối cùng để các thuộc tính khác được đặt trước khi thể hiện vào
-- DataModel và kích hoạt các sự kiện Changed.
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 })
-- Các phần được tạo thường được neo và không va chạm; ghi đè từng phần khi cần.
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
-- Mọi thứ bên dưới đều cha mẹ vào `targetContainer`, đây là cách các thể hiện trở thành
-- một phần của đầu ra được tạo. Các thể hiện không được cha mẹ ở đây sẽ bị loại bỏ.
-- Phần giới hạn vô hình được sử dụng làm billboard adornee.
local bounds = createPartWithDefaults({
Name = "Bounds",
Parent = targetContainer,
Transparency = 1,
Size = size,
})
-- Một nền tảng lún với một viền bên dưới nó.
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),
})
-- "Xin chào thế giới!" billboard. Các mô-đun tạo có thể tạo bất kỳ loại thể hiện nào, không chỉ các phần.
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 = "Xin chào thế giới!",
TextColor3 = baseColor,
TextScaled = true,
TextStrokeTransparency = 0,
})
local textStroke = createInstance("UIStroke", {
Parent = textLabel,
Color = outlineColor,
Thickness = borderThickness * 3,
})
end,
}
-- Trả về định nghĩa mô-đun là điều làm cho ModuleScript này có thể sử dụng như một `Generator`.
return GeneratorMô-đun Tạo Thang Cổ Điển
-- Một mô-đun tạo là một ModuleScript trả về một bảng với `Attributes` và `OnGenerate`.
-- Gán ModuleScript này cho thuộc tính `Generator` của ProceduralModel sẽ chạy `OnGenerate`
-- bất cứ khi nào kích thước, thuộc tính hoặc nguồn mô-đun của mô hình thay đổi.
-- Xem https://create.roblox.com/docs/reference/engine/classes/ProceduralModel.
local ClassicRobloxLadderGenerator = {}
-- Các giá trị thuộc tính mặc định. Mỗi khóa trở thành một thuộc tính có thể chỉnh sửa trên bất kỳ ProceduralModel nào
-- sử dụng bộ tạo này, và hiển thị trong bảng thuộc tính của Studio dưới Attributes. Chỉnh sửa bất kỳ
-- trong số chúng sẽ chạy lại `OnGenerate` với các giá trị mới.
ClassicRobloxLadderGenerator.Attributes = {
RungSpacing = 2,
RungThickness = 1,
PostSize = 1,
Color = Color3.new(0.5, 0.3, 0),
}
-- `OnGenerate` được gọi bởi engine để xây dựng nội dung của mô hình.
-- Hợp đồng:
-- * `parameters.Size` - hộp giới hạn (từ `ProceduralModel.Size`) để xây dựng bên trong.
-- * `parameters.Attributes` - các giá trị thuộc tính hiện tại trên ProceduralModel.
-- * `parameters:Pause()` - gián đoạn hợp tác; gọi bên trong những vòng lặp dài để các quá trình lớn
-- không làm tắc nghẽn luồng.
-- * `targetContainer` - bất cứ thứ gì được làm cha ở đây (hoặc đến các hậu duệ của nó) trở thành đầu ra.
-- * Không trả về giá trị từ `OnGenerate`; đầu ra được truyền đạt qua `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
-- Việc làm cha vào `targetContainer` là thứ thêm phần này vào đầu ra được tạo ra.
part.Parent = targetContainer
end
-- Các bậc, xếp chồng từ đáy của hộp giới hạn lên trên.
local position = Vector3.new(0, -size.Y / 2 + rungThickness / 2, 0)
for i = 1, count do
-- Gián đoạn giữa các bậc để một cái thang với nhiều bậc không chặn luồng.
parameters:Pause()
createPart(position, Vector3.new(size.X - 2 * postSize, rungThickness, size.Z))
position += Vector3.new(0, parameters.Attributes.RungSpacing, 0)
end
-- Các cột bên trái và bên phải trải dài toàn bộ chiều cao.
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
-- Trả về định nghĩa mô-đun là điều làm cho ModuleScript này có thể sử dụng như một `Generator`.
return ClassicRobloxLadderGeneratorPhương Pháp