Terrain

Mostrar obsoleto

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

No creable

El terreno te permite crear entornos dinámicamente morfos con poca o ninguna lag. Actualmente está basado en una cuadrícula de celdas 4×4×4, donde cada celda tiene un número entre 0 y 1 que representa la cantidad de geometría que ocupa la celda, y el material de la celda. La ocupación determina cómo la celda se transformará con las celdas circundantes, y el resultado es la ilusión de tener una celda con ninguna restriccióncuadrícula.

Para obtener más información, see terreno .

Resumen

Propiedades

Propiedades heredados de BasePartPropiedades heredados de PVInstance

Métodos

Métodos heredados de BasePartMétodos heredados de PVInstance

Eventos

Eventos heredados de BasePart

Propiedades

Decoration

No programable
Leer paralelo

Actualmente habilita o deshabilita el pasto animado en el material de terreno hierba , aunque futuras modificaciones de esta propiedad pueden controlar características decorativas adicionales.

GrassLength

No programable
Leer paralelo

Especifica la longitud de la hierba animada en el material de terreno Hierba , admitiendo que Decoration está habilitado. Los valores válidos están entre 0.1 y 1.

MaterialColors

BinaryString
No programable
Leer paralelo

MaterialColors representa el editor para la función de color del material, y no se puede editar por scripts .

Para obtener el color de un material, usa: Terrain:GetMaterialColor()

Para establecer el color de un material, usa: Terrain:SetMaterialColor()

MaxExtents

Solo lectura
No replicado
Leer paralelo

Muestra los límites de la región más grande posible para editar.

WaterColor

Leer paralelo

El tinte del agua del terreno.

WaterReflectance

Leer paralelo

Controla la opacidad de los reflejos de agua del terreno.

WaterTransparency

Leer paralelo

La transparencia del agua del terreno.

WaterWaveSize

Leer paralelo

Establece la altura máxima de las olas de agua del terreno en studs. Esto está actualmente limitado entre 0 y 1.

WaterWaveSpeed

Leer paralelo

Establece la cantidad de veces que las olas de agua del terreno se moverán hacia arriba y hacia abajo por minuto. Esto está actualmente limitado entre 0 y 100.

Métodos

CellCenterToWorld

Devuelve la posición mundial del centro de la celda de terreno (x, y, z).

Parámetros


Devuelve

CellCornerToWorld

Restablece la posición de la esquina inferior izquierda-frente de la celda de la cuadrícula (x, y, z).

Parámetros


Devuelve

Clear

void

Elimina el terreno.


Devuelve

void

CopyRegion

Almacena un pedazo de terreno en un objeto TerrainRegion para que se pueda cargar más tarde. Nota: los datos de TerrainRegion no se replican entre el servidor y el cliente.

Parámetros

region: Region3int16

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)

CountCells

Devuelve el número de no hay espacios en el terreno.


Devuelve

FillBall

void

Llena un balón de terreno liso en un espacio dado.

Parámetros

center: Vector3

La posición del centro de la bola de terreno.

radius: number

El radio en studs de la bola de terreno.

material: Enum.Material

El Enum.Material de la bola de terreno.


Devuelve

void

Muestras de código

Filling a Ball of Terrain

local Workspace = game:GetService("Workspace")
-- Creates a ball of grass at (0,0,-10) with a radius of 10 studs
Workspace.Terrain:FillBall(Vector3.new(0, 0, -10), 10, Enum.Material.Grass)

FillBlock

void

Rellena un bloque de terreno liso con una ubicación, rotación, tamaño y material dado.

Parámetros

cframe: CFrame

El cFrame (posición y orientación) del bloquesde terreno.

size: Vector3

El tamaño en pies de cuadrado del bloque - tanto la altura como la ancho.

material: Enum.Material

El Enum.Material del bloquesde terreno.


Devuelve

void

FillCylinder

void

Rellena un cilindro de terreno liso en un espacio dado. El espacio se define usando un CFrame, altura y radio.

Uso


workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)

Parámetros

cframe: CFrame

El CFrame (posición y orientación) del cilindro de terreno.

height: number

La altura en pies de la cilindra de terreno.

radius: number

El radio en studs del cilindro de terreno.

material: Enum.Material

El Enum.Material del cilindro de terreno.


Devuelve

void

FillRegion

void

Llena un espacio Region3 con terreno liso.

Parámetros

region: Region3
resolution: number
material: Enum.Material

Devuelve

void

FillWedge

void

FillWedge() llena un volumen en forma de cuda de Terrain con el dado Enum.Material y el área 0> Datatype.CFrame0> y el tamaño. La orientación del cuda es la misma que una versión equivalente FillWedge()3> .

Parámetros

cframe: CFrame

La posición y orientación de la cunilla para llenar.

size: Vector3

El tamaño de la cunilla para llenar.

material: Enum.Material

El material con el que se llenará el cuello.


Devuelve

void

GetMaterialColor

Escribir paralelo

Restablece el color de material de terreno actual para el material de terreno especificado.

Parámetros

material: Enum.Material

Devuelve

PasteRegion

void

Aplica un pedazo de terreno al objeto de terreno. Nota: los datos de TerrainRegion no se replican entre el servidor y el cliente.

Parámetros

corner: Vector3int16
pasteEmptyCells: bool

Devuelve

void

Muestras de código

Create, Copy and Paste Terrain

--[[
Note: The use of int16 variants for these API is the result of legacy code.
The underlying voxel grid system uses Vector3int32 (Vector3).
]]
local Workspace = game:GetService("Workspace")
local Terrain = Workspace.Terrain
-- Create a simple terrain region (a 10x10x10 block of grass)
local initialRegion = Region3.new(Vector3.zero, Vector3.one * 10)
Terrain:FillRegion(initialRegion, 4, Enum.Material.Grass)
-- Copy the region using Terrain:CopyRegion
local copyRegion = Region3int16.new(Vector3int16.new(0, 0, 0), Vector3int16.new(10, 10, 10))
local copiedRegion = Terrain:CopyRegion(copyRegion)
-- Define where to paste the region (in this example, offsetting by 5 studs on the X-axis)
local newRegionCorner = Vector3int16.new(5, 0, 0)
-- Paste the region using Terrain:PasteRegion
Terrain:PasteRegion(copiedRegion, newRegionCorner, true)

ReadVoxelChannels

Escribir paralelo

Regresa un conjunto de datos de voxel de terreno en formato de tabla según los nombres de los canales.

Parámetros

region: Region3

Región de destino para leer. Debe estar alineado con la cuadrícula de voxel. Se lanzará un error si la región es demasiado grande; el límite es actualmente 4194304 voxels³.

resolution: number

Resolución de Voxel. Debe ser 4.

channelIds: Array

Array de ID de canal (cadenas) que necesitan ser accedidos desde los datos del voxel. Cada ID de canal representa un tipo de datos que se almacena en el Vóxel. Los ID actualmente admitidos son {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .


Devuelve

Devuelve datos de voxel como un diccionario basado en la entrada channelIds. Las llaves representan cada ID de canal con su valor respectivo como un conjunto de datos 3D.

  • SolidMaterial — El material de Enum.Material del Vóxel. Nota que Water ya no se soporta; en cambio, un voxel que contiene agua tendrá un valor de 0> LiquidOccupancy0> .
  • SolidOccupancy — El ocupación del material del Vóxelcomo se especifica en el canal SolidMaterial . Este es un valor entre 0 (vacío) y 1 (lleno).
  • LiquidOccupancy — Escribe la ocupación del material Water en un voxel como valor entre 0 (sin agua) y 1 (lleno de agua). Si la SolidOccupancy es 1 y la SolidMaterial no es SolidOccupancy, esto será 0.

El diccionario también contiene una llave Size con un valor que representa el tamaño del 3D del valor de cada canal de datos.

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, {"SolidOccupancy", "SolidMaterial", "LiquidOccupancy"})
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

Escribir paralelo

Regresa una región determinada de terreno liso en formato de tabla.

Parámetros

region: Region3

Región de destino para leer. Debe estar alineado con la cuadrícula de voxel. Se lanzará un error si la región es demasiado grande. El límite es actualmente 4194304 voxels^3.

resolution: number

Resolución de Voxel. Debe ser 4.


Devuelve

Devuelve datos de voxel sin procesar como dos 3D arrays.

  • materials - Mat阵 3D de Enum.Material desde la zona de destino. También contiene un campo de tamaño, igual que las dimensiones de los mat阵 anidados.
  • occupancies - Matriz 3D de valores de ocupación desde la zona de destino. También contiene un campo de tamaño, igual que las dimensiones de los arrays de nidos.

Muestras de código

Terrain:ReadVoxels() Code Example

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 -- Same as 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

void

ReemplazarMaterial reemplaza el terreno de un cierto Enum.Material dentro de un Region3 con otro material. Esencialmente, es una operación de búsqueda y reemplazo en los materiales de Class.Terrain ".

Limitaciones

Cuando se llama a este método, el parámetro resolution debe ser exactamente 4. Además, el Region3 debe alinearse con la cuadrícula de materiales del terreno, es decir, los componentes de los puntos mínimo y máximo de la Region3 deben ser divibles por 4. Usa Region3:ExpandToGrid() para hacer una región compatible con esta función.

Parámetros

region: Region3

La región en la que se llevará a producirsela operación de reemplazo.

resolution: number

La resolución a la que tendrá lugar la operación de reemplazo; en este momento, debe ser exactamente 4.

sourceMaterial: Enum.Material

El viejo material que se deberá reemplazar.

targetMaterial: Enum.Material

El nuevo material.


Devuelve

void

Muestras de código

Terrain:ReplaceMaterial

local Workspace = game:GetService("Workspace")
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)

SetMaterialColor

void

Establece el color de material de terreno actual para el material de terreno especificado. El material de terreno cambiará su color de base hacia el color especificado.

Parámetros

material: Enum.Material
value: Color3

Devuelve

void

WorldToCell

Devuelve la ubicación de la celda de la cuadrícula que contiene el punto posición .

Parámetros

position: Vector3

Devuelve

WorldToCellPreferEmpty

Devuelve la posición de la celda de la cuadrícula que contiene la posición del punto, preferiblemente sin espacios de celda de la cuadrícula cuando la posición está en un borde de la cuadrícula.

Parámetros

position: Vector3

Devuelve

WorldToCellPreferSolid

Devuelve la ubicación de la celda de la cuadrícula que contiene la posición del punto, preferiblemente no hay espacios no vacíos entre las filas de la cuadrícula cuando la posición está en un borde de la cuadrícula.

Parámetros

position: Vector3

Devuelve

WriteVoxelChannels

void

Establece una región de terreno usando un diccionario de datos de canal de voxel.

Parámetros

region: Region3

Región de destino para escribir. Debe estar alineado con la cuadrícula de voxel. Se lanzará un error si la región es demasiado grande; el límite es actualmente 4194304 voxels³.

resolution: number

Resolución de Voxel. Debe ser 4.

channels: Dictionary

Diccionario de datos de voxel similar al valor de regreso de ReadVoxelChannels() . Las llaves representan cada ID de canal con su valor respectivo como un conjunto de datos 3D. El diccionario puede admitir una o más entradas de canal.

  • SolidMaterial — El material de Enum.Material del Vóxel. Nota que Water ya no se soporta; en cambio, un voxel que solo contiene agua debe ingresarse como 0> SolidMaterial = Enum.Material.Air, LiquidOccupancy = x
  • SolidOccupancy — El ocupación del material del Vóxelcomo se especifica en el canal SolidMaterial . Esto debería ser un valor entre 0 (vacío) y 1 (lleno).
  • LiquidOccupancy — Escribe la ocupación del material Water en un voxel como valor entre 0 (sin agua) y 1 (lleno de agua). Si la SolidOccupancy es 1 y la SolidMaterial no es SolidOccupancy, esto será 0.

Devuelve

void

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 -- Solids cannot contain water
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

void

Establece una región determinada de terreno liso usando el formato de la tabla.

Parámetros

region: Region3

Región de destino para escribir. Tiene que estar alineado con la cuadrícula de voxel. Mostrará un error si la región es demasiado grande.

resolution: number

Resolución de Voxel. Debe ser 4.

materials: Array

3D array de Enum.Material. Las dimensiones deben coincidir exactamente con el tamaño de la región objetivo en voxeles.

occupancy: Array

3D array de ocupaciones de voxel (número entre 0 y 1). Las dimensiones deben coincidir exactamente con el tamaño de la región objetivo en voxels.


Devuelve

void

Muestras de código

Example

local Workspace = game:GetService("Workspace")
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)
Maximum Region Size

local REGION_START = Vector3.new(-20, -20, -20)
local REGION_END = Vector3.new(20, 20, 20)
local CFRAME = CFrame.new(0, 20, 0)
local SIZE = 50
local function getRegionVolumeVoxels(region)
local resolution = 4
local size = region.Size
return (size.x / resolution) * (size.y / resolution) * (size.z / resolution)
end
local function isRegionTooLargeForReadWriteVoxels(region)
return getRegionVolumeVoxels(region) > 4194304
end
local function isRegionTooLarge(region)
return getRegionVolumeVoxels(region) > 67108864
end
-- Helper function to get an axis-aligned Region3 from the given cframe and size
local function getAABBRegion(cframe, size)
local inv = cframe:Inverse()
local x = size * inv.RightVector
local y = size * inv.UpVector
local z = size * inv.LookVector
local w = math.abs(x.X) + math.abs(x.Y) + math.abs(x.Z)
local h = math.abs(y.X) + math.abs(y.Y) + math.abs(y.Z)
local d = math.abs(z.X) + math.abs(z.Y) + math.abs(z.Z)
local pos = cframe.Position
local halfSize = Vector3.new(w, h, d) / 2
return Region3.new(pos - halfSize, pos + halfSize):ExpandToGrid(4)
end
-- Specific functions for checking individual methods
local function isRegionTooLargeForFillBall(cframe, radius)
local diameter = radius * 2
return isRegionTooLarge(getAABBRegion(cframe, Vector3.new(diameter, diameter, diameter)))
end
local function isRegionTooLargeForFillBlock(cframe, size)
return isRegionTooLarge(getAABBRegion(cframe, size))
end
local function isRegionTooLargeForFillCylinder(cframe, height, radius)
local diameter = radius * 2
return isRegionTooLarge(getAABBRegion(cframe, Vector3.new(diameter, height, diameter)))
end
local function isRegionTooLargeForFillRegion(region)
return isRegionTooLarge(region)
end
local function isRegionTooLargeForFillWedge(cframe, size)
return isRegionTooLarge(getAABBRegion(cframe, size))
end
local function isRegionTooLargeForReplaceMaterial(region)
return isRegionTooLarge(region)
end
local region = Region3.new(REGION_START, REGION_END)
print(isRegionTooLargeForReadWriteVoxels(region))
print(isRegionTooLargeForFillBall(CFRAME, SIZE))
print(isRegionTooLargeForFillBlock(CFRAME, SIZE))
print(isRegionTooLargeForFillCylinder(CFRAME, SIZE, SIZE))
print(isRegionTooLargeForFillRegion(region))
print(isRegionTooLargeForFillWedge(CFRAME, SIZE))
print(isRegionTooLargeForReplaceMaterial(region))

Eventos