Terrain

Pokaż przestarzałe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Brak możliwości tworzenia

Teren pozwala tworzyć dynamicznie zmienialne środowiska z niewielkim lub żadnym lagiem.Obecnie opiera się na siatce 4×4×4 komórek, w której każda komórka ma numer pomiędzy 0 a 1 reprezentujący to, ile geometria powinna zajmować komórkę i materiał komórki.Zajętość określa, w jaki sposób komórka będzie się zmieniać razem z otaczającymi ją komórkami, a wynikiem jest złudzenie, że nie ma ograniczenia siatki.

Aby uzyskać więcej informacji, zobacz Teren.

Podsumowanie

Właściwości

  • Brak możliwości dodawania do skryptu
    Odczyt równoległy

    Włącza lub wyłącza dekorację terenu.

  • Brak możliwości dodawania do skryptu
    Odczyt równoległy

    Określa długość animowanej trawy.

  • MaterialColors:BinaryString
    Brak możliwości dodawania do skryptu
    Odczyt równoległy

    MaterialColors reprezentuje edytor dla funkcjaKolor materiału i nie może być edytowany przez skrypty .

    Aby uzyskać kolor materiału, użyj: Terrain:GetMaterialColor() Aby ustawić kolor materiału, użyj: Terrain:SetMaterialColor()

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Wyświetla granice największego możliwego edytowalnego regionu.

  • Odczyt równoległy

    Odcień wody na terenie.

  • Odczyt równoległy

    Kontroluje, jak mętne są odblaski wody na terenie.

  • Odczyt równoległy

    Przezroczystość wody na terenie.

  • Odczyt równoległy

    Ustawia maksymalną wysokość fal wody terenu w szpilkach.

  • Odczyt równoległy

    Ustawia, ile razy fale wody terenu będą się poruszać w górę i w dół na minutę.

Właściwości odziedziczeni z: BasePartWłaściwości odziedziczeni z: PVInstance
  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy
  • Bez replikacji
    Brak możliwości dodawania do skryptu
    Odczyt równoległy

Metody

Metody odziedziczeni z: BasePartMetody odziedziczeni z: PVInstance

Zdarzenia

Zdarzenia odziedziczeni z: BasePart

Właściwości

Decoration

Brak możliwości dodawania do skryptu
Odczyt równoległy

Obecnie włącza lub wyłącza animowaną trawę na materiale terenu Trawa , chociaż przyszłe modyfikacje tej właściwości mogą kontrolować dodatkowe dekoracyjne funkcje.

GrassLength

Brak możliwości dodawania do skryptu
Odczyt równoległy

Określa długość animowanej trawy na materiale terenu Trawa , zakładając, że Decoration jest włączone. Poprawne wartości wynoszą od 0,1 do 1.

MaterialColors

BinaryString
Brak możliwości dodawania do skryptu
Odczyt równoległy

MaterialColors reprezentuje edytor dla funkcjaKolor materiału i nie może być edytowany przez skrypty .

Aby uzyskać kolor materiału, użyj: Terrain:GetMaterialColor()

Aby ustawić kolor materiału, użyj: Terrain:SetMaterialColor()

MaxExtents

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Wyświetla granice największego możliwego edytowalnego regionu.

WaterColor

Odczyt równoległy

Odcień wody na terenie.

WaterReflectance

Odczyt równoległy

Kontroluje, jak mętne są odblaski wody na terenie.

WaterTransparency

Odczyt równoległy

Przezroczystość wody na terenie.

WaterWaveSize

Odczyt równoległy

Ustawia maksymalną wysokość fal wody terenu w szpilkach. Obecnie jest to ograniczone między 0 a 1.

WaterWaveSpeed

Odczyt równoległy

Ustawia, ile razy fale wody terenu będą się poruszać w górę i w dół na minutę. Obecnie jest to ograniczone między 0 a 100.

Metody

CellCenterToWorld

Zwraca pozycję świata w centrum komórki terenu (x, y, z).

Parametry

Wartość domyślna: ""
Wartość domyślna: ""
Wartość domyślna: ""

Zwroty

CellCornerToWorld

Zwraca pozycję dolnego lewego kąta komórki siatki (x, y, z).

Parametry

Wartość domyślna: ""
Wartość domyślna: ""
Wartość domyślna: ""

Zwroty

Clear

()

Oczyszcza teren.


Zwroty

()

CopyRegion

Przechowuje kawałek terenu w obiekcie TerrainRegion, aby później mógł zostać ponownie załadowany.Uwaga: TerrainRegion dane nie są replikowane między serwerem a klientem.

Parametry

region: Region3int16
Wartość domyślna: ""

Zwroty

Przykłady kodu

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

Zwraca liczbę niepróżnych komórek w terenie.


Zwroty

FillBall

()

Wypełnia kulę gładkiego terenu w dannej przestrzeni.

Parametry

center: Vector3

Pozycja centrum piłki terenu.

Wartość domyślna: ""
radius: number

Promień w szpilkach kuli terenu.

Wartość domyślna: ""
material: Enum.Material

The Enum.Material z piłki terenu.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

()

Wypełnia blok gładkiego terenu daną lokalizacją, rotacją, rozmiarem i materiałem.

Parametry

cframe: CFrame

Pozycja i orientacja bloku terenu.

Wartość domyślna: ""
size: Vector3

Rozmiar w szpilkach kwadratowego bloku - zarówno wysokość, jak i szerokość.

Wartość domyślna: ""
material: Enum.Material

The Enum.Material z bloku terenu.

Wartość domyślna: ""

Zwroty

()

FillCylinder

()

Wypełnia cylinder o gładkim terenie w określonej przestrzeni. Przestrzeń jest określana za pomocą CFrame, wysokości i promienia.


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

Parametry

cframe: CFrame

Pozycja i orientacja cylindra terenu.

Wartość domyślna: ""
height: number

Wysokość w szpilkach cylindra terenu.

Wartość domyślna: ""
radius: number

Promień w szpilkach terenu cylindra.

Wartość domyślna: ""
material: Enum.Material

The Enum.Material z cylindra terenu.

Wartość domyślna: ""

Zwroty

()

FillRegion

()

Wypełnia przestrzeń Region3 płynnym terenem.

Parametry

region: Region3
Wartość domyślna: ""
resolution: number
Wartość domyślna: ""
material: Enum.Material
Wartość domyślna: ""

Zwroty

()

FillWedge

()

wypełnia kształtem klinowy objętość z danym i rozmiarem obszaru.Orientacja klinu jest taka sama jak odpowiednik WedgePart.

Parametry

cframe: CFrame

Pozycja i orientacja klinu do wypełnienia.

Wartość domyślna: ""
size: Vector3

Rozmiar klinu do wypełnienia.

Wartość domyślna: ""
material: Enum.Material

Materiał, z którym klin zostanie wypełniony.

Wartość domyślna: ""

Zwroty

()

GetMaterialColor

Zapis równoległy

Zwraca obecny kolor materiału terenu dla określonego materiału terenu.

Parametry

material: Enum.Material
Wartość domyślna: ""

Zwroty

PasteRegion

()

Zastosuj kawałek terenu do obiektu Teren. Uwaga: TerrainRegion dane nie są replikowane między serwerem a klientem.

Parametry

Wartość domyślna: ""
corner: Vector3int16
Wartość domyślna: ""
pasteEmptyCells: boolean
Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

Zapis równoległy

Zwraca region danych woxel terenu w formacie tabeli na podstawie nazw kanałów.

Parametry

region: Region3

Wybrany region do odczytania. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży; limit obecnie wynosi 4194304 woxeli³.

Wartość domyślna: ""
resolution: number

Rozdzielczość woksela. Musi wynosić 4.

Wartość domyślna: ""
channelIds: Array

Zbiór identyfikatorów kanałów (tekstów), które muszą być uzyskiwane z danych woksela.Każda ID kanału reprezentuje typ danych przechowywanych w voxeluObecnie wspierane ID to {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}.

Wartość domyślna: ""

Zwroty

Zwraca dane woksel jako słownik na podstawie wejścia channelIds. Klucze reprezentują każdą ID kanału z odpowiednią wartością jako tablicę 3D danych.

  • SolidMaterial — Materiał Enum.Material z voxela.Zauważ, że Water nie jest już wspierany; zamiast tego woxel, który zawiera wodę, będzie miał wartość LiquidOccupancy .
  • SolidOccupancy — Zajęcie materiału woxela, określone w kanałSolidMaterial. Jest to wartość pomiędzy 0 (próżnia) a 1 (pełne).
  • LiquidOccupancy — Określa zajętość materiału Water w voxelu jako wartość pomiędzy 0 (bez wody) a 1 (pełna wody).Jeśli SolidOccupancy jest 1, a SolidMaterial nie jest Air, będzie to 0.

Słownik zawiera również klucz Size z wartością reprezentującą rozmiar matrycy 3D dla każdej danych kanału.

Przykłady kodu

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

Zapis równoległy

Zwraca określony region gładkiego terenu w formacie tabeli.

Parametry

region: Region3

Wybrany region do odczytania. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży. Limit obecnie wynosi 4194304 woxeli^3.

Wartość domyślna: ""
resolution: number

Rozdzielczość woksela. Musi wynosić 4.

Wartość domyślna: ""

Zwroty

Zwraca surowe dane woxelowe jako dwie matryce 3D.

  • materials - 3D arkusz z Enum.Material z obszaru docelowego. Zawiera również pole Rozmiar, równe wymiarom połączonych arkuszy.
  • occupancies - 3D matryca wartości zajętości z obszaru docelowego. Zawiera również pole Rozmiar, równe wymiarom połączonych matryc.

Przykłady kodu

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

()

Zastąpienie materiału zastępuje teren pewnego Enum.Material w ramach Region3 innym materiałem.Zasadniczo jest to operacja wyszukiwania i wymiany na Terrain materiałach.

Ograniczenia

Podczas wywołania tej metody parametr resolution musi być dokładnie 4.Ponadto Region3 musi być zgodny z siatką materiałów terenu, tj.:składniki minimalnych i maksymalnych punktów Region3 muszą być dzielne przez 4.Użyj Region3:ExpandToGrid(), aby uczynić region kompatybilnym z tą funkcją.

Parametry

region: Region3

Region, w którym występowaćoperacja zastąpienia.

Wartość domyślna: ""
resolution: number

Rozdzielczość, w której odbędzie miejsceoperacja zamiany; w tej chwili musi to być dokładnie 4.

Wartość domyślna: ""
sourceMaterial: Enum.Material

Stary materiał, który zostanie zastąpiony.

Wartość domyślna: ""
targetMaterial: Enum.Material

Nowy materiał.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

()

Ustawia obecny kolor materiału terenu dla określonego materiału terenu. Materiał terenu zmieni swój podstawowy kolor w kierunku określonego koloru.

Parametry

material: Enum.Material
Wartość domyślna: ""
value: Color3
Wartość domyślna: ""

Zwroty

()

WorldToCell

Zwraca lokalizację komórki siatki, która zawiera punkt pozycja .

Parametry

position: Vector3
Wartość domyślna: ""

Zwroty

WorldToCellPreferEmpty

Zwraca lokalizację komórki siatki, która zawiera pozycję punktu, preferując puste komórki siatki, gdy pozycja jest na krawędzi siatki.

Parametry

position: Vector3
Wartość domyślna: ""

Zwroty

WorldToCellPreferSolid

Zwraca lokalizację komórki siatki, która zawiera pozycję punktu, preferując puste komórki siatki, gdy pozycja znajduje się na krawędzi siatki.

Parametry

position: Vector3
Wartość domyślna: ""

Zwroty

WriteVoxelChannels

()

Ustawia region terenu za pomocą słownika danych kanału voxelowego.

Parametry

region: Region3

Wybrany region, do którego należy napisać. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży; limit obecnie wynosi 4194304 woxeli³.

Wartość domyślna: ""
resolution: number

Rozdzielczość woksela. Musi wynosić 4.

Wartość domyślna: ""
channels: Dictionary

Słownik danych woksel podobnych do wartości zwrotnej ReadVoxelChannels() .Klucze reprezentują każdą ID kanału z ich odpowiednią wartością jako tablicę 3D danych.Słownik może wspierać pojedyncze lub wielokanałowe wejścia.

  • SolidMaterial — Materiał Enum.Material z voxela.Zauważ, że Water nie jest już wspierany; zamiast tego woxel, który zawiera tylko wodę, powinien zostać wprowadzony jako SolidMaterial = Enum.Material.Air, LiquidOccupancy = x, gdzie x jest liczbą pomiędzy 0 (ekskluzywną) a 1 (włączną).
  • SolidOccupancy — Zajęcie materiału woxela, określone w kanałSolidMaterial. Powinno to być wartość pomiędzy 0 (próżnia) a 1 (pełne).
  • LiquidOccupancy — Określa zajętość materiału Water w voxelu jako wartość pomiędzy 0 (bez wody) a 1 (pełna wody).Jeśli SolidOccupancy jest 1, a SolidMaterial nie jest Air, będzie to 0.
Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

()

Ustawia pewien region gładkiego terenu za pomocą formatu tabeli.

Parametry

region: Region3

Wybrany region, do którego należy napisać. Musi być zgodny z siatką woxeli. Wyrzuci błąd, jeśli region jest zbyt duży.

Wartość domyślna: ""
resolution: number

Rozdzielczość woksela. Musi wynosić 4.

Wartość domyślna: ""
materials: Array

3D-matryca Enum.Material. Wymiary musi dokładnie pasować do rozmiaru docelowego regionu w pikselach.

Wartość domyślna: ""
occupancy: Array

3D matryca zajęć voxel (liczba pomiędzy 0 a 1). Wymiary muszą dokładnie odpowiadać rozmiarowi docelowego regionu w voxelach.

Wartość domyślna: ""

Zwroty

()

Przykłady kodu

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

Zdarzenia