Terrain

顯示已棄用項目

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

無法建立

地形讓您可以在有點延遲的情況下創建動態可重新編輯的環境。它目前基於 4×4×4 網格的細胞,每個細胞都有一個數字代表何量的 геометria應該佔用細胞,和材料的細胞。占位率決定了細胞會與周圍細胞一起變形的結果,並且是無格式限制式的結果

了解更多資訊,請參閱 地形

概要

屬性

屬性 繼承自 BasePart屬性 繼承自 PVInstance

方法

方法 繼承自 BasePart方法 繼承自 PVInstance

活動

活動 繼承自 BasePart

屬性

Decoration

無法建立指令碼
平行讀取

目前啟用或關閉 地形材料上的動畫草,雖然未來修改此屬性可能會控制額外的裝飾功能。

GrassLength

無法建立指令碼
平行讀取

指定草地的長度在 草地 地形材料上,假設 Decoration 啟用。有效值在 0.1 和 1 之間。

MaterialColors

BinaryString
無法建立指令碼
平行讀取

MaterialColors 代表材料顏色功能的編輯器,並且 不能由脚本編輯

要取得材料的顏色,請使用: Terrain:GetMaterialColor()

若要設定材料的顏色,請使用: Terrain:SetMaterialColor()

MaxExtents

唯讀
未複製
平行讀取

顯示最大可編輯區域的邊界。

WaterColor

平行讀取

地形水的顏色。

WaterReflectance

平行讀取

控制地形水鏡的隱藏程度。

WaterTransparency

平行讀取

地形水的透明度。

WaterWaveSize

平行讀取

設定地形水波的最大高度,以 stud 單位來表示。這目前受到 0 和 1 之間的限制。

WaterWaveSpeed

平行讀取

設定地形水波每分鐘上下移動的次數。目前上限為 0 至 100 之間。

方法

CellCenterToWorld

返回地形細胞中心的世界位置 (x, y, z)。

參數


返回

CellCornerToWorld

返回網格細胞的下左前角位置 (x, y, z)。

參數


返回

Clear

void

清除地形。


返回

void

CopyRegion

TerrainRegion 對象中存儲一塊地形,以便稍後可以載入。注意:TerrainRegion 資料在伺服器和客戶端之間不會重複。

參數

region: Region3int16

返回

範例程式碼

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

void

在指定的空間中填滿一顆光滑的地形。

參數

center: Vector3

地形球的中心位置。

radius: number

地形球的範圍。

material: Enum.Material

地形球的 Enum.Material


返回

void

範例程式碼

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

填充平滑地形的區塊,以指定的位置、旋轉方向、大小和材料。

參數

cframe: CFrame

地形區磚塊的 cframe (位置和方向)。

size: Vector3

方塊的尺寸 - 高度和寬度。

material: Enum.Material

地形區磚塊的 Enum.Material


返回

void

FillCylinder

void

在指定的空間中填滿平滑的地形。空間是使用 CFrame、高度和範圍定義的。

使用


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

參數

cframe: CFrame

地形圓柱的 CFrame (位置和方向)。

height: number

地形圓柱的高度。

radius: number

地形圓柱的範圍。

material: Enum.Material

地形圓柱的 Enum.Material


返回

void

FillRegion

void

用滑順的地形填滿 Region3 區域。

參數

region: Region3
resolution: number
material: Enum.Material

返回

void

FillWedge

void

FillWedge() 填滿區域內的 Terrain 中的楔形音量,並且使用 Enum.Material 和區域的 0> Datatype.CFrame0> 和尺寸。 楔形的方向與相當的 FillWedge()3> 相同。

參數

cframe: CFrame

方位和方向的側邊。

size: Vector3

方塊的大小。

material: Enum.Material

填充楔子的材料。


返回

void

GetMaterialColor

平行寫入

為指定的地形材料返回當前的地形材料顏色。

參數

material: Enum.Material

返回

PasteRegion

void

在地形對象上適用一塊地形。注意:TerrainRegion 資料不會在服務器和客戶物件之間重複。

參數

corner: Vector3int16
pasteEmptyCells: bool

返回

void

範例程式碼

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

Voxel 解析度。必須為 4。

channelIds: Array

從 voxel 資料中需要存取的通道 ID 列表(字串)。 每個通道 ID 代表存在於 voxel 中的資料類型。 目前支持的 ID 為 {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"}


返回

channelIds 輸入為基礎的 voxel 資料返回。鑰匙代表每個頻道 ID 的相關值作為一個 3D 資料的列表。

  • SolidMaterial — 材料 Enum.Material 的 voxel。注意,Water 已不支持;相反,包含水的 voxel 將有一個價值為 0> LiquidOccupancy0> 的。
  • SolidOccupancy — 材料的 voxel 的佔用率,如在 SolidMaterial 頻道中指定。這是值之間 0 (空) 和 1 (已滿) 的值。
  • LiquidOccupancy — 指定在 voxel 中的 Water 材料的空間位置,值為 0 (沒有水) 至 1 (水滿) 之間。如果 SolidOccupancy 是 1 和 0> SolidMaterial

字典還包含 Size 鑰匙,其中代表每個頻道資料 3D 陣列大小。

範例程式碼

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

要閱取的目標區域。必須齊齊到 voxel 網格。如果區域太大,將發生錯誤。目前區域的上限是 4194304 個 voxels^3。

resolution: number

Voxel 解析度。必須為 4。


返回

將原始 voxel 資料以兩個 3D 陣列返回。

  • materials - 3D 陣列 Enum.Material 從目標區域。也包含尺寸區域,與子擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊
  • occupancies - 3D 陣列的佔位值來自目標區域。也包含一個 Size 字段,與樹狀陣列的尺寸相等。

範例程式碼

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

ReplaceMaterial 會在 Enum.Material 內的特定地形中取代 Region3 材料。它是一種基於找到的替換操作,在 Terrain 材料上。

限制

當呼叫此方法時,resolution 參數必須正確為 4。此外,Region3:ExpandToGrid() 必須與地形材料網格對齊,即區域3 的最低和最大點的部分可以由 4 分。使用 1>Datatype.Region3:ExpandToGrid()1> 以使區域與此功能相容。

參數

region: Region3

發生替換操作的區域。

resolution: number

交換操作將在哪個解析度進空間;目前必須正確為 4。

sourceMaterial: Enum.Material

將要取代的舊材料。

targetMaterial: Enum.Material

新材料。


返回

void

範例程式碼

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

設定指定地形材料的當前材料顏色。地形材料將向指定顏色變更。

參數

material: Enum.Material
value: Color3

返回

void

WorldToCell

返回網格位置,包含點位 位置

參數

position: Vector3

返回

WorldToCellPreferEmpty

返回網格位置,包含點位位置,當位置在網格邊緣時,會優先返回空格網格位置。

參數

position: Vector3

返回

WorldToCellPreferSolid

返回網格位置,包含點位位置,當位置處於網格邊緣時,優先選擇不是空的網格位置。

參數

position: Vector3

返回

WriteVoxelChannels

void

使用基於座標數據的地形區域。

參數

region: Region3

目標區域。必須齊齊於 voxel 網格。如果區域太大,將發生錯誤;目前區域的上限為 4194304 個 voxels³。

resolution: number

Voxel 解析度。必須為 4。

channels: Dictionary

類似 Class.Terrain:ReadVoxelChannels() 返回值的 voxel 資料典禮。鑰匙代表每個頻道 ID 的相應值作為 3D 資料的陣列。典禮可以支援單個或多個頻道輸入。

  • SolidMaterial — 材料 Enum.Material 的 體素oxel。注意,Water 已不再支持;相反,包含僅水的 voxel 應該被輸入作為 0> SolidMaterial = Enum.Material.Air, LiquidOccupancy
  • SolidOccupancy — 材料的 voxel 的佔用率,如在 SolidMaterial 頻道中所指定。這應該是值之間的 0 (空) 和 1 (已滿) 之間。
  • LiquidOccupancy — 指定在 voxel 中的 Water 材料的空間位置,值為 0 (沒有水) 至 1 (水滿) 之間。如果 SolidOccupancy 是 1 和 0> SolidMaterial

返回

void

範例程式碼

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

使用表格格式設置特定區域的平滑地形。

參數

region: Region3

目標區域。必須齊齊滿全地盤。若區域太大,將發生錯誤。

resolution: number

Voxel 解析度。必須為 4。

materials: Array

3D 陣列的枚數材料。尺寸必須正確地與目標區域的大小匹配。

occupancy: Array

3D 陣列的速度位置 (數字在 0 和 1 之間)。尺寸必須與目標區域的大小相匹配。


返回

void

範例程式碼

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

活動