Clase de motor
Terrain
*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.
Resumen
Propiedades
MaterialColors:BinaryString |
Métodos
Miembros heredados
106 heredado de BasePart
4 heredado de PVInstance
58 heredado de Instance
6 heredado de Object
Referencia API
Propiedades
IsSmooth
MaterialColors
Terrain.MaterialColors:BinaryString
Métodos
AutowedgeCell
AutowedgeCells
CellCenterToWorld
CellCornerToWorld
Clear
Terrain:Clear():()
Devuelve
()
ConvertToSmooth
CopyRegion
Parámetros
Devuelve
Muestras de código
Terrain:CopyRegion()
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)FillBall
Parámetros
Devuelve
()
FillBlock
Parámetros
Devuelve
()
FillCylinder
Parámetros
Devuelve
()
FillRegion
Parámetros
Devuelve
()
FillWedge
Parámetros
Devuelve
()
GetCell
GetMaterialColor
Parámetros
Devuelve
GetMaterialSlot
Parámetros
Devuelve
Muestras de código
Espacios de Material del Terreno
local MaterialService = game:GetService("MaterialService")
local Terrain = workspace.Terrain
-- Los espacios 2 a 63 son escribibles; los espacios 0 y 1 están reservados para Aire y Agua
local SLOT_INDEX = 2
local BASE_MATERIAL = Enum.Material.Grass
local VARIANT_NAME = "SwampVariant"
-- Encuentra un MaterialVariant existente para el material base, o crea uno
-- SetMaterialSlot() espera el nombre del variante, no el nombre de visualización del Material Manager
local variant = MaterialService:FindFirstChild(VARIANT_NAME)
if not variant then
variant = Instance.new("MaterialVariant")
variant.Name = VARIANT_NAME
variant.BaseMaterial = BASE_MATERIAL
variant.Parent = MaterialService
end
-- Configura el espacio con el material base, el nombre del MaterialVariant y un tinte
-- Pasa una cadena vacía en lugar de un nombre de variante para usar la apariencia predeterminada del material base teñida por el color dado
Terrain:SetMaterialSlot(SLOT_INDEX, BASE_MATERIAL, variant.Name, Color3.fromRGB(50, 60, 30))
local baseMaterial, materialVariant, color = Terrain:GetMaterialSlot(SLOT_INDEX)
print(baseMaterial, materialVariant, color)
-- Escribe una región de vóxeles que referencia el espacio por índice, en lugar de por Enum.Material, usando el canal SolidMaterialIndex
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 16, 16)):ExpandToGrid(4)
local size = region.Size / 4
local materialIndices = {}
local occupancies = {}
for x = 1, size.X do
materialIndices[x] = {}
occupancies[x] = {}
for y = 1, size.Y do
materialIndices[x][y] = {}
occupancies[x][y] = {}
for z = 1, size.Z do
materialIndices[x][y][z] = SLOT_INDEX
occupancies[x][y][z] = 1
end
end
end
Terrain:WriteVoxelChannels(region, 4, {
SolidMaterialIndex = materialIndices,
SolidOccupancy = occupancies,
})
-- Limpiar el espacio deja vóxeles que lo referencian renderizándose como inválidos hasta que se repinten con un índice de espacio válido
Terrain:ResetMaterialSlot(SLOT_INDEX)GetWaterCell
PasteRegion
Parámetros
Devuelve
()
Muestras de código
Crear, Copiar y Pegar Terreno
local Terrain = workspace.Terrain
-- Crea una región de terreno simple
local initialRegion = Region3.new(Vector3.zero, Vector3.one * 10)
Terrain:FillRegion(initialRegion, 4, Enum.Material.Grass)
-- Copia la región
local copyRegion = Region3int16.new(Vector3int16.new(0, 0, 0), Vector3int16.new(10, 10, 10))
local copiedRegion = Terrain:CopyRegion(copyRegion)
-- Define dónde pegar la región
local newRegionCorner = Vector3int16.new(5, 0, 0)
-- Pega la región
Terrain:PasteRegion(copiedRegion, newRegionCorner, true)ReadVoxelChannels
Devuelve
Muestras de código
Terrain:ReadVoxelChannels()
local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local function printRegion(terrain, region)
local channelOutput = terrain:ReadVoxelChannels(region, 4, { "OcupaciónSólida", "MaterialSólido", "OcupaciónLíquida" })
local size = channelOutput.Size
for x = 1, size.X do
for y = 1, size.Y do
for z = 1, size.Z do
print(
("(%2i, %2i, %2i): %.2f %s %.2f"):format(
x,
y,
z,
channelOutput.SolidOccupancy[x][y][z],
channelOutput.SolidMaterial[x][y][z].Name,
channelOutput.LiquidOccupancy[x][y][z]
)
)
end
end
end
end
local region = Region3.new(REGION_START, REGION_END)
printRegion(workspace.Terrain, region)ReadVoxels
Devuelve
Muestras de código
Terrain:ReadVoxels()
local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local function printRegion(terrain, region)
local materials, occupancies = terrain:ReadVoxels(region, 4)
local size = materials.Size -- Igual que occupancies.Size
for x = 1, size.X, 1 do
for y = 1, size.Y, 1 do
for z = 1, size.Z, 1 do
print(("(%2i, %2i, %2i): %.2f %s"):format(x, y, z, occupancies[x][y][z], materials[x][y][z].Name))
end
end
end
end
local region = Region3.new(REGION_START, REGION_END)
printRegion(workspace.Terrain, region)ReplaceMaterial
Terrain:ReplaceMaterial(
):()
Parámetros
Devuelve
()
Muestras de código
Terrain:ReplaceMaterial
local terrain = workspace.Terrain
local region = Region3.new(Vector3.new(-20, -20, -20), Vector3.new(20, 20, 20))
local resolution = 4
local materialToReplace = Enum.Material.Grass
local replacementMaterial = Enum.Material.Asphalt
terrain:ReplaceMaterial(region, resolution, materialToReplace, replacementMaterial)ResetMaterialSlot
Parámetros
Devuelve
()
Muestras de código
Espacios de Material del Terreno
local MaterialService = game:GetService("MaterialService")
local Terrain = workspace.Terrain
-- Los espacios 2 a 63 son escribibles; los espacios 0 y 1 están reservados para Aire y Agua
local SLOT_INDEX = 2
local BASE_MATERIAL = Enum.Material.Grass
local VARIANT_NAME = "SwampVariant"
-- Encuentra un MaterialVariant existente para el material base, o crea uno
-- SetMaterialSlot() espera el nombre del variante, no el nombre de visualización del Material Manager
local variant = MaterialService:FindFirstChild(VARIANT_NAME)
if not variant then
variant = Instance.new("MaterialVariant")
variant.Name = VARIANT_NAME
variant.BaseMaterial = BASE_MATERIAL
variant.Parent = MaterialService
end
-- Configura el espacio con el material base, el nombre del MaterialVariant y un tinte
-- Pasa una cadena vacía en lugar de un nombre de variante para usar la apariencia predeterminada del material base teñida por el color dado
Terrain:SetMaterialSlot(SLOT_INDEX, BASE_MATERIAL, variant.Name, Color3.fromRGB(50, 60, 30))
local baseMaterial, materialVariant, color = Terrain:GetMaterialSlot(SLOT_INDEX)
print(baseMaterial, materialVariant, color)
-- Escribe una región de vóxeles que referencia el espacio por índice, en lugar de por Enum.Material, usando el canal SolidMaterialIndex
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 16, 16)):ExpandToGrid(4)
local size = region.Size / 4
local materialIndices = {}
local occupancies = {}
for x = 1, size.X do
materialIndices[x] = {}
occupancies[x] = {}
for y = 1, size.Y do
materialIndices[x][y] = {}
occupancies[x][y] = {}
for z = 1, size.Z do
materialIndices[x][y][z] = SLOT_INDEX
occupancies[x][y][z] = 1
end
end
end
Terrain:WriteVoxelChannels(region, 4, {
SolidMaterialIndex = materialIndices,
SolidOccupancy = occupancies,
})
-- Limpiar el espacio deja vóxeles que lo referencian renderizándose como inválidos hasta que se repinten con un índice de espacio válido
Terrain:ResetMaterialSlot(SLOT_INDEX)SetCell
SetCells
SetMaterialColor
Parámetros
Devuelve
()
SetMaterialSlot
Terrain:SetMaterialSlot(
):()
Parámetros
Devuelve
()
Muestras de código
Espacios de Material del Terreno
local MaterialService = game:GetService("MaterialService")
local Terrain = workspace.Terrain
-- Los espacios 2 a 63 son escribibles; los espacios 0 y 1 están reservados para Aire y Agua
local SLOT_INDEX = 2
local BASE_MATERIAL = Enum.Material.Grass
local VARIANT_NAME = "SwampVariant"
-- Encuentra un MaterialVariant existente para el material base, o crea uno
-- SetMaterialSlot() espera el nombre del variante, no el nombre de visualización del Material Manager
local variant = MaterialService:FindFirstChild(VARIANT_NAME)
if not variant then
variant = Instance.new("MaterialVariant")
variant.Name = VARIANT_NAME
variant.BaseMaterial = BASE_MATERIAL
variant.Parent = MaterialService
end
-- Configura el espacio con el material base, el nombre del MaterialVariant y un tinte
-- Pasa una cadena vacía en lugar de un nombre de variante para usar la apariencia predeterminada del material base teñida por el color dado
Terrain:SetMaterialSlot(SLOT_INDEX, BASE_MATERIAL, variant.Name, Color3.fromRGB(50, 60, 30))
local baseMaterial, materialVariant, color = Terrain:GetMaterialSlot(SLOT_INDEX)
print(baseMaterial, materialVariant, color)
-- Escribe una región de vóxeles que referencia el espacio por índice, en lugar de por Enum.Material, usando el canal SolidMaterialIndex
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 16, 16)):ExpandToGrid(4)
local size = region.Size / 4
local materialIndices = {}
local occupancies = {}
for x = 1, size.X do
materialIndices[x] = {}
occupancies[x] = {}
for y = 1, size.Y do
materialIndices[x][y] = {}
occupancies[x][y] = {}
for z = 1, size.Z do
materialIndices[x][y][z] = SLOT_INDEX
occupancies[x][y][z] = 1
end
end
end
Terrain:WriteVoxelChannels(region, 4, {
SolidMaterialIndex = materialIndices,
SolidOccupancy = occupancies,
})
-- Limpiar el espacio deja vóxeles que lo referencian renderizándose como inválidos hasta que se repinten con un índice de espacio válido
Terrain:ResetMaterialSlot(SLOT_INDEX)SetWaterCell
WorldToCellPreferEmpty
WorldToCellPreferSolid
WriteVoxelChannels
Parámetros
Devuelve
()
Muestras de código
Terrain:WriteVoxelChannels()
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(64, 32, 64))
local RESOLUTION = 4
local OCC_EPSILON = 1 / 256
local function generateRandomTerrainInRegion(regionInput)
local region = regionInput:ExpandToGrid(4)
local size = region.Size / 4
local solidMaterials = {}
local solidOccupancies = {}
local waterOcc = {}
for x = 1, size.X do
table.insert(solidMaterials, {})
table.insert(solidOccupancies, {})
table.insert(waterOcc, {})
for y = 1, size.Y do
table.insert(solidMaterials[x], {})
table.insert(solidOccupancies[x], {})
table.insert(waterOcc[x], {})
for z = 1, size.Z do
local mat = if math.random() < 0.5 then Enum.Material.Air else Enum.Material.Sand
local occ = 0
local water = math.random()
if mat == Enum.Material.Sand then
occ = math.random() / 2 + 0.5
if occ > 1 - OCC_EPSILON then
water = 0 -- Los sólidos no pueden contener agua
end
else
occ = 0
end
table.insert(solidMaterials[x][y], mat)
table.insert(solidOccupancies[x][y], occ)
table.insert(waterOcc[x][y], water)
end
end
end
return { SolidMaterial = solidMaterials, SolidOccupancy = solidOccupancies, LiquidOccupancy = waterOcc }
end
local regionContent = generateRandomTerrainInRegion(region)
workspace.Terrain:WriteVoxelChannels(region, 4, regionContent)WriteVoxels
Devuelve
()
Muestras de código
Terrain:WriteVoxels()
local terrain = workspace.Terrain
local resolution = 4
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 28, 20)):ExpandToGrid(resolution)
local materials = {
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.Sand,
Enum.Material.Sand,
Enum.Material.Sand,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Snow, Enum.Material.Air },
},
{
{
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
Enum.Material.CrackedLava,
},
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock, Enum.Material.Rock },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand, Enum.Material.Sand },
{ Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud, Enum.Material.Mud },
{ Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air, Enum.Material.Air },
},
}
local occupancies = {
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 0.5, 0.5, 0.5, 0.5 },
{ 0, 0, 0, 0, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 1, 1, 1, 0.5 },
{ 0, 1, 1, 1, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 1, 1, 1, 0.5 },
{ 0, 1, 1, 1, 0 },
},
{
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 1, 1, 1, 1, 1 },
{ 0.5, 0.5, 0.5, 0.5, 0.5 },
{ 0, 0, 0, 0, 0 },
},
}
terrain:WriteVoxels(region, resolution, materials, occupancies)