地形允许您创建动态可变的环境,几乎没有任何延迟。它目前基于 4×4×4 网格的细胞,每个细胞都有一个数字在 0 和 1 之间代表几何图形的占位,并且材料的细胞。占位决定细胞的形状与周围细胞的形状的关系,并且结果是无格约束的假设。
了解更多信息,请参阅地形。
概要
属性
启用或禁用地形装饰。
指定动态草的长度。
MaterialColors 代表材料颜色精选能的编辑器,不能由脚本编辑 。
要获取材料的颜色,请使用: Terrain:GetMaterialColor() 要设置材料的颜色,请使用: Terrain:SetMaterialColor()
显示最大可编辑区域的边界。
地形水的色调。
控制地形水域反射的不透明度。
地形水的透明度。
设置地形水波的最大高度。
设置地形水波每分钟上下移动的次数。
确定是否是物理上移动不可的部件。
零件的组装角度的速度。
零件装配在世界空间中的中心。
零件的装配直线速度。
零件的装配总量。
对装置的根部分的引用。
确定零件的背面表面类型 (+Z 方向)。
确定零件底部面的表面类型(-Y 方向)。
确定零件的颜色。
确定世界上的 BasePart 的位置和方向。
确定零件是否会与其他零件碰撞。
确定是否在空间查询操作中考虑零件。
决定是否在 Touched 和 TouchEnded 事件触发部件。
是否或否决定零件是否投射阴影。
描述零件中心的位置在哪个世界位置。
描述零件碰撞群组的名称。
确定零件的颜色。
指示零件的当前物理属性。
确定零件的几个物理属性。
用于启用或禁用零件和组装件上的气动力。
Class.BasePart 的物理部分的 BasePart 。
在物理引擎的视角下,BasePart的实际物理大小。
确定零件前面的表面类型(-Z 方向)。
确定零件左面的表面类型(-X 方向)。
为 BasePart.Transparency 设置一个倍增器,该客户端只能看到本地客户端。
在 Studio 中选择零件。
描述零件的质量、密度和体积。
确定零件是否对其刚性身体的总质量或粒度有贡献。
确定零件的材质和默认物理属性。
Class.Material 的名称。
描述世界上部件的旋转。
指定零件的中心从其 CFrame 。
描述世界中部件的位置。
上次记录的物理更新时间。
确定零件反射天空盒子的程度。
描述允许通过“调整大小”方法描述的最小变更。
描述零件可以调整的面。
确定零件右侧的表面类型 (+X 方向)。
确定装配件的根部的主要规则。
三轴上的零件的旋转。
确定零件的尺寸 (长度、宽度、高度)。
确定零件的顶部面的表面类型 (+Y 方向)。
通过(反向)零件隐私度来确定零件的可见度。
方法
返回地形细胞中心的世界位置(x, y, z)。
返回网格元素的左下角位置(x,y,z)。
清除地形。
将一块地形存储在 TerrainRegion 对象中,以便它在后续可以重新加载。注意:TerrainRegion 数据在服务器和客户端之间不会重复。
返回地形中的非空填充区数。
在指定的空间中填充一个光滑的地形。
填充平滑地形的方块,使用指定的位置、旋转角度、大小和材料。
在指定的空间中填充一个圆柱。
用光滑的地形填充一个 Region3 区域。
使用 Enum.Material 和区域的 CFrame 和 Size 填充一个楔形的地形音量。
为指定的地形材料返回当前的地形材料颜色。
在地形对象上应用一块地形。注意:TerrainRegion 数据不会在服务器和客户端之间重复。
根据通道名称返回地形座标数据的区域。
返回表格中的特定平滑地形区域。
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):void
将区域内的地形替换为另一种材料。
为指定的地形材料设置当前地形材料的颜色。
返回网格元位,其中包含位置 位置 。
返回网格元位,当位置在网格边时,空白网格元位。
返回网格元位,当位置在网格边上时,可优先使用不是空的网格元位。
使用数据库的 voxel 通道数据设置区域。
使用表格设置特定区域的平滑地形。
将角度冲击应用到装配件。
在装配的 center of mass 上应用脉冲。
将脉冲应用到指定位置的装配上。
返回零件是否可以相互碰撞。
检查您是否可以设置零件的网络所有权。
返回一个连接对象的零件表,通过任何类型的刚性关接头。
返回所有连接到此零件的关联或限制。
返回 Mass 属性的值。
返回当前玩家,这是网络的主人,或者在服务器的情况下为零。
如果游戏引擎自动决定网络所有者,返回 true。
返回零件组的基础部分。
返回包含所有 BasePart.CanCollide 真实零件的表。
返回该零件相对于此零件所给定位置的直线速度。
返回 true 如果对象连接到一个部件,它将在那里保持位置(例如 Class.BasePart.Anchored|Anchored 部件),否则返回 false。
就像使用 Studio 调整对象大小。
将给予的玩家作为网络所有者,为此和所有连接的部分。
让游戏引擎动态地决定谁将处理零件的物理(客户端或服务器之一)。
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
从零件和其他零件在给定数组列中交叉的几何图形中创建一个新的 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
根据通道名称返回地形座标数据的区域。
参数
要读取的目标区域。必须对齐于 voxel 网格。如果区域太大,将抛出一个错误;目前区域的大小上限为 4194304 个 voxels³。
体素解析度。必须为 4。
需要从声量数据访问的通道ID阵列(string)。每个通道ID代表存储在声量体素中的数据类型。当前支持的ID为 {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} 。
返回
根据 channelIds 输入返回 voxel 数据。键以各个通道 ID 的相应值为 3D 数据阵列代表。
- SolidOccupancy — 占位体素材料的占位率,如在 SolidMaterial 频道中指定。这是一个值之间的 0 (空) 和 1 (满)。
- LiquidOccupancy — 指定一个体素上的 Water 材料的占用值在 0 (无水) 和 1 (满水) 之间。如果 SolidOccupancy 是 1 和 0> SolidMaterial0> 不是 3> Ennum
字典还包含一个 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。
体素解析度。必须为 4。
返回
将原始声量数据返回为两个 3D 阵列。
- materials - 3D 阵列的 Enum.Material 从目标区域。还包含一个大小为子列阵列的尺寸相等的字段。
- occupancies - 3D 阵列的使用率值从目标区域。还包含一个大小为子阵列的大小值。
代码示例
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 替换为另一个材料。 它是一个在 Datatype.Region3 材料上的寻找和替换操作。 它的基本操作是在 Class.Terrain 材料上的查找和替换操作。
限制
调用此方法时,必须将 resolution 参数设置为 4 。此外,区域 3 必须对地形材料网格进行校准,即 Region3 的最小值和最大值的组成部分必须由 4 分割。使用 Region3:ExpandToGrid() 来使区域兼容此功能。
参数
发生替换操作的区域。
替换操作将在哪个解析度进场景;目前必须为 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)
SetMaterialColor
为指定的地形材料设置当前的地形材料颜色。地形材料将向指定的颜色改变基本颜色。
参数
返回
WriteVoxelChannels
使用数据库的 voxel 通道数据设置区域。
参数
写入的目标区域。必须与体素网格对齐。如果区域太大,将抛出错误;目前限制为 4194304 体素³。
体素解析度。必须为 4。
与 ReadVoxelChannels() 返回值类似的 voxel 数据字典。 钥匙代表每个频道 ID 的相应值作为 3D 数据阵列。 字典可以支持单个或多个频道输入。
- SolidMaterial — 材料 Enum.Material 的 体素oxel。注意,Water 已不再支持;相反,只有含水的 voxel 才应该输入为 0> SolidMaterial = Enum.Material.Air, LiquidOccupancy = x0>
- SolidOccupancy — 占位体素材料的占位率,如在 SolidMaterial 频道中指定。这应该是一个值之间的 0 (空) 和 1 (满)。
- LiquidOccupancy — 指定一个体素上的 Water 材料的占用值在 0 (无水) 和 1 (满水) 之间。如果 SolidOccupancy 是 1 和 0> SolidMaterial0> 不是 3> Ennum
返回
代码示例
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
使用表格设置特定区域的平滑地形。
参数
目标区域。必须对齐于网格。如果区域太大,将会抛出错误。
体素解析度。必须为 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))