Engine Class
Terrain
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
ข้อมูลสรุป
คุณสมบัติ
MaterialColors:BinaryString |
วิธีการ
สมาชิกที่ได้รับทอด
สมาชิก 106 คนที่รับทอดมาจาก BasePart
สมาชิก 4 คนที่รับทอดมาจาก PVInstance
สมาชิก 58 คนที่รับทอดมาจาก Instance
สมาชิก 6 คนที่รับทอดมาจาก Object
เอกสารอ้างอิงเกี่ยวกับ API
คุณสมบัติ
IsSmooth
MaterialColors
Terrain.MaterialColors:BinaryString
วิธีการ
AutowedgeCell
AutowedgeCells
CellCenterToWorld
CellCornerToWorld
Clear
Terrain:Clear():()
ส่งค่ากลับ
()
ConvertToSmooth
CopyRegion
พารามิเตอร์
ส่งค่ากลับ
ตัวอย่างโค้ด
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)FillBall
พารามิเตอร์
ส่งค่ากลับ
()
FillBlock
พารามิเตอร์
ส่งค่ากลับ
()
FillCylinder
พารามิเตอร์
ส่งค่ากลับ
()
FillRegion
พารามิเตอร์
ส่งค่ากลับ
()
FillWedge
พารามิเตอร์
ส่งค่ากลับ
()
GetCell
GetMaterialColor
พารามิเตอร์
ส่งค่ากลับ
GetMaterialSlot
พารามิเตอร์
ส่งค่ากลับ
ตัวอย่างโค้ด
ช่องวัสดุภูมิประเทศ
local MaterialService = game:GetService("MaterialService")
local Terrain = workspace.Terrain
-- ช่อง 2 ถึง 63 สามารถเขียนได้; ช่อง 0 และ 1 ถูกสงวนไว้สำหรับอากาศและน้ำ
local SLOT_INDEX = 2
local BASE_MATERIAL = Enum.Material.Grass
local VARIANT_NAME = "SwampVariant"
-- ค้นหาวัสดุ Variant ที่มีอยู่สำหรับวัสดุพื้นฐาน หรือสร้างใหม่
-- SetMaterialSlot() คาดหวังชื่อของ variant ไม่ใช่ชื่อที่แสดงของ Material Manager
local variant = MaterialService:FindFirstChild(VARIANT_NAME)
if not variant then
variant = Instance.new("MaterialVariant")
variant.Name = VARIANT_NAME
variant.BaseMaterial = BASE_MATERIAL
variant.Parent = MaterialService
end
-- กำหนดค่าช่องด้วยวัสดุพื้นฐาน ชื่อ MaterialVariant และสี
-- ส่งสตริงว่างแทนชื่อ variant เพื่อใช้รูปลักษณ์เริ่มต้นของวัสดุพื้นฐานที่มีสีที่กำหนด
Terrain:SetMaterialSlot(SLOT_INDEX, BASE_MATERIAL, variant.Name, Color3.fromRGB(50, 60, 30))
local baseMaterial, materialVariant, color = Terrain:GetMaterialSlot(SLOT_INDEX)
print(baseMaterial, materialVariant, color)
-- เขียนพื้นที่ของ voxel ที่อ้างอิงช่องตามดัชนี แทนที่จะเป็น Enum.Material โดยใช้ช่อง SolidMaterialIndex
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 16, 16)):ExpandToGrid(4)
local size = region.Size / 4
local materialIndices = {}
local occupancies = {}
for x = 1, size.X do
materialIndices[x] = {}
occupancies[x] = {}
for y = 1, size.Y do
materialIndices[x][y] = {}
occupancies[x][y] = {}
for z = 1, size.Z do
materialIndices[x][y][z] = SLOT_INDEX
occupancies[x][y][z] = 1
end
end
end
Terrain:WriteVoxelChannels(region, 4, {
SolidMaterialIndex = materialIndices,
SolidOccupancy = occupancies,
})
-- การลบช่องจะทำให้ voxel ที่อ้างอิงมันแสดงผลเป็นไม่ถูกต้องจนกว่าจะถูกทาสีใหม่ด้วยดัชนีช่องที่ถูกต้อง
Terrain:ResetMaterialSlot(SLOT_INDEX)GetWaterCell
PasteRegion
พารามิเตอร์
ส่งค่ากลับ
()
ตัวอย่างโค้ด
สร้าง คัดลอก และวางภูมิประเทศ
local Terrain = workspace.Terrain
-- สร้างภูมิประเทศง่ายๆ
local initialRegion = Region3.new(Vector3.zero, Vector3.one * 10)
Terrain:FillRegion(initialRegion, 4, Enum.Material.Grass)
-- คัดลอกภูมิประเทศ
local copyRegion = Region3int16.new(Vector3int16.new(0, 0, 0), Vector3int16.new(10, 10, 10))
local copiedRegion = Terrain:CopyRegion(copyRegion)
-- กำหนดตำแหน่งที่จะวางภูมิประเทศ
local newRegionCorner = Vector3int16.new(5, 0, 0)
-- วางภูมิประเทศ
Terrain:PasteRegion(copiedRegion, newRegionCorner, true)ReadVoxelChannels
ส่งค่ากลับ
ตัวอย่างโค้ด
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
ส่งค่ากลับ
ตัวอย่างโค้ด
Terrain:ReadVoxels()
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 -- ขนาดเดียวกับ 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
Terrain:ReplaceMaterial(
):()
พารามิเตอร์
ส่งค่ากลับ
()
ตัวอย่างโค้ด
Terrain:ReplaceMaterial
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)ResetMaterialSlot
พารามิเตอร์
ส่งค่ากลับ
()
ตัวอย่างโค้ด
ช่องวัสดุภูมิประเทศ
local MaterialService = game:GetService("MaterialService")
local Terrain = workspace.Terrain
-- ช่อง 2 ถึง 63 สามารถเขียนได้; ช่อง 0 และ 1 ถูกสงวนไว้สำหรับอากาศและน้ำ
local SLOT_INDEX = 2
local BASE_MATERIAL = Enum.Material.Grass
local VARIANT_NAME = "SwampVariant"
-- ค้นหาวัสดุ Variant ที่มีอยู่สำหรับวัสดุพื้นฐาน หรือสร้างใหม่
-- SetMaterialSlot() คาดหวังชื่อของ variant ไม่ใช่ชื่อที่แสดงของ Material Manager
local variant = MaterialService:FindFirstChild(VARIANT_NAME)
if not variant then
variant = Instance.new("MaterialVariant")
variant.Name = VARIANT_NAME
variant.BaseMaterial = BASE_MATERIAL
variant.Parent = MaterialService
end
-- กำหนดค่าช่องด้วยวัสดุพื้นฐาน ชื่อ MaterialVariant และสี
-- ส่งสตริงว่างแทนชื่อ variant เพื่อใช้รูปลักษณ์เริ่มต้นของวัสดุพื้นฐานที่มีสีที่กำหนด
Terrain:SetMaterialSlot(SLOT_INDEX, BASE_MATERIAL, variant.Name, Color3.fromRGB(50, 60, 30))
local baseMaterial, materialVariant, color = Terrain:GetMaterialSlot(SLOT_INDEX)
print(baseMaterial, materialVariant, color)
-- เขียนพื้นที่ของ voxel ที่อ้างอิงช่องตามดัชนี แทนที่จะเป็น Enum.Material โดยใช้ช่อง SolidMaterialIndex
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 16, 16)):ExpandToGrid(4)
local size = region.Size / 4
local materialIndices = {}
local occupancies = {}
for x = 1, size.X do
materialIndices[x] = {}
occupancies[x] = {}
for y = 1, size.Y do
materialIndices[x][y] = {}
occupancies[x][y] = {}
for z = 1, size.Z do
materialIndices[x][y][z] = SLOT_INDEX
occupancies[x][y][z] = 1
end
end
end
Terrain:WriteVoxelChannels(region, 4, {
SolidMaterialIndex = materialIndices,
SolidOccupancy = occupancies,
})
-- การลบช่องจะทำให้ voxel ที่อ้างอิงมันแสดงผลเป็นไม่ถูกต้องจนกว่าจะถูกทาสีใหม่ด้วยดัชนีช่องที่ถูกต้อง
Terrain:ResetMaterialSlot(SLOT_INDEX)SetCell
SetCells
SetMaterialColor
พารามิเตอร์
ส่งค่ากลับ
()
SetMaterialSlot
Terrain:SetMaterialSlot(
):()
พารามิเตอร์
ส่งค่ากลับ
()
ตัวอย่างโค้ด
ช่องวัสดุภูมิประเทศ
local MaterialService = game:GetService("MaterialService")
local Terrain = workspace.Terrain
-- ช่อง 2 ถึง 63 สามารถเขียนได้; ช่อง 0 และ 1 ถูกสงวนไว้สำหรับอากาศและน้ำ
local SLOT_INDEX = 2
local BASE_MATERIAL = Enum.Material.Grass
local VARIANT_NAME = "SwampVariant"
-- ค้นหาวัสดุ Variant ที่มีอยู่สำหรับวัสดุพื้นฐาน หรือสร้างใหม่
-- SetMaterialSlot() คาดหวังชื่อของ variant ไม่ใช่ชื่อที่แสดงของ Material Manager
local variant = MaterialService:FindFirstChild(VARIANT_NAME)
if not variant then
variant = Instance.new("MaterialVariant")
variant.Name = VARIANT_NAME
variant.BaseMaterial = BASE_MATERIAL
variant.Parent = MaterialService
end
-- กำหนดค่าช่องด้วยวัสดุพื้นฐาน ชื่อ MaterialVariant และสี
-- ส่งสตริงว่างแทนชื่อ variant เพื่อใช้รูปลักษณ์เริ่มต้นของวัสดุพื้นฐานที่มีสีที่กำหนด
Terrain:SetMaterialSlot(SLOT_INDEX, BASE_MATERIAL, variant.Name, Color3.fromRGB(50, 60, 30))
local baseMaterial, materialVariant, color = Terrain:GetMaterialSlot(SLOT_INDEX)
print(baseMaterial, materialVariant, color)
-- เขียนพื้นที่ของ voxel ที่อ้างอิงช่องตามดัชนี แทนที่จะเป็น Enum.Material โดยใช้ช่อง SolidMaterialIndex
local region = Region3.new(Vector3.new(0, 0, 0), Vector3.new(16, 16, 16)):ExpandToGrid(4)
local size = region.Size / 4
local materialIndices = {}
local occupancies = {}
for x = 1, size.X do
materialIndices[x] = {}
occupancies[x] = {}
for y = 1, size.Y do
materialIndices[x][y] = {}
occupancies[x][y] = {}
for z = 1, size.Z do
materialIndices[x][y][z] = SLOT_INDEX
occupancies[x][y][z] = 1
end
end
end
Terrain:WriteVoxelChannels(region, 4, {
SolidMaterialIndex = materialIndices,
SolidOccupancy = occupancies,
})
-- การลบช่องจะทำให้ voxel ที่อ้างอิงมันแสดงผลเป็นไม่ถูกต้องจนกว่าจะถูกทาสีใหม่ด้วยดัชนีช่องที่ถูกต้อง
Terrain:ResetMaterialSlot(SLOT_INDEX)SetWaterCell
WorldToCell
WorldToCellPreferEmpty
WorldToCellPreferSolid
WriteVoxelChannels
พารามิเตอร์
ส่งค่ากลับ
()
ตัวอย่างโค้ด
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 -- ของแข็งไม่สามารถมีน้ำได้
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
ส่งค่ากลับ
()
ตัวอย่างโค้ด
Terrain:WriteVoxels()
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)