Terrain

非推奨を表示

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

作成できません

地形では、遅延がほとんどない動的に変形可能な環境を簡単に作成できます。現在は、各セルが 0から 1の間の数値を持つ 4×4×4 セルグリッドに基づいていますが、それぞれのセルは、幾何学がセルを占有する量と、セルの材料を表しています。占有率は、セルが周囲のセルとどのように結合するかを決定し、結果はグリッド制約がないという錯覚です。

詳しくは、地形を参照してください。

概要

プロパティ

  • スクリプト作成できません
    並列読み取り

    地形装飾を有効化/無効化します。

  • スクリプト作成できません
    並列読み取り

    アニメーションされた草の長さを指定します。

  • MaterialColors:BinaryString
    スクリプト作成できません
    並列読み取り

    MaterialColors は、Material Color 機能のエディタを表示し、 スクリプトで編集できません

    素材の色を取得するには、次を使用します:Terrain:GetMaterialColor() 素材の色を設定するには、次を使用します:Terrain:SetMaterialColor()

  • 読み取り専用
    複製されていません
    並列読み取り

    最大可能な編集可能な領域の境界を表示します。

  • 並列読み取り

    地形水の色合い。

  • 並列読み取り

    地形の水反射がどれほど不透明かを制御します。

  • 並列読み取り

    地形水の透明度。

  • 並列読み取り

    地形水波の最大高さをスタッドで設定します。

  • 並列読み取り

    地形水波が毎分何回上下移動するかを設定します。

BasePart から継承した プロパティ
  • 並列読み取り

    パーツが物理的に移動不可能かどうかを決定します。

  • 複製されていません
    並列読み取り

    部品の組み立ての角速度。

  • 読み取り専用
    複製されていません
    並列読み取り

    ワールドスペースでのパーツのアセンブリの質量の中心。

  • 複製されていません
    並列読み取り

    部品の組み立ての線速度。

  • 読み取り専用
    複製されていません
    並列読み取り

    パーツのアセンブリの総質量。

  • 読み取り専用
    複製されていません
    並列読み取り

    アセンブリの根部に対する参照。

  • 並列読み取り
  • 並列読み取り

    部品の後面の表面タイプを決定します (+Z 方向)。

  • 部品の底面の表面タイプを決定します (-Y 方向)。

  • 複製されていません
    並列読み取り

    部品の色を決定します。

  • 並列読み取り

    世界の BasePart の位置と方向を決定します。

  • 並列読み取り

    パーツが他のパーツと衝突できるかどうかを決定します。

  • 並列読み取り

    パーツが空間クエリ操作で考慮されるかどうかを決定します。

  • 並列読み取り

    Touched および TouchEnded イベントがパーツに発射するかどうかを決定します。

  • 並列読み取り

    パーツがシャドウをキャストするかどうかを決定します。

  • 読み取り専用
    複製されていません
    並列読み取り

    部品の質量の中心が位置する世界の位置を説明します。

  • 複製されていません
    並列読み取り

    パーツの衝突グループの名前を記述します。

  • 複製されていません
    並列読み取り

    部品の色を決定します。

  • 読み取り専用
    複製されていません
    並列読み取り

    部品の現在の物理プロパティを示します。

  • 部品の複数の物理的特性を決定します。

  • 並列読み取り

    部品やアセンブリの空力を有効化または無効化するのに使用します。

  • 読み取り専用
    複製されていません
    並列読み取り

    物理エントリの CFrameBasePart

  • 読み取り専用
    複製されていません
    並列読み取り

    物理エンジンによって見られる BasePart の実際のサイズ。

  • 並列読み取り

    部品の前面の表面タイプを決定します (-Z 方向)。

  • 並列読み取り

    部品の左面の表面タイプを決定します (-X 方向)。

  • 非表示
    複製されていません
    並列読み取り

    ローカルクライアントにしか表示されない BasePart.Transparency の乗数を決定します。

  • 並列読み取り

    スタジオでパーツが選択可能かどうかを決定します。

  • 読み取り専用
    複製されていません
    並列読み取り

    部品の質量、密度とボリュームの積を記述します。

  • 並列読み取り

    パーツが剛ボディの総質量または粘性に貢献するかどうかを決定します。

  • 並列読み取り

    部品のテクスチャとデフォルトの物理プロパティを決定します。

  • 複製されていません
    並列読み取り

    名前の MaterialVariant

  • 非表示
    複製されていません
    並列読み取り

    世界でのパーツの回転を説明します。

  • 並列読み取り

    パーツのピボットのオフセットを、CFrame から指定します。

  • 非表示
    複製されていません
    並列読み取り

    世界のパーツの位置を記述します。

  • 非表示
    読み取り専用
    複製されていません
    並列読み取り

    最後の物理アップデート以来の時間。

  • 並列読み取り

    パーツが天空ボックスをどの程度反映するかを決定します。

  • 読み取り専用
    複製されていません
    並列読み取り

    サイズ変更メソッドで許可される最小の変更を説明します。

  • 読み取り専用
    複製されていません
    並列読み取り

    パーツがサイズ変更できる顔を説明します。

  • 並列読み取り

    部品の右面の表面タイプを決定します (+X 方向)。

  • 並列読み取り

    アセンブリのルート部分を決定する主なルール。

  • 複製されていません
    並列読み取り

    3軸のためのパーツの回転度です。

  • 複製されていません
    並列読み取り

    部品の寸法 (長さ、幅、高さ) を決定します。

  • 並列読み取り

    部品のトップフェイスの表面タイプを決定します (+Y方向)。

  • 並列読み取り

    パーツがどの程度透明に見えるかを決定します (パーツの不透明度の逆)。

PVInstance から継承した プロパティ
  • 複製されていません
    スクリプト作成できません
    並列読み取り
  • 複製されていません
    スクリプト作成できません
    並列読み取り

方法

BasePart から継承した 方法PVInstance から継承した 方法

イベント

BasePart から継承した イベント

プロパティ

Decoration

スクリプト作成できません
並列読み取り

現在、 地形材料でアニメーション付きの草を有効化または無効化しますが、このプロパティの将来の修正で追加の装飾的な機能を制御できます。

GrassLength

スクリプト作成できません
並列読み取り

グラス 地形材料でアニメーションされた草の長さを指定し、Decoration が有効になっていると仮定します。有効な値は 0.1 から 1 の間です。

MaterialColors

BinaryString
スクリプト作成できません
並列読み取り

MaterialColors は、Material Color 機能のエディタを表示し、 スクリプトで編集できません

素材の色を取得するには、使用してください: Terrain:GetMaterialColor()

素材の色を設定するには、使用してください: Terrain:SetMaterialColor()

MaxExtents

読み取り専用
複製されていません
並列読み取り

最大可能な編集可能な領域の境界を表示します。

WaterColor

並列読み取り

地形水の色合い。

WaterReflectance

並列読み取り

地形の水反射がどれほど不透明かを制御します。

WaterTransparency

並列読み取り

地形水の透明度。

WaterWaveSize

並列読み取り

地形水波の最大高さをスタッドで設定します。現在は 0 から 1 の間に制限されています。

WaterWaveSpeed

並列読み取り

地形水波が 1 分あたり何回上下移動するかを設定します。現在は 0 から 100 の間に制限されています。

方法

CellCenterToWorld

地形セルの中心の世界位置 (x、y、z) を返します。

パラメータ

既定値: ""
既定値: ""
既定値: ""

戻り値

CellCornerToWorld

グリッドセルの左下向き角の位置 (x、y、z) を返します。

パラメータ

既定値: ""
既定値: ""
既定値: ""

戻り値

Clear

()

地形をクリアします。


戻り値

()

CopyRegion

地形のチャンクを TerrainRegion オブジェクトに保存して、後でロードできるようにします。注: TerrainRegion データは、サーバーとクライアント間で複製されません。

パラメータ

region: Region3int16
既定値: ""

戻り値

コードサンプル

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

地形に空白のないセルの数を返します。


戻り値

FillBall

()

指定されたスペースに滑らかな地形の球を満たします。

パラメータ

center: Vector3

地形ボールの中心の位置。

既定値: ""
radius: number

地形ボールのスタッドの半径。

既定値: ""
material: Enum.Material

地形ボールの Enum.Material

既定値: ""

戻り値

()

コードサンプル

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

()

滑らかな地形のブロックを指定された場所、回転、サイズ、および素材で満たします。

パラメータ

cframe: CFrame

地形ブロックの位置と方向。

既定値: ""
size: Vector3

正方形のブロックのスタッドサイズ - 高さと幅の両方。

既定値: ""
material: Enum.Material

地形ブロックの Enum.Material

既定値: ""

戻り値

()

FillCylinder

()

指定されたスペースに滑らかな地形のシリンダーを満たします。スペースは、CFrame、高さ、および半径を使用して定義されます。


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

パラメータ

cframe: CFrame

地形シリンダーの位置と方向

既定値: ""
height: number

地形シリンダーのスタッドの高さ。

既定値: ""
radius: number

地形シリンダーのスタッドの半径。

既定値: ""
material: Enum.Material

地形シリンダーの Enum.Material

既定値: ""

戻り値

()

FillRegion

()

スムーズな地形で Region3 スペースを満たします。

パラメータ

region: Region3
既定値: ""
resolution: number
既定値: ""
material: Enum.Material
既定値: ""

戻り値

()

FillWedge

()

は、指定された とエリアの とサイズで、三角形のボリュームを満たします。ウェッジの向きは、同等の WedgePart と同じです。

パラメータ

cframe: CFrame

埋めるウェッジの位置と方向。

既定値: ""
size: Vector3

埋めるウェッジのサイズ。

既定値: ""
material: Enum.Material

ウェッジが満たされる素材。

既定値: ""

戻り値

()

GetMaterialColor

並列書き込み

指定された地形材料の現在の地形材料の色を返します。

パラメータ

material: Enum.Material
既定値: ""

戻り値

PasteRegion

()

地形のチャンクを地形オブジェクトに適用します。注: TerrainRegion データは、サーバーとクライアント間で複製されません。

パラメータ

既定値: ""
corner: Vector3int16
既定値: ""
pasteEmptyCells: boolean
既定値: ""

戻り値

()

コードサンプル

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

並列書き込み

チャネル名に基づいて、テーブル形式で地形ボクセルデータの領域を返します。

パラメータ

region: Region3

読み込むターゲット領域。ボクセルグリッドに沿わなければなりません。領域が大きすぎるとエラーが発生します;制限は現在 4194304 ボクセル³です。

既定値: ""
resolution: number

ボクセル解像度。4でなければなりません。

既定値: ""
channelIds: Array

ボクセルデータからアクセスする必要があるチャネルID (文字列) のアレイ。各チャンネル ID は、ボクセルに保存されるデータの種類を表します。現在サポートされているIDは {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} です。

既定値: ""

戻り値

channelIds 入力に基づいて辞書形式でボクセルデータを返します。キーは、それぞれのチャネルIDとそれぞれの値を 3Dデータの配列として表示します。

  • SolidMaterial — ボクセルの Enum.Material 素材。注: Water はもうサポートされていません;代わりに、水を含むボクセルの値は LiquidOccupancy になります。
  • SolidOccupancy — ボクセルの材料の占有率が SolidMaterial チャンネルで指定されたもの。これは 0 (空) と 1 (満) の間の値です。
  • LiquidOccupancy — ボクセル内の Water 素材の占有率を、0(水なし)から 1(水で満たされている)の間の値として指定します。If the SolidOccupancy は 1 であり、SolidMaterialAir でない場合、これは 0 です。

辞書には、各チャネルデータの 3D 配列サイズを表す値を持つ Size キーも含まれています。

コードサンプル

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

並列書き込み

テーブル形式で特定の平坦な地形の領域を返します。

パラメータ

region: Region3

読み込むターゲット領域。ボクセルグリッドに沿わなければなりません。領域が大きすぎるとエラーが発生します。制限は現在 4194304 ボクセル^3です。

既定値: ""
resolution: number

ボクセル解像度。4でなければなりません。

既定値: ""

戻り値

生のボクセルデータを 2つの 3D 配列として返します。

  • materials - ターゲット領域からの 3D 配列の Enum.Material 。また、ネストされた配列の寸法と同じサイズフィールドも含まれています。
  • occupancies - ターゲット領域の占有値の 3D アレイ。また、ネストされたアレイのサイズフィールドと同じで、尺寸が含まれています。

コードサンプル

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 は、特定の 内の地形を別の材料に置き換えます。本質的には、Terrain マテリアルの検索と置換操作です。

制限

このメソッドを呼び出すとき、resolution パラメータは正確に 4 でなければなりません。さらに、領域 3 は地形材料グリッドに沿わなければならない、すなわちRegion3 の最小値と最大値のコンポーネントは、4で割り切れる必要があります。Region3:ExpandToGrid() を使用して、領域をこの関数と互換性を持たせます。

パラメータ

region: Region3

置換操作が発生する領域。

既定値: ""
resolution: number

置換操作が行われる解像度; 現在、正確に 4 である必要があります。

既定値: ""
sourceMaterial: Enum.Material

置換する予定の古いマテリアル。

既定値: ""
targetMaterial: Enum.Material

新しい素材。

既定値: ""

戻り値

()

コードサンプル

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

()

指定された地形材料の現在の地形材料の色を設定します。地形材料は、基本色を指定された色に移行します。

パラメータ

material: Enum.Material
既定値: ""
value: Color3
既定値: ""

戻り値

()

WorldToCell

グリッドセルの位置を返し、ポイント 位置 を含む。

パラメータ

position: Vector3
既定値: ""

戻り値

WorldToCellPreferEmpty

グリッドセルの位置が含まれるグリッドセルの場所を返し、位置がグリッドの端にあるときは空のグリッドセルを好まします。

パラメータ

position: Vector3
既定値: ""

戻り値

WorldToCellPreferSolid

グリッドセルの位置を含むグリッドセルの場所を返し、位置がグリッドの端にあるときに非空のグリッドセルを避けます。

パラメータ

position: Vector3
既定値: ""

戻り値

WriteVoxelChannels

()

ボクセルチャネルデータの辞書を使用して、地形の領域を設定します。

パラメータ

region: Region3

書き込むターゲットの領域。ボクセルグリッドに沿わなければなりません。領域が大きすぎるとエラーが発生します;制限は現在 4194304 ボクセル³です。

既定値: ""
resolution: number

ボクセル解像度。4でなければなりません。

既定値: ""
channels: Dictionary

Dictionary of voxel data similar to the return value of ReadVoxelChannels() に類似するボクセルデータの辞書。キーは、それぞれの値を 3D データの配列として、それぞれのチャネル IDを表します。辞書は、単一または複数のチャネル入力をサポートできます。

  • SolidMaterial — ボクセルの Enum.Material 素材。注: Water はもうサポートされていません;代わりに、水だけを含むボクセルは SolidMaterial = Enum.Material.Air, LiquidOccupancy = x として入力する必要があり、x は 0 (専用) と 1 (含む) の間の数字です。
  • SolidOccupancy — チャンネル SolidMaterial で指定されたボクセルの材料の占有率。これは 0(空) と 1(満) の間の値であるべきです。
  • LiquidOccupancy — ボクセル内の Water 素材の占有率を、0(水なし)から 1(水で満たされている)の間の値として指定します。If the SolidOccupancy は 1 であり、SolidMaterialAir でない場合、これは 0 です。
既定値: ""

戻り値

()

コードサンプル

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

()

テーブル形式を使用して、滑らかな地形の特定の領域を設定します。

パラメータ

region: Region3

書き込むターゲット領域。ボクセルグリッドに沿わなければなりません。領域が大きすぎるとエラーが発生します。

既定値: ""
resolution: number

ボクセル解像度。4でなければなりません。

既定値: ""
materials: Array

3D 配列の Enum.Material. Dimensions は、ボクセルでターゲット領域のサイズと完全に一致する必要があります。

既定値: ""
occupancy: Array

3D ボクセルの占有率の配列 (0 から 1 の数字)。寸法は、ボクセル内のターゲット領域のサイズに正確に一致する必要があります。

既定値: ""

戻り値

()

コードサンプル

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

イベント