Terrain
*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.
Il terreno ti consente di creare ambienti dinamici morfabili con poco o nessun ritardo.Attualmente è basato su una griglia 4×4×4 di celle, in cui ogni cellula ha un numero compreso tra 0 e 1 che rappresenta quanto la geometria dovrebbe occupare la cellula e il materiale della cellula.L'occupazione determina come la cellula si trasformerà insieme alle celle circostanti, e il risultato è l'illusione di non avere restrizioni di griglia.
Per maggiori informazioni, vedi Terreno.
Sommario
Proprietà
Abilita o disabilita la decorazione del terreno.
Specifica la lunghezza dell'erba animata.
MaterialColors rappresenta l'editor per la funzione Colore Materiale e non può essere modificato da script .
Per ottenere il colore di un materiale, usa: Terrain:GetMaterialColor() Per impostare il colore di un materiale, usa: Terrain:SetMaterialColor()
Mostra i confini della regione modificabile più grande possibile.
Il tono dell'acqua del terreno.
Controlla quanto sono opache le riflessioni dell'acqua del terreno.
La trasparenza dell'acqua del terreno.
Imposta l'altezza massima delle onde d'acqua del terreno in studs.
Imposta il numero di volte in cui le onde d'acqua del terreno si muovono su e giù per minuto.
Proprietà
Determina se una parte è immovibile per la fisica.
La velocità angolare dell'assemblaggio della parte.
Il centro di massa dell'assemblaggio della parte nello Spaziomondiale.
La velocità lineare dell'assemblaggio della parte.
La massa totale dell'assemblaggio della parte.
Un riferimento alla parte radice dell'assemblaggio.
Determina se la parte interagirà fisicamente con la simulazione audio, simile a CastShadow per l'illuminazione.
Determina il tipo di superficie per il lato posteriore di una parte.
Determina il tipo di superficie per il lato inferiore di una parte.
Determina il colore di una parte.
Determina la posizione e l'orientamento del BasePart nel Mondo.
Determina se una parte può collisionare con altre parti.
Determina se la parte viene considerata durante le operazioni di query spaziali.
Determina se Touched e TouchEnded eventi di fuoco sulla parte.
Determina se una parte lancia o meno un'ombra.
Descrive la posizione mondiale in cui si trova il centro di massa di una parte.
Descrive il nome del Gruppodi collisione di una parte.
Determina il colore di una parte.
Indica le attuali proprietà fisiche della parte.
Determina diverse proprietà fisiche di una parte.
Utilizzato per abilitare o disabilitare le forze aerodinamiche su parti e assemblaggi.
La dimensione fisica reale del BasePart come considerata dall'engine della fisica.
Determina il tipo di superficie per la faccia anteriore di una parte.
Determina il tipo di superficie per il lato sinistro di una parte.
Determina un moltiplicatore per BasePart.Transparency che è visibile solo al client locale.
Determina se una parte è selezionabile in Studio.
Descrive la massa della parte, il prodotto della sua densità e volume.
Determina se la parte contribuisce alla massa totale o all'inerzia del suo corpo rigido.
Determina la texture e le proprietà fisiche predefinite di una parte.
Il nome di MaterialVariant .
Descrive la rotazione della parte nel Mondo.
Specifica l'offset del punto di rotazione della parte dal suo CFrame .
Descrive la posizione della parte nel Mondo.
Tempo trascorso dall'ultimo Aggiornarmentodella fisica registrata.
Determina quanto una parte rifletta la skybox.
Descrive il più piccolo cambiamento nelle dimensioni consentito dal metodo Resize().
Descrive i volti su cui una parte può essere ridimensionata.
Determina il tipo di superficie per il lato destro di una parte.
La regola principale nella determinazione della parte radice di un'assemblaggio.
La rotazione della parte in gradi per i tre assi.
Determina le dimensioni di una parte (lunghezza, larghezza, altezza).
Determina il tipo di superficie per la faccia superiore di una parte.
Determina quanto una parte può essere vista attraverso (l'inverso dell'opacità della parte).
Proprietà
Metodi
Restituisce la posizione mondiale del centro della cellula del terreno (x, y, z).
Restituisce la posizione dell'angolo inferiore a sinistra in avanti della celle di griglia (x, y, z).
Pulisce il terreno.
Memorizza un pezzo di terreno in un oggetto TerrainRegion in modo che possa essere caricato nuovamente in seguito.Nota: TerrainRegion i dati non si replicano tra server e client.
Restituisce il numero di celle non vuote nel Terreno.
Riempe una palla di terreno liscio in uno spazio dato.
Riempe un blocco di terreno liscio con una posizione, una rotazione, una dimensione e un materiale dato.
Riempe un cilindro di terreno liscio in uno spazio dato.
Riempe uno spazio Region3 con terreno liscio.
Riempe un volume a forma di cuneo di Terreno con il Enum.Material dato e il CFrame e la dimensione dell'area.
Restituisce il colore del materiale del terreno attuale per il materiale del terreno specificato.
- IterateVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainIterateOperation
- ModifyVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainModifyOperation
Applica un pezzo di terreno all'oggetto Terreno. Nota: TerrainRegion i dati non si replicano tra server e client.
Restituisce una regione di dati voxel del terreno in formato tabella in base ai nomi dei canali.
Restituisce una certa regione di terreno liscio nel formato tabella.
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
Sostituisce il terreno di un materiale all'interno di una regione con un altro materiale.
Imposta il colore del materiale del terreno attuale per il materiale del terreno specificato.
Restituisce la posizione della celle di griglia che contiene la posizione del punto **** .
Restituisce la posizione della celle di griglia che contiene la posizione del punto, preferendo le celle di griglia vuote quando la posizione è su un bordo di griglia.
Restituisce la posizione della celle di griglia che contiene la posizione del punto, preferendo le celle di griglia non vuote quando la posizione è su un bordo di griglia.
Imposta una regione del terreno utilizzando un dizionario di dati del canale voxel.
Imposta una certa regione di terreno liscio usando il formato di tabella.
- WriteVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainWriteOperation
Metodi
Applica un impulso angolare all'assemblaggio.
Applica un impulso all'assemblaggio all'assemblaggio di center of mass .
Applica un impulso all'assemblaggio in posizione specificata.
Restituisce se le parti possono scontrarsi tra loro.
Verifica se è possibile impostare la proprietà della rete di una parte.
Restituisce una tabella di parti connesse all'oggetto da qualsiasi tipo di Articolazionerigida.
Restituisci tutti i Giunti o Confinamenti che sono connessi a questa Parte.
Restituisce il valore della proprietà Mass Proprietà.
Restituisce il giocatore attuale che è il proprietario di rete di questa parte, o nil in caso del Server.
Restituisce vero se il motore di gioco decide automaticamente il proprietario della rete per questa parte.
Restituisce la parte di base di un'assemblaggio di parti.
Restituisce una tabella di tutte le BasePart.CanCollide parti vere che si intersecano con questa parte.
Restituisce la velocità lineare dell'assemblaggio della parte alla posizione data rispetto a questa parte.
Restituisce vero se l'oggetto è connesso a una parte che lo terrà in posizione (ad esempio una parte Anchored), altrimenti restituisce falso.
Cambia le dimensioni di un oggetto proprio come l'utilizzo dello strumento ridimensionamento di Studio.
Imposta il giocatore dato come proprietario della rete per questo e tutte le parti connesse.
Consente al motore di gioco di decidere dinamicamente chi gestirà la fisica della parte (uno dei client o del Server).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nuova IntersectOperation dalla geometria sovrapposta della parte e delle altre parti nell'vettorefornito.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nuova UnionOperation dalla parte, meno la geometria occupata dalle parti nell'vettorefornito.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Crea una nuova UnionOperation dalla parte, più la geometria occupata dalle parti nell'vettorefornito.
Metodi
Ottiene il punto focale di un PVInstance .
Trasforma il PVInstance insieme a tutti i suoi discendenti PVInstances in modo che il punto di rotazione sia ora situato all'interno del CFrame specificato.
Eventi
Eventi provenienti da BasePartEventi
Si accende quando una parte smette di toccare un'altra parte a causa di un movimento fisico.
Si accende quando una parte tocca un'altra parte a causa di un movimento fisico.
Proprietà
Metodi
CellCenterToWorld
Parametri
Restituzioni
CellCornerToWorld
Parametri
Restituzioni
Clear
Restituzioni
ClearVoxelsAsync_beta
Parametri
Restituzioni
CopyRegion
Parametri
Restituzioni
Campioni di codice
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)
FillBall
Parametri
Restituzioni
Campioni di codice
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
Parametri
Restituzioni
FillCylinder
Parametri
Restituzioni
FillRegion
Parametri
Restituzioni
FillWedge
Parametri
Restituzioni
IterateVoxelsAsync_beta
Parametri
Restituzioni
ModifyVoxelsAsync_beta
Parametri
Restituzioni
PasteRegion
Parametri
Restituzioni
Campioni di codice
--[[
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
Parametri
Restituzioni
Campioni di codice
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
Parametri
Restituzioni
Campioni di codice
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 -- Uguale alle occupazioni.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)
ReadVoxelsAsync_beta
Parametri
Restituzioni
ReplaceMaterial
Parametri
Restituzioni
Campioni di codice
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
Parametri
Restituzioni
WriteVoxelChannels
Parametri
Restituzioni
Campioni di codice
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
Parametri
Restituzioni
Campioni di codice
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)
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))