Terrain

Artık kullanılmayanları göster

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

Oluşturulamaz

Arazi, az veya hiç gecikme ile dinamik olarak dönüşebilen çevreler oluşturmanıza izin verir.Şu anda her hücrede 0 ile 1 arasında bir sayı bulunduran 4×4×4 hücre tablosuna dayanmaktadır, bu da geometrinin hücreyi ve hücenin malzemesini ne kadar işgal etmesi gerektiğini temsil eder.Doluluk, hücrenin çevreleyen hücrelerle nasıl birleşeceğini ve sonucunun hiçbir ızgara sınırı olmadığı ilüzyonu olacağını belirler.

Daha fazla bilgi için, Arazi bakın.

Özet

Özellikler

Şuradan alınan Özellikler: BasePartŞuradan alınan Özellikler: PVInstance

Yöntemler

Şuradan alınan Yöntemler: BasePartŞuradan alınan Yöntemler: PVInstance

Etkinlikler

Şuradan alınan Etkinlikler: BasePart

Özellikler

Decoration

Betiklenemez
Paralel oku

Şu anda Çim arazisi materyali üzerinde animasyonlu çim etkinleştirir veya devre dışı bırakır, ancak gelecekte bu özelliğin ek dekoratif özelliklerini kontrol edebilir.

GrassLength

Betiklenemez
Paralel oku

Çim arazisi materyali üzerinde animasyonlu çimin uzunluğunu belirtir ve Decoration etkinleştirilmiş olduğunu varsayar. Geçerli değerler 0.1 ile 1 arasındadır.

MaterialColors

BinaryString
Betiklenemez
Paralel oku

MaterialColors, Malzeme Renk özellikiçin editörü temsil eder ve kodlar tarafından düzenlenemez .

Bir malzemenin rengini almak için kullanın: Terrain:GetMaterialColor()

Bir malzemenin rengini ayarlamak için kullanın: Terrain:SetMaterialColor()

MaxExtents

Salt Okunur
Çoğaltılmamış
Paralel oku

En büyük düzenlenebilir bölgenin sınırlarını görüntüler.

WaterColor

Paralel oku

Arazi suyunun tonu.

WaterReflectance

Paralel oku

Arazi su yansımalarının ne kadar opak olduğunu kontrol eder.

WaterTransparency

Paralel oku

Arazi suyunun transparanlığı.

WaterWaveSize

Paralel oku

Arazi su dalgalarının maksimum yüksekliğini milimetrelerle ayarlar. Bu şu anda 0 ile 1 arasında sınırlıdır.

WaterWaveSpeed

Paralel oku

Arazi su dalgalarının dakika başına kaç kez yukarı ve aşağı hareket edeceğini ayarlar. Bu şu anda 0 ile 100 arasında sınırlıdır.

Yöntemler

CellCenterToWorld

Arazi hücresinin merkezinin dünya konumunu döndürür (x, y, z).

Parametreler

Varsayılan değer: ""
Varsayılan değer: ""
Varsayılan değer: ""

Dönüşler

CellCornerToWorld

Izgara hücresinin sol alt-ön kenarının konumunu döndürür (x, y, z).

Parametreler

Varsayılan değer: ""
Varsayılan değer: ""
Varsayılan değer: ""

Dönüşler

Clear

()

Araziyi temizler.


Dönüşler

()

CopyRegion

Bir bölümün arazisini TerrainRegion nesneye saklar, böylece daha sonra yüklenebilir.Not: TerrainRegion verileri sunucu ve istemci arasında yinelenmez.

Parametreler

region: Region3int16
Varsayılan değer: ""

Dönüşler

Kod Örnekleri

The following code will copy the whole Terrain and clear it. After 5 seconds it will paste the terrain back.

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

Arazide boş olmayan hücre sayısını döndürür.


Dönüşler

FillBall

()

Belirli bir alanda pürüzsüz bir yer topunu doldurur.

Parametreler

center: Vector3

Arazi topunun merkezinin konumu.

Varsayılan değer: ""
radius: number

Arazi topunun çubuklarının yarıçapı.

Varsayılan değer: ""
material: Enum.Material

Arazi topunun Enum.Material 'sinin.

Varsayılan değer: ""

Dönüşler

()

Kod Örnekleri

Terrain:FillBall() creates a ball of terrain given a center position, ball radius, and terrain materials.

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

()

Düz bir arazi bloğunu belirli bir konum, dönüş, boyut ve malzeme ile doldurur.

Parametreler

cframe: CFrame

Arazi bloğunun konumu ve yönü.

Varsayılan değer: ""
size: Vector3

Kare blokun çivilerinin boyutu - hem yükseklik hem de genişlik.

Varsayılan değer: ""
material: Enum.Material

Arazi bloğunun Enum.Material 'si.

Varsayılan değer: ""

Dönüşler

()

FillCylinder

()

Belirli bir alanda pürüzsüz bir zemin silindirini doldurur. Alan, bir CFrame, yükseklik ve yarıçap kullanılarak tanımlanır.


local Workspace = game:GetService("Workspace")
Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)

Parametreler

cframe: CFrame

Arazi silindrinin konumu ve yönü.

Varsayılan değer: ""
height: number

Arazi silindirinin çivilerinin yüksekliği.

Varsayılan değer: ""
radius: number

Arazi silindirinin kenarlarındaki yarıçap.

Varsayılan değer: ""
material: Enum.Material

Arazi silindirinin Enum.Material 'si.

Varsayılan değer: ""

Dönüşler

()

FillRegion

()

Bir Region3 alanını pürüzsüz bir araziyle doldurur.

Parametreler

region: Region3
Varsayılan değer: ""
resolution: number
Varsayılan değer: ""
material: Enum.Material
Varsayılan değer: ""

Dönüşler

()

FillWedge

()

FillWedge() bir kama şeklinde bir hacim doldurur Terrain verilen Enum.Material ve bölgenin CFrame ve boyutu.Köşenin yönü, eşdeğer bir WedgePart ile aynıdır.

Parametreler

cframe: CFrame

Doldurulacak kenarın konumu ve yönü.

Varsayılan değer: ""
size: Vector3

Doldurulacak kenarın boyutu.

Varsayılan değer: ""
material: Enum.Material

Kama doldurulacak malzeme.

Varsayılan değer: ""

Dönüşler

()

GetMaterialColor

Paralel yaz

Belirtilen arazi malzemesi için mevcut arazi malzeme rengini döndürür.

Parametreler

material: Enum.Material
Varsayılan değer: ""

Dönüşler

PasteRegion

()

Bir bölge parçasını Arazi nesnesine uygular. Not: TerrainRegion verileri sunucu ve istemci arasında yeniden yapılmaz.

Parametreler

Varsayılan değer: ""
corner: Vector3int16
Varsayılan değer: ""
pasteEmptyCells: boolean
Varsayılan değer: ""

Dönüşler

()

Kod Örnekleri

Creates some terrain, copies it, then pastes it using the following API:

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

Paralel yaz

Kanal isimlerine dayanarak tablo biçiminde bir arazi vokel verisinin bölümünü döndürür.

Parametreler

region: Region3

Okuyacak hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok büyükse bir hata atacak; sınır şu anda 4194304 voksel³.

Varsayılan değer: ""
resolution: number

Voksel çözünürlüğü. 4 olmalıdır.

Varsayılan değer: ""
channelIds: Array

Voksel verilerinden erişilmesi gereken kanal kimlikleri (ip) dizisi.Her kanal ID'si, vokselde saklanan bir tür veriyi temsil eder.Mevcut desteklenen kimlikler {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} dir.

Varsayılan değer: ""

Dönüşler

Voksel verilerini channelIds girişine dayalı bir sözlük olarak döndürür. Anahtarlar, her bir kanal ID'sini 3B verilerin bir dizi olarak değerleriyle temsil eder.

  • SolidMaterial — Vokelinin Enum.Material malzemesi.Not that Water artık desteklenmiyor; bunun yerine, su içeren bir vokselin değeri LiquidOccupancy olacaktır.
  • — Vokselin malzemesinin belirtilen kanaldaki doluluk oranı. Bu, 0 (boş) ve 1 (dolu) arasında bir değerdir.
  • LiquidOccupancy — Vokseldeki Water malzemenin doluluk değerini 0 (su yok) ve 1 (su dolu) arasında bir değer olarak belirtir.Eğer 1 ve 0 değilse, bu 0 olacaktır.

Sözlük ayrıca her kanal verisinin 3B dizi boyutunu temsil eden bir değerle Size anahtar içerir.

Kod Örnekleri

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

Paralel yaz

Tablo biçiminde belirli bir düz arazi bölgesini geri verir.

Parametreler

region: Region3

Okuyacak hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok genişse bir hata atacaktır. Sınır şu anda 4194304 voksel^3'tür.

Varsayılan değer: ""
resolution: number

Voksel çözünürlüğü. 4 olmalıdır.

Varsayılan değer: ""

Dönüşler

Ham voksel verilerini iki 3B dize olarak döndürür.

  • materials - Hedef bölgeden 3B Enum.Material düzgün bir dizi. Ayrıca bir Boyut alanı içerir, alt dizilere eşit olan boyutlara eşit.
  • occupancies - Hedef bölgeden 3B doluluk değerleri düzeninde bir dizi. Ayrıca bir Boyut alanı içerir, alt dizilimlerin boyutlarına eşit.

Kod Örnekleri

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

()

ReplaceMaterial, belirli bir içindeki araziyi başka bir malzeme ile değiştirir.Temel olarak, Terrain malzemelerinde bul ve değiştirme işlemidir.

Sınırlar

Bu yöntemi çağırırken, resolution çözümleyici parametresi kesinlikle 4 olmalıdır.Ayrıca, Bölge3, arazi malzeme ızgarasına uygun olmalıdır, yaniBölge3'ün minimum ve maksimum noktalarının bölünebilir olması gerekir 4.Bir bölgenin bu işlevle uyumlu olmasını sağlamak için Region3:ExpandToGrid() kullanın.

Parametreler

region: Region3

Değiştirme işlemi meydana gelbölge.

Varsayılan değer: ""
resolution: number

Değiştirme işlemi dünyaçözünürlük; şu anda bunun kesinlikle 4 olması gerekiyor.

Varsayılan değer: ""
sourceMaterial: Enum.Material

Değiştirilecek eski materyal.

Varsayılan değer: ""
targetMaterial: Enum.Material

Yeni materyal.

Varsayılan değer: ""

Dönüşler

()

Kod Örnekleri

This code sample demonstrates the usage of Terrain:ReplaceMaterial() by replacing grass near the game origin with asphalt. It does this by constructing a Region3 using two Vector3s.

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

()

Belirtilen arazi malzemesi için mevcut arazi malzemesi rengini değiştirir. Arazi malzemesi temel rengini belirtilen renge doğru kaydıracaktır.

Parametreler

material: Enum.Material
Varsayılan değer: ""
value: Color3
Varsayılan değer: ""

Dönüşler

()

WorldToCell

Nokta konumunu içeren ızgara hücre konumunu döndürür .

Parametreler

position: Vector3
Varsayılan değer: ""

Dönüşler

WorldToCellPreferEmpty

Konum konumunu içeren ızgara hücre konumunu döndürür ve konum bir ızgara kenarında olduğunda boş ızgara hücrelerini tercih eder.

Parametreler

position: Vector3
Varsayılan değer: ""

Dönüşler

WorldToCellPreferSolid

Konum konumunu içeren ızgara hücre konumunu döndürür ve konum bir ızgara kenarında olduğunda boş olmayan ızgara hücrelerini tercih eder.

Parametreler

position: Vector3
Varsayılan değer: ""

Dönüşler

WriteVoxelChannels

()

Bir voksel kanal veri sözlüğü kullanarak bir bölgeyi arazi olarak ayarlar.

Parametreler

region: Region3

Yazmak için hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok genişse bir hata atacak; sınır şu anda 4194304 voksel³.

Varsayılan değer: ""
resolution: number

Voksel çözünürlüğü. 4 olmalıdır.

Varsayılan değer: ""
channels: Dictionary

voxel verilerinin döndürülen değere benzer sözlük ReadVoxelChannels() .Anahtarlar, her bir kanal kimliğini ilgili değeri ile 3B veri dizesi olarak temsil eder.Sözlük tek veya çok kanallı girişleri destekleyebilir.

  • SolidMaterial — Vokelinin Enum.Material malzemesi.Not that Water artık desteklenmiyor; bunun yerine, sadece su içeren bir voksel SolidMaterial = Enum.Material.Air, LiquidOccupancy = x olarak girilmelidir, burada x 0 (özel) ve 1 (katılımcı) arasında bir sayıdır.
  • — Vokselin malzemesinin belirtilen kanaldaki doluluk oranı. Bu, 0 (boş) ve 1 (dolu) arasında bir değer olmalıdır.
  • LiquidOccupancy — Vokseldeki Water malzemenin doluluk değerini 0 (su yok) ve 1 (su dolu) arasında bir değer olarak belirtir.Eğer 1 ve 0 değilse, bu 0 olacaktır.
Varsayılan değer: ""

Dönüşler

()

Kod Örnekleri

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

()

Tablo biçimi kullanarak belirli bir düz arazi bölgesini ayarlar.

Parametreler

region: Region3

Yazmak için hedef bölge. Voksel ızgarasına uyumlu olmalıdır. Bölge çok genişse bir hata atacaktır.

Varsayılan değer: ""
resolution: number

Voksel çözünürlüğü. 4 olmalıdır.

Varsayılan değer: ""
materials: Array

Enum.Material'in 3B düzeni boyutları, vokseldeki hedef bölgenin boyutuna kesinlikle uymalıdır.

Varsayılan değer: ""
occupancy: Array

3B voksel işgal sayısı (0 ile 1 arasındaki sayı). Boyutlar, vokellerdeki hedef bölgenin boyutuna kesinlikle uymalıdır.

Varsayılan değer: ""

Dönüşler

()

Kod Örnekleri

Example

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)

Many terrain methods throw an error if their given region size is too large. The limit is currently 4194304 voxels^3 for ReadVoxels() and WriteVoxels(), and 67108864 voxels^3 for other methods. For methods that take a cframe + size combination (e.g. FillBlock, FillCylinder etc.), then the region volume is calculated from the AABB of the target area.

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))

Etkinlikler