GeometryService

แสดงที่เลิกใช้งานแล้ว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ไม่สามารถสร้าง
บริการ

บริการที่มีการดำเนินการทางเรขาคณิตที่ไม่เกี่ยวข้องโดยตรงกับวัตถุเฉพาะ โดยตรง

สรุป

วิธีการ

  • คืนตารางของ Constraints และ Attachments ซึ่งคุณอาจเลือกที่จะเก็บไว้พร้อมกับพ่อแม่ของพวกเขา

  • IntersectAsync(part : Instance,parts : Array,options : Dictionary):Array
    ผลตอบแทน

    สร้างหนึ่งหรือมากกว่า PartOperations จากเรขาคณิตที่ซ้อนทับกันของส่วนหนึ่งและส่วนอื่น

  • SubtractAsync(part : Instance,parts : Array,options : Dictionary):Array
    ผลตอบแทน

    สร้างหนึ่งหรือมากกว่า PartOperations จากส่วนหนึ่งลบภูมิทัศน์ที่ใช้โดยส่วนอื่น

  • UnionAsync(part : Instance,parts : Array,options : Dictionary):Array
    ผลตอบแทน

    สร้างหนึ่งหรือมากกว่า PartOperations จากส่วนหนึ่งบวกกับรูปทรงที่ถูกใช้โดยส่วนอื่น

คุณสมบัติ

วิธีการ

CalculateConstraintsToPreserve

คืนตารางของ Constraints และ Attachments ซึ่งคุณอาจเลือกที่จะเก็บไว้พร้อมกับพ่อแม่ของพวกเขาการตรวจสอบซ้ำบนตารางนี้ทำให้คุณสามารถตัดสินใจได้ว่าจะส่งการแก้ไขข้อจำกัดและสิ่งที่แนบมาที่พ่อแม่แต่ละคนหรือไม่

โปรดทราบว่าสารานุกรม options กำลังติดตาม:

  • tolerance — ความอดทนระยะทาง เกี่ยวกับการเก็บรักษา Attachment ระหว่างแนบเนียนและจุดที่ใกล้ที่สุดบนพื้นผิวของชิ้นต้นกับจุดที่ใกล้ที่สุดบนพื้นผิวของชิ้นที่ได้รับ ผลหากระยะทางที่ได้รับหลังการดำเนินการโมเดลแข็งมากกว่ามูลค่านี้ ค่า Parent ของสิ่งที่แนบมาและข้อจำกัดที่เกี่ยวข้องจะเป็น nil ในตารางแนะนำที่ส่งคืน
  • weldConstraintPreserve — A Enum.WeldConstraintPreserve ค่าเอนทิตีที่อธิบายวิธีการที่ WeldConstraints จะได้รับการเก็บรักษาในตารางคำแนะนำที่ได้รับในที่สุด
  • dropAttachmentsWithoutConstraints — Boolean ด้วยค่าเริ่มต้นของ true หากตั้งค่าเป็น false จะเก็บไว้ Attachments ที่ไม่มี Constraints จะได้รับการเก็บรักษา

พารามิเตอร์

source: Instance

วัตถุเดิมที่การดำเนินการโมเดลแข็งถูกดำเนินการบน, ตัวอย่างเช่น part ใน UnionAsync() .

ค่าเริ่มต้น: ""
destination: Array
ค่าเริ่มต้น: ""
options: Dictionary

สารานุกรมตัวเลือกสำหรับวิธี:

  • tolerance — ความอดทนระยะทาง เกี่ยวกับการเก็บรักษา Attachment ระหว่างแนบเนียนและจุดที่ใกล้ที่สุดบนพื้นผิวของชิ้นต้นกับจุดที่ใกล้ที่สุดบนพื้นผิวของชิ้นที่ได้รับ ผลหากระยะทางที่ได้รับหลังการดำเนินการโมเดลแข็งมากกว่ามูลค่านี้ ค่า Parent ของสิ่งที่แนบมาและข้อจำกัดที่เกี่ยวข้องจะเป็น nil ในตารางแนะนำที่ส่งคืน
  • weldConstraintPreserve — A Enum.WeldConstraintPreserve ค่าเอนทิตีที่อธิบายวิธีการที่ WeldConstraints จะได้รับการเก็บรักษาในตารางคำแนะนำที่ได้รับในที่สุด
  • dropAttachmentsWithoutConstraints — Boolean ด้วยค่าเริ่มต้นของ true หากตั้งค่าเป็น false จะเก็บไว้ Attachments ที่ไม่มี Constraints จะได้รับการเก็บรักษา
ค่าเริ่มต้น: "nil"

ส่งค่ากลับ

ตารางที่มีข้อมูลสำหรับกรณีทั่วไป Constraints , NoCollisionConstraints , และ WeldConstraints .ในกรณีที่ Attachment หรือ Constraint ควรถูกทิ้ง พ่อแม่ที่เกี่ยวข้องจะเป็น nil

สำหรับกรณีทั่วไป Constraints เช่น HingeConstraint :


<th>ประเภท</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>แนบ</code></td>
<td><code>คลาส.Attachment</code></td>
</tr>
<tr>
<td><code>ข้อจํากัด</code></td>
<td><code>คลาส.Constraint</code> หรือ <code>nil</code></td>
</tr>
<tr>
<td><code>แอตทาชเชนพาเรนท์</code></td>
<td><code>คลาส.BasePart</code> หรือ <code>nil</code></td>
</tr>
<tr>
<td><code>ข้อจำกัดพ่อพันธุ์</code></td>
<td><code>คลาส.BasePart</code> หรือ <code>nil</code></td>
</tr>
</tbody>
กุญแจ

สำหรับ WeldConstraints :


<th>ประเภท</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ข้อจำกัดการเชื่อมต่อ</code></td>
<td><code>คลาส.WeldConstraint</code></td>
</tr>
<tr>
<td><code>ข้อจํากัดการเชื่อมต่อพ่อพันธุ์</code></td>
<td><code>คลาส.BasePart</code> หรือ <code>nil</code></td>
</tr>
<tr>
<td><code>ส่วนข้อจํากัดการเชื่อมต่อ000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</code></td>
<td><code>คลาส.BasePart</code></td>
</tr>
<tr>
<td><code>ส่วนข้อจํากัดการเชื่อมต่อ1ส่วน1</code></td>
<td><code>คลาส.BasePart</code></td>
</tr>
</tbody>
กุญแจ

สำหรับ NoCollisionConstraints :


<th>ประเภท</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>ข้อจํากัดการชนกันไม่มี</code></td>
<td><code>คลาส.NoCollisionConstraint</code></td>
</tr>
<tr>
<td><code>ไม่มีข้อจํากัดความชนกันพ่อ</code></td>
<td><code>คลาส.BasePart</code> หรือ <code>nil</code></td>
</tr>
<tr>
<td><code>ส่วนควบขัดขัดไม่มี0</code></td>
<td><code>คลาส.BasePart</code></td>
</tr>
<tr>
<td><code>ไม่มีส่วนควบขัดขัดกัน1</code></td>
<td><code>คลาส.BasePart</code></td>
</tr>
</tbody>
กุญแจ

ตัวอย่างโค้ด

The following example shows how to preserve Attachments and Constraints based on a recommended table produced by CalculateConstraintsToPreserve().

Preserve Constraints

local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.PurpleBlock
local otherParts = { workspace.BlueBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
local constraintOptions = {
tolerance = 0.1,
weldConstraintPreserve = Enum.WeldConstraintPreserve.All,
dropAttachmentsWithoutConstraints = false,
}
-- Perform subtract operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:SubtractAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Calculate constraints/attachments to either preserve or drop
local recommendedTable = GeometryService:CalculateConstraintsToPreserve(mainPart, newParts, constraintOptions)
-- Preserve constraints/attachments based on recommended table
for _, item in pairs(recommendedTable) do
if item.Attachment then
item.Attachment.Parent = item.AttachmentParent
if item.Constraint then
item.Constraint.Parent = item.ConstraintParent
end
elseif item.NoCollisionConstraint then
local newNoCollision = Instance.new("NoCollisionConstraint")
newNoCollision.Part0 = item.NoCollisionPart0
newNoCollision.Part1 = item.NoCollisionPart1
newNoCollision.Parent = item.NoCollisionParent
elseif item.WeldConstraint then
local newWeldConstraint = Instance.new("WeldConstraint")
newWeldConstraint.Part0 = item.WeldConstraintPart0
newWeldConstraint.Part1 = item.WeldConstraintPart1
newWeldConstraint.Parent = item.WeldConstraintParent
end
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end

IntersectAsync

ผลตอบแทน

สร้างหนึ่งหรือมากกว่า PartOperations จากเรขาคณิตที่ซ้อนทับกันของส่วนหลักและส่วนอื่นๆ ในช่วงที่กำหนดสนับสนุนเฉพาะพื้นฐาน Parts และ PartOperations เท่านั้น ไม่ใช่ Terrain หรือ MeshPartsคล้ายกับ Clone() ชิ้นส่วนที่ส่งคืนไม่มีตั้งค่า Parent

คุณสมบัติต่อไปนี้จากส่วนหลัก ( part ) ถูกนำไปใช้กับผลลัพธ์ PartOperations :

ในการเปรียบเทียบภาพต่อไปนี้ IntersectAsync() จะเรียกโดยใช้บล็อกสีม่วงและอาร์เรย์ที่มีบล็อกสีฟ้าผลลัพธ์ PartOperation จะแยกออกเป็นรูปร่างของภูมิภาคที่ซ้อนทับกันของทั้งสองส่วน

Two block parts overlapping

<figcaption>ชิ้นส่วนแยก</figcaption>
Parts intersected into a new solid model

<figcaption>ผลลัพธ์ <code>Class.PartOperation</code></figcaption>

บันทึก

  • เมื่อเทียบกับ BasePart:IntersectAsync() วิธีนี้แตกต่างกันดังนี้:

    • ส่วนป้อนข้อมูลไม่จำเป็นต้องเป็นพ่อของฉาก ช่วยให้สามารถดำเนินการด้านหลังได้
    • เมื่อตัวเลือก SplitApart ถูกตั้งค่าเป็น true (เริ่มต้น) แต่ละร่างกายจะถูกส่งคืนใน PartOperation ของตัวเอง
    • แต่ละส่วนที่กลับมาอยู่ในพื้นที่พิกัดของส่วนหลักซึ่งหมายความว่า (0, 0, 0) ของส่วนที่กลับมาใดๆ ไม่จำเป็นต้องอยู่ในศูนย์กลางของร่างกาย
    • เป็นไปได้ที่จะเรียกวิธีนี้บนไคลเอนต์ แต่มีข้อจำกัดบางอย่างก่อนอื่น ต้องทำกับวัตถุ ที่สร้างขึ้น บนไคลเอนต์ประการที่สอง ไม่มีการสําเนาที่มีอยู่จากไคลเอนต์ไปยังเซิร์ฟเวอร์
  • ชิ้นส่วนเดิมยังคงอยู่อย่างสมบูรณ์หลังจากการดำเนินการที่ประสบความสำเร็จในกรณีส่วนใหญ่คุณควรเป็นพ่อของการคืน PartOperations ไปยังสถานที่เดียวกับส่วนหลักจากนั้น Destroy() ทั้งหมดของส่วนต้นฉบับ

  • โดยค่าสีใบหน้าของผลลัพธ์ PartOperations จะถูกยืมมาจากคุณสมบัติ Color ของชิ้นส่วนเดิมแม้ว่าคุณจะสามารถเปิดใช้งานคุณสมบัติ UsePartColor ของพวกเขาเพื่อเปลี่ยนเป็นสีเฉพาะได้

  • หากการดำเนินการบรรจบจะทำให้เกิด PartOperations มากกว่า 20,000 เหลี่ยม พวกเขาจะถูกเรียบเรียงให้เหลือเพียง 20,000จะทำให้เกิดข้อผิดพลาดด้วยรหัส -14

  • หากส่วนหลักเคลื่อนที่ระหว่างการคำนวณการดำเนินการคุณสามารถตั้งค่าส่วนที่ได้รับเป็นส่วนที่อัปเดต CFrame ของส่วนหลักเนื่องจากส่วนที่ส่งคืนอยู่ในพื้นที่สัมพันธ์เดียวกับส่วนหลัก

  • หากใช้วิธีนี้ด้วย PartOperation เป็นส่วนหลักคุณสามารถแทนที่รูปร่างของอีก PartOperation ผ่าน SubstituteGeometry() ทำให้ง่ายต่อการใช้รูปร่างของการดำเนินการ แต่ยังคงรักษาคุณสมบัติ คุณลักษณะ แท็ก และลูกหลานของส่วนหลักเช่น Attachments , Constraints , ParticleEmitters , วัตถุเบา และภาพวาดวิธีนี้ยังหลีกเลี่ยง "flicker" ที่อาจเกิดขึ้นจากการแทนที่ทั้งหมดด้วยต้นฉบับ PartOperation ด้วยอื่นอีกด้วย

พารามิเตอร์

part: Instance

หลัก Part หรือ PartOperation เพื่อดำเนินการ

ค่าเริ่มต้น: ""
parts: Array

คลัสของชิ้นส่วนที่จะซ้อนทับกับส่วนหลัก

ค่าเริ่มต้น: ""
options: Dictionary

ตารางตัวเลือกที่มีการควบคุมทั้งหมดสำหรับวิธี:

  • CollisionFidelity — ค่าของ CollisionFidelity ในชิ้นส่วนที่ได้รับ
  • RenderFidelity — ค่าของ RenderFidelity ในชิ้นส่วนที่ได้รับ
  • FluidFidelity — ค่าของ FluidFidelity ในชิ้นส่วนที่ได้รับ
  • SplitApart — การควบคุมบูลีเนียนว่าวัตถุทั้งหมดควรจะถูกเก็บไว้ด้วยกันหรือแยกออกจากกันอย่างถูกต้อง ค่าเริ่มต้นคือ true (แยก)
ค่าเริ่มต้น: "nil"

ส่งค่ากลับ

หนึ่งหรือมากกว่า PartOperations จากเรขาคณิตที่ซ้อนทับของส่วนหลัก ( part ) และส่วนอื่น

ตัวอย่างโค้ด

This example intersects the geometry of mainPart and the parts in the otherParts array, splitting them into distinct PartOperations. Then it destroys the original parts involved in the operation.

GeometryService:IntersectAsync()

local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.PurpleBlock
local otherParts = { workspace.BlueBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
-- Perform intersect operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:IntersectAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end

SubtractAsync

ผลตอบแทน

สร้างหนึ่งหรือมากกว่า PartOperations จากส่วนหลักลบภูมิทัศน์ที่ใช้โดยส่วนอื่นๆ ในช่วงที่ให้ไว้สนับสนุนเฉพาะพื้นฐาน Parts และ PartOperations เท่านั้น ไม่ใช่ Terrain หรือ MeshPartsคล้ายกับ Clone() ชิ้นส่วนที่ส่งคืนไม่มีตั้งค่า Parent

คุณสมบัติต่อไปนี้จากส่วนหลัก ( part ) ถูกนำไปใช้กับผลลัพธ์ PartOperations :

ในการเปรียบเทียบภาพต่อไปนี้ SubtractAsync() จะเรียกโดยใช้ทรงกระบอกสีฟ้าและอาร์เรย์ที่มีบล็อกสีม่วงผลลัพธ์ PartOperation จะแปลงเป็นรูปที่ลบเอกลักษณ์ของบล็อกจากทรงกระบอก

Longer block overlapping a cylinder

<figcaption>ชิ้นส่วนแยก</figcaption>
Block part subtracted from cylinder

<figcaption>ผลลัพธ์ <code>Class.PartOperation</code></figcaption>

บันทึก

  • เมื่อเทียบกับ BasePart:SubtractAsync() วิธีนี้แตกต่างกันดังนี้:

    • ส่วนป้อนข้อมูลไม่จำเป็นต้องเป็นพ่อของฉาก ช่วยให้สามารถดำเนินการด้านหลังได้
    • เมื่อตัวเลือก SplitApart ถูกตั้งค่าเป็น true (เริ่มต้น) แต่ละร่างกายจะถูกส่งคืนใน PartOperation ของตัวเอง
    • แต่ละส่วนที่กลับมาอยู่ในพื้นที่พิกัดของส่วนหลักซึ่งหมายความว่า (0, 0, 0) ของส่วนที่กลับมาใดๆ ไม่จำเป็นต้องอยู่ในศูนย์กลางของร่างกาย
    • เป็นไปได้ที่จะเรียกวิธีนี้บนไคลเอนต์ แต่มีข้อจำกัดบางอย่างก่อนอื่น ต้องทำกับวัตถุ ที่สร้างขึ้น บนไคลเอนต์ประการที่สอง ไม่มีการสําเนาที่มีอยู่จากไคลเอนต์ไปยังเซิร์ฟเวอร์
  • ชิ้นส่วนเดิมยังคงอยู่อย่างสมบูรณ์หลังจากการดำเนินการที่ประสบความสำเร็จในกรณีส่วนใหญ่คุณควรเป็นพ่อของการคืน PartOperations ไปยังสถานที่เดียวกับส่วนหลักจากนั้น Destroy() ทั้งหมดของส่วนต้นฉบับ

  • โดยค่าสีใบหน้าของผลลัพธ์ PartOperations จะถูกยืมมาจากคุณสมบัติ Color ของชิ้นส่วนเดิมแม้ว่าคุณจะสามารถเปิดใช้งานคุณสมบัติ UsePartColor ของพวกเขาเพื่อเปลี่ยนเป็นสีเฉพาะได้

  • หากการหักลบจะทำให้ได้ผลลัพธ์ใด ๆ PartOperations ที่มีมากกว่า 20,000 เหลี่ยม พวกเขาจะถูกเรียบเรียงให้เหลือเพียง 20,000จะทำให้เกิดข้อผิดพลาดด้วยรหัส -14

  • หากส่วนหลักเคลื่อนที่ระหว่างการคำนวณการดำเนินการคุณสามารถตั้งค่าส่วนที่ได้รับเป็นส่วนที่อัปเดต CFrame ของส่วนหลักเนื่องจากส่วนที่ส่งคืนอยู่ในพื้นที่สัมพันธ์เดียวกับส่วนหลัก

  • หากใช้วิธีนี้ด้วย PartOperation เป็นส่วนหลักคุณสามารถแทนที่รูปร่างของอีก PartOperation ผ่าน SubstituteGeometry() ทำให้ง่ายต่อการใช้รูปร่างของการดำเนินการ แต่ยังคงรักษาคุณสมบัติ คุณลักษณะ แท็ก และลูกหลานของส่วนหลักเช่น Attachments , Constraints , ParticleEmitters , วัตถุเบา และภาพวาดวิธีนี้ยังหลีกเลี่ยง "flicker" ที่อาจเกิดขึ้นจากการแทนที่ทั้งหมดด้วยต้นฉบับ PartOperation ด้วยอื่นอีกด้วย

พารามิเตอร์

part: Instance

หลัก Part หรือ PartOperation เพื่อดำเนินการ

ค่าเริ่มต้น: ""
parts: Array

รายการส่วนที่จะหักออกจากส่วนหลัก

ค่าเริ่มต้น: ""
options: Dictionary

ตารางตัวเลือกที่มีการควบคุมทั้งหมดสำหรับวิธี:

  • CollisionFidelity — ค่าของ CollisionFidelity ในชิ้นส่วนที่ได้รับ
  • RenderFidelity — ค่าของ RenderFidelity ในชิ้นส่วนที่ได้รับ
  • FluidFidelity — ค่าของ FluidFidelity ในชิ้นส่วนที่ได้รับ
  • SplitApart — การควบคุมบูลีเนียนว่าวัตถุทั้งหมดควรจะถูกเก็บไว้ด้วยกันหรือแยกออกจากกันอย่างถูกต้อง ค่าเริ่มต้นคือ true (แยก)
ค่าเริ่มต้น: "nil"

ส่งค่ากลับ

หนึ่งหรือมากกว่า PartOperations จากรูปทรงของส่วนหลัก ( part ) ลบรูปทรงที่ถูกใช้โดยส่วนอื่น

ตัวอย่างโค้ด

This example subtracts the geometry of the parts in the otherParts array from mainPart, splitting the results into distinct PartOperations. Then it destroys the original parts involved in the operation.

GeometryService:SubtractAsync()

local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.BlueCylinder
local otherParts = { workspace.PurpleBlock }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = true,
}
-- Perform subtract operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:SubtractAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end

UnionAsync

ผลตอบแทน

สร้างหนึ่งหรือมากกว่า PartOperations จากส่วนหลักบวกกับรูปทรงที่ถูกใช้โดยส่วนอื่นๆ ในช่องที่กำหนดสนับสนุนเฉพาะพื้นฐาน Parts และ PartOperations เท่านั้น ไม่ใช่ Terrain หรือ MeshPartsคล้ายกับ Clone() ชิ้นส่วนที่ส่งคืนไม่มีตั้งค่า Parent

คุณสมบัติต่อไปนี้จากส่วนหลัก ( part ) ถูกนำไปใช้กับผลลัพธ์ PartOperations :

ในการเปรียบเทียบภาพต่อไปนี้ UnionAsync() จะเรียกโดยใช้บล็อกสีฟ้าและอาร์เรย์ที่มีทรงกระบอกสีม่วงผลลัพธ์ PartOperation จะแยกออกเป็นรูปร่างของภูมิทัศน์รวมของทั้งสองส่วน

Block and cylinder parts overlapping

<figcaption>ชิ้นส่วนแยก</figcaption>
Parts joined together into a single solid union

<figcaption>ผลลัพธ์ <code>Class.PartOperation</code></figcaption>

บันทึก

  • เมื่อเทียบกับ BasePart:UnionAsync() วิธีนี้แตกต่างกันดังนี้:

    • ส่วนป้อนข้อมูลไม่จำเป็นต้องเป็นพ่อของฉาก ช่วยให้สามารถดำเนินการด้านหลังได้
    • เมื่อตัวเลือก SplitApart ถูกตั้งค่าเป็น true (เริ่มต้น) แต่ละร่างกายจะถูกส่งคืนใน PartOperation ของตัวเอง
    • แต่ละส่วนที่กลับมาอยู่ในพื้นที่พิกัดของส่วนหลักซึ่งหมายความว่า (0, 0, 0) ของส่วนที่กลับมาใดๆ ไม่จำเป็นต้องอยู่ในศูนย์กลางของร่างกาย
    • เป็นไปได้ที่จะเรียกวิธีนี้บนไคลเอนต์ แต่มีข้อจำกัดบางอย่างก่อนอื่น ต้องทำกับวัตถุ ที่สร้างขึ้น บนไคลเอนต์ประการที่สอง ไม่มีการสําเนาที่มีอยู่จากไคลเอนต์ไปยังเซิร์ฟเวอร์
  • ชิ้นส่วนเดิมยังคงอยู่อย่างสมบูรณ์หลังจากการดำเนินการที่ประสบความสำเร็จในกรณีส่วนใหญ่คุณควรเป็นพ่อของการคืน PartOperations ไปยังสถานที่เดียวกับส่วนหลักจากนั้น Destroy() ทั้งหมดของส่วนต้นฉบับ

  • โดยค่าเริ่มต้นสีของผลลัพธ์ PartOperations จะยืมมาจากคุณสมบัติ Color ของชิ้นส่วนเดิมแม้ว่าคุณจะสามารถเปิดใช้งานคุณสมบัติ UsePartColor ของพวกเขาเพื่อเปลี่ยนเป็นสีเฉพาะได้

  • หากการดำเนินการสหภาพจะทำให้เกิด PartOperations ที่มีมากกว่า 20,000 เหลี่ยม พวกเขาจะถูกเรียบเรียงให้เหลือเพียง 20,000จะทำให้เกิดข้อผิดพลาดด้วยรหัส -14

  • หากส่วนหลักเคลื่อนที่ระหว่างการคำนวณการดำเนินการคุณสามารถตั้งค่าส่วนที่ได้รับเป็นส่วนที่อัปเดต CFrame ของส่วนหลักเนื่องจากส่วนที่ส่งคืนอยู่ในพื้นที่สัมพันธ์เดียวกับส่วนหลัก

  • หากใช้วิธีนี้ด้วย PartOperation เป็นส่วนหลักคุณสามารถแทนที่รูปร่างของอีก PartOperation ผ่าน SubstituteGeometry() ทำให้ง่ายต่อการใช้รูปร่างของการดำเนินการ แต่ยังคงรักษาคุณสมบัติ คุณลักษณะ แท็ก และลูกหลานของส่วนหลักเช่น Attachments , Constraints , ParticleEmitters , วัตถุเบา และภาพวาดวิธีนี้ยังหลีกเลี่ยง "flicker" ที่อาจเกิดขึ้นจากการแทนที่ทั้งหมดด้วยต้นฉบับ PartOperation ด้วยอื่นอีกด้วย

พารามิเตอร์

part: Instance

หลัก Part หรือ PartOperation เพื่อดำเนินการ

ค่าเริ่มต้น: ""
parts: Array

รายการส่วนที่จะรวมกับส่วนหลัก

ค่าเริ่มต้น: ""
options: Dictionary

ตารางตัวเลือกที่มีการควบคุมทั้งหมดสำหรับวิธี:

  • CollisionFidelity — ค่าของ CollisionFidelity ในชิ้นส่วนที่ได้รับ
  • RenderFidelity — ค่าของ RenderFidelity ในชิ้นส่วนที่ได้รับ
  • FluidFidelity — ค่าของ FluidFidelity ในชิ้นส่วนที่ได้รับ
  • SplitApart — การควบคุมบูลีเนียนว่าวัตถุทั้งหมดควรจะถูกเก็บไว้ด้วยกันหรือแยกออกจากกันอย่างถูกต้อง ค่าเริ่มต้นคือ true (แยก)
ค่าเริ่มต้น: "nil"

ส่งค่ากลับ

หนึ่งหรือมากกว่า PartOperations จากรูปทรงของส่วนหลัก ( part ) บวกกับรูปทรงที่ถูกใช้โดยส่วนอื่น

ตัวอย่างโค้ด

This example combines the geometry of mainPart and the parts in the otherParts array, then it destroys the original parts involved in the operation.

GeometryService:UnionAsync()

local GeometryService = game:GetService("GeometryService")
local mainPart = workspace.BlueBlock
local otherParts = { workspace.PurpleCylinder }
local options = {
CollisionFidelity = Enum.CollisionFidelity.Default,
RenderFidelity = Enum.RenderFidelity.Automatic,
SplitApart = false,
}
-- Perform union operation in pcall() since it's asyncronous
local success, newParts = pcall(function()
return GeometryService:UnionAsync(mainPart, otherParts, options)
end)
if success and newParts then
-- Loop through resulting parts to reparent/reposition
for _, newPart in pairs(newParts) do
newPart.Parent = mainPart.Parent
newPart.CFrame = mainPart.CFrame
newPart.Anchored = mainPart.Anchored
end
-- Destroy original parts
mainPart.Parent = nil
mainPart:Destroy()
for _, otherPart in pairs(otherParts) do
otherPart.Parent = nil
otherPart:Destroy()
end
end

อีเวนต์