배우기
엔진 클래스
ProceduralModel

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.



API 참조
속성
GenerationError
읽기 전용
복제되지 않음
병렬 읽기
기능: Basic
ProceduralModel.GenerationError:string

Generator
병렬 읽기
기능: Basic
ProceduralModel.Generator:ModuleScript
코드 샘플
기본 생성기 모듈
-- 생성기 모듈은 ProceduralModel이 콘텐츠를 생성하는 방법을 정의하는 ModuleScript입니다.
-- 자세한 내용은 https://create.roblox.com/docs/reference/engine/classes/ProceduralModel를 참조하십시오.
--
-- 생성기로 사용되기 위해, ModuleScript는 두 개의 필드를 가진 테이블을 반환해야 합니다:
-- * `Attributes` - 기본 값의 테이블입니다. 각 키는 이 생성기를 사용하는 모든ProceduralModel의 속성이 됩니다. 사용자는 이후 속성 패널에서 이 속성을 조정하여 새로운 입력으로 생성을 다시 실행할 수 있습니다.
-- * `OnGenerate` - 엔진이 모델의 내용을 (재)구성하기 위해 호출하는 함수입니다.
--
-- 이 스크립트나 그 배치의 어떤 것도 특별하지 않습니다. 데이터 모델 내의 어디에나 존재할 수 있으며,
-- ProceduralModel의 `Generator` 속성을 이를 가리키도록 재배정할 수 있습니다.
-- 아래의 타입 주석은 선택 사항이지만, 필요한 형태가 명시적이게 문서화되어 있습니다.
-- `GenerationFunctionParams`는 생성이 실행될 때마다 `OnGenerate`에 전달됩니다. 이는:
-- * `Attributes` - ProceduralModel의 현재 속성 값입니다.
-- * `Size` - 생성할 경계를 정의하는 부피입니다 (from `ProceduralModel.Size`).
-- * `Pause` - 협력적인 지연입니다. 긴 루프 내에서 `parameters:Pause()`를 호출하여 큰 생성이 호출 스레드를 정지시키지 않도록 하십시오; 엔진이 나중에 여러분을 재개할 수 있습니다.
type GenerationFunctionParams<Attributes> = {
Attributes: Attributes,
Size: Vector3,
Pause: (self: GenerationFunctionParams<Attributes>) -> (),
}
-- `GeneratorModuleDefinition`은 ModuleScript가 반환해야 하는 테이블입니다.
-- `OnGenerate`는 값을 반환해서는 안 되며, 대신 생성된 인스턴스를 `targetContainer`에 부모로 설정해야 합니다.
-- `targetContainer`(또는 그 자손)에 부모가 설정된 모든 것이 생성의 결과가 됩니다.
type 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를 마지막에 설정하여 다른 속성이 데이터 모델에 인스턴스가 들어가기 전에 제자리에 있게 합니다.
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,
})
-- 아래에 테두리 윤곽선이 있는 recessed 플랫폼입니다.
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),
})
-- "안녕하세요, 세계!" 빌보드. 생성기는 인스턴스 타입을 생성할 수 있으며, 파트만 가능한 것은 아닙니다.
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
클래식 사다리 생성기 모듈
-- 생성기 모듈은 `Attributes`와 `OnGenerate`가 있는 테이블을 반환하는 ModuleScript입니다.
-- 이 ModuleScript를 ProceduralModel의 `Generator` 속성에 할당하면 모델의 Size, 속성 또는 모듈 소스가 변경될 때마다 `OnGenerate`가 실행됩니다.
-- https://create.roblox.com/docs/reference/engine/classes/ProceduralModel를 참조하세요.
local ClassicRobloxLadderGenerator = {}
-- 기본 속성 값. 각 키는 이 생성기를 사용하는 모든 ProceduralModel에서 편집 가능한 속성이 되고,
-- Attributes 아래 Studio Properties 패널에 표시됩니다. 이들 중 아무것이라도 편집하면 새로운 값으로 `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()` - 협력적인 yield; 길어진 루프 안에서 호출하여 큰 생성을
-- 스레드를 멈추지 않도록 합니다.
-- * `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
-- 많은 단계가 있는 사다리가 스레드를 막지 않도록 각 단계 사이에 yield합니다.
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'은 미국 및 기타 국가 내 당사의 등록 및 미등록 상표입니다.