Terrain
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
สภาพแวดล้อมช่วยให้คุณสามารถสร้างสภาพแวดล้อมที่สามารถเปลี่ยนแปลงได้อย่างไดนามิกด้วยความล่าช้าเล็กน้อยหรือไม่มีเลยขณะนี้อิงจากกริด 4×4×4 ของเซลล์ซึ่งแต่ละเซลล์มีหมายเลขระหว่าง 0 และ 1 ที่แทนที่จำนวนเซลล์ที่เซลล์ควรใช้และวัสดุของเซลล์การเปลี่ยนแปลงการใช้งานกำหนดวิธีที่เซลล์จะแปลงร่วมกับเซลล์รอบๆ และผลลัพธ์คือภาพลวงตาว่าไม่มีข้อจำกัดในกริด
สำหรับข้อมูลเพิ่มเติม ดู พื้นที่
สรุป
คุณสมบัติ
เปิดใช้งานหรือปิดการตกแต่งพื้นที่
ระบุความยาวของหญ้าเคลื่อนไหว
MaterialColors เป็นตัวแทนของเอดิเตอร์สำหรับคุณลักษณะสีวัสดุและ ไม่สามารถแก้ไขโดยสคริปต์ได้ เพื่อรับสีของวัสดุใช้: Terrain:GetMaterialColor() เพื่อตั้งสีของวัสดุใช้: Terrain:SetMaterialColor()
แสดงขอบเขตของภูมิภาคที่แก้ไขได้ใหญ่ที่สุดที่เป็นไปได้
สีย้อมของน้ําพื้นที่
ควบคุมว่าการสะท้อนน้ําของพื้นที่มืดมนเพียงใด
ความโปร่งใสของน้ําพื้นที่
ตั้งค่าความสูงสูงสุดของคลื่นน้ําในพื้นที่ในสตัด
ตั้งจำนวนครั้งที่คลื่นน้ําในพื้นที่จะย้ายขึ้นและลงต่อนาที
กำหนดว่าชิ้นส่วนเป็นอนันต์ตามฟิสิกส์หรือไม่
ความเร็วในแนวมุมของการประกอบชิ้นส่วน
ศูนย์กลางของมวลของการประกอบชิ้นส่วนในพื้นที่โลก
ความเร็วเชิงเส้นของการประกอบชิ้นส่วน
มวลรวมของการประกอบชิ้นส่วน
การอ้างอิงถึงส่วนรากของการประกอบ
กำหนดว่าชิ้นจะโต้ตอบกับการจำลองเสียงทางกายภาพหรือไม่ คล้ายกับ CastShadow สำหรับแสง
กำหนดประเภทพื้นผิวสำหรับด้านหลังของชิ้นส่วน
กำหนดประเภทพื้นผิวสำหรับด้านล่างของชิ้นส่วน
กำหนดสีของชิ้นส่วน
กำหนดตำแหน่งและทิศทางของ BasePart ในโลก
กำหนดว่าชิ้นส่วนจะชนกับชิ้นส่วนอื่นหรือไม่
กำหนดว่าชิ้นส่วนจะถูกพิจารณาในระหว่างการดำเนินการค้นหาในพื้นที่หรือไม่
กำหนดว่าจะมีการเรียกไฟ Touched และ TouchEnded กิจกรรมบนส่วนหรือไม่
กำหนดว่าส่วนใดมีเงาหรือไม่
อธิบายตำแหน่งของโลกที่ศูนย์กลางของมวลของชิ้นส่วนอยู่
อธิบายชื่อกลุ่มการชนกันของชิ้นส่วน
กำหนดสีของชิ้นส่วน
บ่งชี้คุณสมบัติทางกายภาพปัจจุบันของชิ้นส่วน
กำหนดคุณสมบัติทางกายภาพหลายอย่างของชิ้นส่วน
ใช้เพื่อเปิดใช้งานหรือปิดใช้งานแรงอากาศในชิ้นส่วนและชิ้นส่วนประกอบ
ขนาดทางกายภาพที่แท้จริงของ BasePart ตามที่เครื่องกลศาสตร์กำหนด
กำหนดประเภทพื้นผิวสำหรับด้านหน้าของชิ้นส่วน
กำหนดประเภทพื้นผิวสำหรับด้านซ้ายของชิ้นส่วน
กำหนดตัวคูณสำหรับ BasePart.Transparency ที่มองเห็นได้เฉพาะกับไคลเอนต์ท้องถิ่นเท่านั้น
กำหนดว่าส่วนใดสามารถเลือกได้ใน Studio
อธิบายมวลของชิ้นส่วน ผลิตภัณฑ์ของความหนาแน่นและปริมาณ
กำหนดว่าชิ้นส่วนมีส่วนร่วมในมวลหรือแรงเฉื่อยของร่างกายแข็งหรือไม่
กำหนดเทกเจอร์และคุณสมบัติทางกายภาพเริ่มต้นของชิ้นส่วน
ชื่อของ MaterialVariant .
อธิบายการหมุนของชิ้นส่วนในโลก
ระบุออฟเซ็ตของจุดศูนย์กลางของชิ้นส่วนจาก CFrame ของมัน
อธิบายตำแหน่งของชิ้นส่วนในโลก
เวลาตั้งแต่อัปเดตฟิสิกส์ครั้งล่าสุด
กำหนดจํานวนส่วนที่สะท้อนกล่องท้องฟ้าได้
อธิบายการเปลี่ยนแปลงขนาดเล็กที่สุดที่อนุญาตโดยวิธี Resize()
อธิบายใบหน้าที่ส่วนสามารถปรับขนาดได้
กำหนดประเภทพื้นผิวสำหรับด้านขวาของชิ้นส่วน
กฎหลักในการกำหนดส่วนรากของการประกอบ
การหมุนของชิ้นส่วนในองศาสำหรับสามแกน
กำหนดขนาดของชิ้นส่วน (ความยาว ความกว้าง ความสูง)
กำหนดประเภทพื้นผิวสำหรับด้านบนของชิ้นส่วน
กำหนดจำนวนส่วนที่สามารถมองเห็นได้ผ่าน (ตรงกันข้ามของความทึบของส่วน)
วิธีการ
ส่งคืนตำแหน่งโลกของศูนย์กลางของเซลล์พื้นที่ (x, y, z)
คืนตำแหน่งของมุมด้านล่างซ้ายไปข้างหน้าของเซลล์กริด (x, y, z)
ล้างพื้นที่
บันทึกชิ้นส่วนของพื้นที่เป็นวัตถุ TerrainRegion เพื่อให้สามารถโหลดกลับได้ในภายหลังหมายเหตุ: TerrainRegion ข้อมูลไม่ซ้ำกันระหว่างเซิร์ฟเวอร์และไคลเอนต์
คืนจํานวนเซลล์ที่ไม่ว่างเปล่าในพื้นที่
เติมลูกบอลของพื้นที่ราบเรียบในพื้นที่ที่กำหนด
เติมบล็อกของพื้นที่ราบเรียบด้วยตำแหน่งที่กำหนด การหมุน ขนาด และวัสดุ
เติมทรงกระบอกของพื้นที่ราบเรียบในพื้นที่ที่กำหนด
เติมพื้นที่ Region3 ด้วยพื้นที่ลาดเรียบ
เติมปริมาณรูปทรงบล็อกของพื้นที่ด้วย Enum.Material และ CFrame และขนาดของพื้นที่
ส่งคืนสีวัสดุพื้นที่ปัจจุบันสำหรับวัสดุพื้นที่ที่กำหนดไว้
- IterateVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainIterateOperation
- ModifyVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainModifyOperation
ใช้ส่วนของพื้นที่กับวัตถุพื้นที่ โปรดทราบ: TerrainRegion ข้อมูลไม่ซ้ำระหว่างเซิร์ฟเวอร์และไคลเอนต์
ส่งคืนภูมิภาคของข้อมูล voxel พื้นดินในรูปแบบตารางตามชื่อช่องทาง
ส่งคืนภูมิประเทศบางพื้นที่ในรูปแบบตารางในตาราง
- ReplaceMaterial(region : Region3,resolution : number,sourceMaterial : Enum.Material,targetMaterial : Enum.Material):()
เปลี่ยนพื้นที่ของวัสดุภายในภูมิภาคด้วยวัสดุอื่น
ตั้งสีวัสดุพื้นที่ปัจจุบันสำหรับวัสดุพื้นที่ที่กำหนดไว้
ส่งคืนตำแหน่งเซลล์กริดที่มีจุด ตำแหน่ง
คืนตำแหน่งเซลล์กริดที่มีตำแหน่งจุด โดยให้ความสำคัญกับเซลล์กริดว่างเมื่อตำแหน่งอยู่บนขอบกริด
คืนตำแหน่งเซลล์กริดที่มีตำแหน่งจุด โดยให้ความสำคัญกับเซลล์กริดที่ไม่ว่างเปล่าเมื่อตำแหน่งอยู่บนขอบกริด
ตั้งภูมิภาคของพื้นดินโดยใช้สารบัญของข้อมูลช่องวอกเซล
ตั้งภูมิประเทศบางพื้นที่โดยใช้รูปแบบตาราง
- WriteVoxelsAsync_beta(region : Region3,resolution : number,channelIds : Array):TerrainWriteOperation
ใช้แรงกระตุกแบบมุมกับการประกอบ
ใช้แรงกระตุ้นกับการประกอบที่การประกอบ center of mass .
ใช้แรงกระตุ้นกับการประกอบในตำแหน่งที่กำหนด
ส่งคืนว่าชิ้นส่วนสามารถชนกันได้หรือไม่
ตรวจสอบว่าคุณสามารถกำหนดสิทธิ์เจ้าของเครือข่ายส่วนได้หรือไม่
คืนตารางชิ้นส่วนที่เชื่อมโยงกับวัตถุโดยใช้ข้อต่อแข็งใดๆ
คืนข้อต่อหรือข้อจำกัดทั้งหมดที่เชื่อมโยงกับส่วนนี้
ส่งค่าของคุณสมบัติ Mass กลับ
ส่งคืนผู้เล่นปัจจุบันที่เป็นเจ้าของเครือข่ายส่วนนี้หรือ nil ในกรณีของเซิร์ฟเวอร์
ส่งคืนค่าจริงหากเครื่องเกมตัดสินเจ้าของเครือข่ายสำหรับส่วนนี้โดยอัตโนมัติ
คืนส่วนฐานของการประกอบชิ้นส่วน
คืนตารางของชิ้นส่วนทั้งหมด BasePart.CanCollide ที่ถูกตัดกับชิ้นส่วนนี้
คืนความเร็วเชิงเส้นของการประกอบชิ้นส่วนในตำแหน่งที่กำหนดเมื่อเทียบกับชิ้นส่วนนี้
ส่งคืนจริงหากวัตถุเชื่อมต่อกับส่วนที่จะถือไว้ในตําแหน่ง (เช่นส่วน Anchored ) มิฉะนั้นจะส่งคืนเป็นเท็จ
เปลี่ยนขนาดของวัตถุเช่นเดียวกับการใช้เครื่องมือปรับขนาดของ 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 ทำให้จุดศูนย์กลางอยู่ที่ตําแหน่งที่ระบุแล้ว CFrame
อีเวนต์
อีเวนต์รับทอดมาจากBasePartไฟเมื่อชิ้นหยุดสัมผัสอีกชิ้นเนื่องจากการเคลื่อนไหวทางกายภาพ
ไฟเมื่อชิ้นส่วนสัมผัสกับชิ้นส่วนอื่นเนื่องจากการเคลื่อนไหวทางกายภาพ
คุณสมบัติ
Decoration
ปัจจุบันเปิดใช้งานหรือปิดใช้งานหญ้าเคลื่อนไหวบนพื้นที่วัตถุ หญ้า แม้ว่าการแก้ไขคุณสมบัตินี้ในอนาคตอาจควบคุมคุณลักษณะตกแต่งเพิ่มเติมก็ตาม
GrassLength
ระบุระยะเวลาของหญ้าเคลื่อนไหวบนวัสดุพื้นที่ หญ้า โดยคาดว่า Decoration จะเปิดใช้งาน มูลค่าที่ถูกต้องอยู่ระหว่าง 0.1 และ 1
MaterialColors
MaterialColors เป็นตัวแทนของเอดิเตอร์สำหรับคุณลักษณะสีวัสดุและ ไม่สามารถแก้ไขโดยสคริปต์ได้ เพื่อรับสีของวัสดุใช้: Terrain:GetMaterialColor()
เพื่อตั้งสีของวัสดุให้ใช้: Terrain:SetMaterialColor()
WaterWaveSize
ตั้งค่าความสูงสูงสุดของคลื่นน้ําในพื้นที่ในสตัด นี่ปัจจุบันถูกจํากัดระหว่าง 0 และ 1
WaterWaveSpeed
ตั้งค่าจำนวนครั้งที่คลื่นน้ําในพื้นที่จะย้ายขึ้นและลงต่อนาที ขณะนี้จํากัดอยู่ระหว่าง 0 และ 100
วิธีการ
CellCenterToWorld
ส่งคืนตำแหน่งโลกของศูนย์กลางของเซลล์พื้นที่ (x, y, z)
พารามิเตอร์
ส่งค่ากลับ
CellCornerToWorld
คืนตำแหน่งของมุมด้านล่างซ้ายไปข้างหน้าของเซลล์กริด (x, y, z)
พารามิเตอร์
ส่งค่ากลับ
Clear
ล้างพื้นที่
ส่งค่ากลับ
ClearVoxelsAsync_beta
พารามิเตอร์
ส่งค่ากลับ
CopyRegion
บันทึกชิ้นส่วนของพื้นที่เป็นวัตถุ TerrainRegion เพื่อให้สามารถโหลดกลับได้ในภายหลังหมายเหตุ: TerrainRegion ข้อมูลไม่ซ้ำกันระหว่างเซิร์ฟเวอร์และไคลเอนต์
พารามิเตอร์
ส่งค่ากลับ
ตัวอย่างโค้ด
The following code will copy the whole Terrain and clear it. After 5 seconds it will paste the terrain back.
local terrainRegion = workspace.Terrain:CopyRegion(workspace.Terrain.MaxExtents)
workspace.Terrain:Clear()
task.wait(5)
workspace.Terrain:PasteRegion(terrainRegion, workspace.Terrain.MaxExtents.Min, true)
FillBall
เติมลูกบอลของพื้นที่ราบเรียบในพื้นที่ที่กำหนด
พารามิเตอร์
ตำแหน่งศูนย์กลางของลูกบอลพื้นที่
รัศมีในสตัดของลูกบอลพื้นที่
The Enum.Material ของลูกบอลพื้นที่
ส่งค่ากลับ
ตัวอย่างโค้ด
Terrain:FillBall() creates a ball of terrain given a center position, ball radius, and terrain materials.
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
เติมบล็อกของพื้นที่ราบเรียบด้วยตำแหน่งที่กำหนด การหมุน ขนาด และวัสดุ
พารามิเตอร์
ตำแหน่งและทิศทางของบล็อกพื้นที่
ขนาดในสตัดของบล็อกสี่เหลี่ยม - ทั้งความสูงและความกว้าง
The Enum.Material ของบล็อกพื้นที่
ส่งค่ากลับ
FillCylinder
เติมทรงกระบอกของพื้นที่ราบเรียบในพื้นที่ที่กำหนด พื้นที่จะถูกกำหนดโดยใช้ CFrame, ความสูง และรัศมี
local Workspace = game:GetService("Workspace")Workspace.Terrain:FillCylinder(CFrame.new(0, 50, 0), 5, 30, Enum.Material.Asphalt)
พารามิเตอร์
ตำแหน่งและทิศทางของทรงกระบอกพื้นที่
ความสูงในสตัดของทรงกระบอกพื้นที่
รัศมีในสตัดของทรงกระบอกพื้นที่
The Enum.Material ของทรงกระบอกพื้นที่
ส่งค่ากลับ
FillRegion
เติมพื้นที่ Region3 ด้วยพื้นที่ลาดเรียบ
พารามิเตอร์
ส่งค่ากลับ
FillWedge
FillWedge() เติมปริมาณรูปทรงบล็อกของ Terrain ด้วย Enum.Material และขนาดของพื้นที่ CFrame และขนาดทิศทางของบล็อกลิ่มเป็นเช่นเดียวกับที่เทียบเท่า WedgePart
พารามิเตอร์
ตำแหน่งและทิศทางของบล็อกลิ่มที่จะเติม
ขนาดของบล็อกลิ่นที่จะเติม
วัสดุที่จะเติมบล็อกลิ่ม
ส่งค่ากลับ
GetMaterialColor
ส่งคืนสีวัสดุพื้นที่ปัจจุบันสำหรับวัสดุพื้นที่ที่กำหนดไว้
พารามิเตอร์
ส่งค่ากลับ
IterateVoxelsAsync_beta
พารามิเตอร์
ส่งค่ากลับ
ModifyVoxelsAsync_beta
พารามิเตอร์
ส่งค่ากลับ
PasteRegion
ใช้ส่วนของพื้นที่กับวัตถุพื้นที่ โปรดทราบ: TerrainRegion ข้อมูลไม่ซ้ำระหว่างเซิร์ฟเวอร์และไคลเอนต์
พารามิเตอร์
ส่งค่ากลับ
ตัวอย่างโค้ด
Creates some terrain, copies it, then pastes it using the following API:
--[[
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 วอกเซล³
ความละเอียดของวอกเซล ต้องเป็น 4
รายการช่อง ID (สตริง) ที่ต้องเข้าถึงจากข้อมูล voxelแต่ละรหัสช่องเป็นตัวแทนของประเภทข้อมูลที่จัดเก็บไว้ใน voxelID ที่สนับสนุนปัจจุบันคือ {"SolidMaterial", "SolidOccupancy", "LiquidOccupancy"} .
ส่งค่ากลับ
ส่งคืนข้อมูล voxel เป็นสารานุกรมตามอินพุต channelIds คีย์แทนที่รหัสช่องแต่ละรายการด้วยค่าที่เป็นอาร์เรย์ของข้อมูล 3D
- SolidMaterial — วัสดุของ voxel Enum.Materialโปรดทราบว่า Water ไม่สนับสนุนอีกต่อไป; แทนที่จะมีค่าของ voxel ที่มีน้ําอยู่จะมีค่าเป็น LiquidOccupancy
- SolidOccupancy — การใช้งานของวัสดุของ voxel ตามที่ระบุไว้ในช่อง SolidMaterial นี่คือค่าระหว่าง 0 (ว่างเปล่า) และ 1 (เต็ม)
สารานุกรมยังมีกุญแจ 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
ส่งคืนภูมิประเทศบางพื้นที่ในรูปแบบตารางในตาราง
พารามิเตอร์
ภูมิภาคเป้าหมายที่จะอ่านจาก ต้องสอดคล้องกับกริดวอกเซล จะโยนข้อผิดพลาดหากภูมิภาคมีขนาดใหญ่เกินไป ขีดจํากัดปัจจุบันคือ 4194304 วอกเซล^3
ความละเอียดของวอกเซล ต้องเป็น 4
ส่งค่ากลับ
ส่งคืนข้อมูล voxel ดิบเป็นสองอาร์เรย์ 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 -- เหมือนกับการเข้าพัก.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)
ReadVoxelsAsync_beta
พารามิเตอร์
ส่งค่ากลับ
ReplaceMaterial
เปลี่ยนวัสดุเปลี่ยนพื้นที่ของบางสิ่งบางอย่าง Enum.Material ภายใน Region3 ด้วยวัสดุอื่นโดยพื้นฐานแล้วเป็นการค้นหาและแทนที่บนวัสดุ Terrain
ข้อจํากัด
เมื่อเรียกวิธีนี้ พารามิเตอร์ resolution จะต้องเป็น 4 อย่างแน่นอนนอกจากนี้ ภูมิภาค 3 ต้องสอดคล้องกับกริดวัสดุพื้นที่ เช่นส่วนประกอบของจุดต่ำสุดและสูงสุดของภูมิภาค 3 ต้องแบ่งได้โดย 4ใช้ Region3:ExpandToGrid() เพื่อทำให้ภูมิภาคสอดคล้องกับฟังก์ชันนี้
พารามิเตอร์
ภูมิภาคที่การดำเนินการแทนที่จะเกิดขึ้น
ความละเอียดที่การดำเนินการแทนที่จะเกิดขึ้น; ในขณะนี้จะต้องเป็นตัวเลขที่แน่นอน 4
วัสดุเก่าที่จะถูกแทนที่
วัสดุใหม่
ส่งค่ากลับ
ตัวอย่างโค้ด
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.
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
ตั้งสีวัสดุพื้นที่ปัจจุบันสำหรับวัสดุพื้นที่ที่กำหนดไว้ วัสดุพื้นที่จะเปลี่ยนสีฐานไปสู่สีที่กำหนดไว้
พารามิเตอร์
ส่งค่ากลับ
WorldToCell
ส่งคืนตำแหน่งเซลล์กริดที่มีจุด ตำแหน่ง
พารามิเตอร์
ส่งค่ากลับ
WorldToCellPreferEmpty
คืนตำแหน่งเซลล์กริดที่มีตำแหน่งจุด โดยให้ความสำคัญกับเซลล์กริดว่างเมื่อตำแหน่งอยู่บนขอบกริด
พารามิเตอร์
ส่งค่ากลับ
WorldToCellPreferSolid
คืนตำแหน่งเซลล์กริดที่มีตำแหน่งจุด โดยให้ความสำคัญกับเซลล์กริดที่ไม่ว่างเปล่าเมื่อตำแหน่งอยู่บนขอบกริด
พารามิเตอร์
ส่งค่ากลับ
WriteVoxelChannels
ตั้งภูมิภาคของพื้นดินโดยใช้สารบัญของข้อมูลช่องวอกเซล
พารามิเตอร์
ภูมิภาคเป้าหมายที่จะเขียน ต้องสอดคล้องกับกริดวอกเซล จะโยนข้อผิดพลาดหากภูมิภาคใหญ่เกินไป; ขีดจํากัดปัจจุบันคือ 4194304 วอกเซล³
ความละเอียดของวอกเซล ต้องเป็น 4
สารานุกรมของข้อมูล voxel ที่คล้ายกับค่ากลับของ ReadVoxelChannels()กุญแจแทนที่รหัสช่องแต่ละรายการด้วยค่าที่เป็นอาร์เรย์ของข้อมูล 3D ตามลำดับสารานุกรมสามารถสนับสนุนการใส่ช่องเดียวหรือหลายช่องได้
- SolidMaterial — วัสดุของ voxel Enum.Materialโปรดทราบว่า Water ไม่ได้รับการสนับสนุนอีกต่อไป; แทนที่จะใส่วอกเซลที่มีเฉพาะน้ําเท่านั้นเป็น SolidMaterial = Enum.Material.Air, LiquidOccupancy = x ซึ่ง x เป็นตัวเลขระหว่าง 0 (พิเศษ) และ 1 (รวม)
- SolidOccupancy — การใช้วัสดุของวอกเซลตามที่ระบุไว้ในช่อง SolidMaterial นี้ควรเป็นค่าระหว่าง 0 (ว่างเปล่า) และ 1 (เต็ม)
ส่งค่ากลับ
ตัวอย่างโค้ด
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 ของ Enum.Material. มิติต้องตรงกับขนาดของภูมิภาคเป้าหมายในโวเซลอย่างแม่นยำ
3D ของความเต็มของ voxel (ตัวเลขระหว่าง 0 และ 1) มิติต้องตรงกับขนาดของภูมิภาคเป้าหมายใน voxels อย่างแม่นยำ
ส่งค่ากลับ
ตัวอย่างโค้ด
ตัวอย่าง
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.
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))