地形讓您可以在有點延遲的情況下創建動態可重新編輯的環境。它目前基於 4×4×4 網格的細胞,每個細胞都有一個數字代表何量的 геометria應該佔用細胞,和材料的細胞。占位率決定了細胞會與周圍細胞一起變形的結果,並且是無格式限制式的結果
了解更多資訊,請參閱 地形。
概要
屬性
啟用或關閉地形裝飾。
指定動畫草的長度。
MaterialColors 代表材料顏色功能的編輯器,並且 不能由脚本編輯 。
要取得材料的顏色,請使用: Terrain:GetMaterialColor() 要設定材料的顏色,請使用: Terrain:SetMaterialColor()
顯示最大可編輯區域的邊界。
地形水的顏色。
控制地形水鏡的隱藏程度。
地形水的透明度。
設定地形水波的最大高度。
設定地形水波每分鐘上下移動的次數。
是否確定零件是否可以按照物理學原理移動。
零件裝配的角度速度。
零件裝配在世界空間中的中心。
零件裝配的直線速度。
零件組裝的總量。
一個組裝根部分的引用。
決定零件背面的表面類型 (+Z 方向)。
決定零件底部面的表面類型 (-Y 方向)。
決定零件的顏色。
確定 BasePart 在世界中的位置和方向。
是否確定零件是否與其他零件碰撞。
確定要在空間查詢操作中檢視零件。
決定是否發生 Touched 和 TouchEnded 事件。
是否啟用或否啟用零件的暗影。
描述零件中心的位置在哪個世界位置。
描述零件碰撞群組的名稱。
決定零件的顏色。
指示零件的當前物理屬性。
確定零件的多個物理屬性。
用於啟用或解除零件和裝配件上的空力力量。
Class.BasePart 的物理部分的 BasePart。
BasePart 的實際物理尺寸,按照物理引擎的說明。
決定零件前面的表面類型 (-Z 方向)。
決定零件左面的表面類型 (-X 方向)。
決定對BasePart.Transparency的乘數,只對本地客戶端可見。
決定 Studio 中是否可選擇零件。
描述零件的大小,其密度和體積的產物。
確定零件是否對其剛身體的總質量或穩定性貢獻。
決定零件的材質和預設物理屬性。
Class.MaterialVariant 的名稱。
描述世界上零件的旋轉。
指定零件的中心點偏移值。
描述世界上零件的位置。
上次記錄物理更新的時間。
決定零件反射天空盒子的程度。
說明方法允許的最小尺寸變更。
描述零件可以重新尺寸的面。
決定零件右面的表面類型 (+X 方向)。
決定組裝件根部的主要規則。
三軸的旋轉度。
確定零件的尺寸 (長度、寬度、高度)。
決定零件上方面的表面類型 (+Y 方向)。
決定零件可以看到的程度(零件的反射)。
方法
返回地形細胞中心的世界位置 (x, y, z)。
返回網格細胞的下左前角位置 (x, y, z)。
清除地形。
在 TerrainRegion 對象中存儲一塊地形,以便稍後可以載入。注意:TerrainRegion 資料在伺服器和客戶端之間不會重複。
返回地形中的非空格元素數。
在指定的空間中填滿一顆光滑的地形。
填充平滑地形的區塊,以指定的位置、旋轉方向、大小和材料。
在指定的空間中填滿平滑的地形。
用滑順的地形填滿 Region3 區域。
使用 Enum.Material 和區域 CFrame 和尺寸提供的地形楔形體積。
為指定的地形材料返回當前的地形材料顏色。
在地形對象上適用一塊地形。注意:TerrainRegion 資料不會在服務器和客戶物件之間重複。
以表格式返回基於頻道名稱的地形速度資料區域。
返回表格中的特定平滑地形區域。
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):void
在區域內的地形中,用另一種材料取代另一種材料。
設定指定地形材料的當前材料顏色。
返回網格位置,包含點位 位置 。
返回網格位置,包含點位位置,當位置在網格邊緣時,會優先返回空格網格位置。
返回網格位置,包含點位位置,當位置處於網格邊緣時,優先選擇不是空的網格位置。
使用基於座標數據的地形區域。
使用表格格式設置特定區域的平滑地形。
對組裝件施加角度 impulse。
在裝配的 center of mass 上對裝配進行脈衝。
在指定位置對裝配進行脈衝。
返回零件是否能相互碰撞。
檢查您是否可以設置零件的網路擁有權。
返回任何類型的靈活組合節連接到對象的表。
返回連接到此零件的所有關聯零件或限制。
返回 Mass 屬性的值。
返回目前是網路擁有者的玩家,或是伺服器的情況下為零。
如果遊戲引擎自動決定網路擁有者,則返回 true。
返回零件組的零件。
返回與此零件交叉的所有 BasePart.CanCollide 個真實零件。
返回零件的組裝速度,與此零件相對的位置。
如果對象連接到一個會將其保留在位置的零件(例如Anchored 零件),則返回為真。
使用 Studio 調整大小工具的大小來變更對象的大小。
將指定的玩家設為網路所有者,這和所有連接的零件。
讓遊戲引擎動態決定誰會處理零件的物理學 (一個客戶或伺服器).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
從零件和其他零件在指定的陣列中交織的 геометria中創建新的 IntersectOperation。
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
從零件中創建新的 UnionOperation 零件,減去指定陣列中零件所佔的地形。
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
從零件建立新的 UnionOperation 零件,以及佔用零件在指定的陣列中的地理位置。
取得 PVInstance 的中心點。
以下是 PVInstance 和所有其子 PVInstances 的描述,以便 pivot 現在位於指定的 CFrame 。
屬性
MaterialColors
MaterialColors 代表材料顏色功能的編輯器,並且 不能由脚本編輯 。
要取得材料的顏色,請使用: Terrain:GetMaterialColor()
若要設定材料的顏色,請使用: Terrain:SetMaterialColor()
方法
Clear
清除地形。
返回
CopyRegion
在 TerrainRegion 對象中存儲一塊地形,以便稍後可以載入。注意:TerrainRegion 資料在伺服器和客戶端之間不會重複。
參數
返回
範例程式碼
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)
FillBall
在指定的空間中填滿一顆光滑的地形。
參數
返回
範例程式碼
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
填充平滑地形的區塊,以指定的位置、旋轉方向、大小和材料。
參數
返回
FillCylinder
在指定的空間中填滿平滑的地形。空間是使用 CFrame、高度和範圍定義的。
使用
workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
參數
返回
FillWedge
FillWedge() 填滿區域內的 Terrain 中的楔形音量,並且使用 Enum.Material 和區域的 0> Datatype.CFrame0> 和尺寸。 楔形的方向與相當的 FillWedge()3> 相同。
參數
返回
PasteRegion
在地形對象上適用一塊地形。注意:TerrainRegion 資料不會在服務器和客戶物件之間重複。
參數
返回
範例程式碼
--[[
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
以表格式返回基於頻道名稱的地形速度資料區域。
參數
閱取的目標區域。必須齊齊滿目的地區網格。如果區域太大,將發生錯誤;目前區域的上限為 4194304 個點數。
Voxel 解析度。必須為 4。
從 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 陣列大小。
範例程式碼
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
返回表格中的特定平滑地形區域。
參數
要閱取的目標區域。必須齊齊到 voxel 網格。如果區域太大,將發生錯誤。目前區域的上限是 4194304 個 voxels^3。
Voxel 解析度。必須為 4。
返回
將原始 voxel 資料以兩個 3D 陣列返回。
- materials - 3D 陣列 Enum.Material 從目標區域。也包含尺寸區域,與子擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊擊
- occupancies - 3D 陣列的佔位值來自目標區域。也包含一個 Size 字段,與樹狀陣列的尺寸相等。
範例程式碼
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 會在 Enum.Material 內的特定地形中取代 Region3 材料。它是一種基於找到的替換操作,在 Terrain 材料上。
限制
當呼叫此方法時,resolution 參數必須正確為 4。此外,Region3:ExpandToGrid() 必須與地形材料網格對齊,即區域3 的最低和最大點的部分可以由 4 分。使用 1>Datatype.Region3:ExpandToGrid()1> 以使區域與此功能相容。
參數
發生替換操作的區域。
交換操作將在哪個解析度進空間;目前必須正確為 4。
將要取代的舊材料。
新材料。
返回
範例程式碼
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)
WriteVoxelChannels
使用基於座標數據的地形區域。
參數
目標區域。必須齊齊於 voxel 網格。如果區域太大,將發生錯誤;目前區域的上限為 4194304 個 voxels³。
Voxel 解析度。必須為 4。
類似 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
返回
範例程式碼
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
使用表格格式設置特定區域的平滑地形。
參數
目標區域。必須齊齊滿全地盤。若區域太大,將發生錯誤。
Voxel 解析度。必須為 4。
3D 陣列的枚數材料。尺寸必須正確地與目標區域的大小匹配。
3D 陣列的速度位置 (數字在 0 和 1 之間)。尺寸必須與目標區域的大小相匹配。
返回
範例程式碼
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))