ความสามารถ

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

เมื่อสองวัตถุ 3D มีการสัมผัสกันภายในโลก 3D สำหรับการจัดการการชนกันที่ปรับแต่งได้ BasePart มีชุดของ เหตุการณ์การชน และ การกรองการชน เทคนิ

เหตุการณ์ความร่วมมือ

เหตุการณ์ชน เกิดขึ้นเมื่อ สอง BaseParts สัมผัสหรือหยุดสัมผัสในโลก 3D คุณสามา

  • สมบัติของ CanTouch ระบุว่ามันจะเรียกเหตุการชนหรือไม่ หากตั้งค่าเป็น false ไม่มี Touched หรือ 1> Class.BasePart.TouchEnded|TouchEnded</
  • คุณสมบัติของ CanCollide ของชิ้นส่วนจะส่งผลกับว่ามันจะ กระแทก กับอื่น ๆ
  • เหตุการณ์ Touched และ TouchEnded เฉพาะกับการเคลื่อนไหวทางกายภาพเท่านั้น ไม่ใช่จากการเปลี
  • คลาสระดับสูงสุด Terrain มีมาจาก BasePart ดังนั้นคุณจึงสามารถกำหนดคลาส กลุ่มความสามัคคี ให้กับ 1> Class.Terrain1>

แตะ

เหตุการณ์ Touched เกิดขึ้นเมื่อ BasePart มาในติดต่อกับอื่น หรือกับ voxel

รูปแบบโค้ดต่อไปนี้แสดงให้เห็นวิธีการที่ Touched เหตุการณ์สามารถเชื่อมต่อกับฟังก์ชันที่กําหนดเอง onTouched() โดยมี otherPart อาร์กิวเมน

ความสามารถที่สลับซับซ้อน

local part = workspace.Part
local function onTouched(otherPart)
print(part.Name .. " collided with " .. otherPart.Name)
end
part.Touched:Connect(onTouched)

หมายเหตุว่ากิจกรรม Touched สามารถเกิดขึ้นได้หลายครั้งในความสำเร็จอย่างรวดเร็วตามควา

ความสามารถที่เกี่ยวข้องกับการระเบิด

local part = workspace.Part
local COOLDOWN_TIME = 1
local function onTouched(otherPart)
if not part:GetAttribute("Touched") then
print(part.Name .. " collided with " .. otherPart.Name)
part:SetAttribute("Touched", true) -- ตั้งค่าค่าตัวละครเป็น true
task.wait(COOLDOWN_TIME) -- รอระยะเวลาการโคลดาวน์
part:SetAttribute("Touched", false) -- รีเซ็ตค่าตัวละคร
end
end
part.Touched:Connect(onTouched)

สิ้นสุดแล้ว

เหตุการณ์ TouchEnded เกิดขึ้นเมื่อขีดจำกัดการชนกันท

รูปแบบโค้ดต่อไปนี้แสดงให้เห็นวิธีการที่ TouchEnded อีเมตติกสามารถเชื่อมต่อกับฟังก์ชันที่กําหนดเอง onTouchEnded() เช่น

การตรวจจับการชนกัน

local part = workspace.Part
local function onTouchEnded(otherPart)
print(part.Name .. " is no longer touching " .. otherPart.Name)
end
part.TouchEnded:Connect(onTouchEnded)

การตรวจจับการชน

ความสามารถในการชน กรอง กำหนดว่าชิ้นส่วนใดจะชนกับผู้อื่น คุณสามารถกำหนดความสามารถในการชนสำหรับจำนวนมากของวัตถุผ่าน กลุ่มการชน หรือคุณสามา

กลุ่มความสามัคคี

ความสามารถในการชนกัน กลุ่ม ช่วยให้คุณสามารถกำหนดได้ว่า BaseParts จะสลับกับผู้อื่นในกลุ่มอื่นหรือไม่ ผู้ในกลุ่มที่

ในวิดีโอด้านบนสิ่งที่หมุนอยู่ในกลุ่มชนิดของการชนกันที่แตกต่างกันเช่นว่าพวกเขาจะชนกับวัตถุของสีอื่น แต่ไม่ใช่วัตถุของพวกเขาเอง

คุณสามารถตั้งค่ากลุ่มความสามัคคีได้โดยง่ายผ่าน เครื่องมือจัดกลุ่มความสามัคคีผ่าน Studio ของคุณ โดยการคลิกที่ปุ่ม กลุ่มความสามัคคี ในแท็บ แบบ โดยคุณสามารถเข้าถึงได้โดย

Collision Groups tool indicated in Model tab of Studio

เฟิร์นิเจอร์เวิร์ดทำงานใน either มุมมองรายการ ซึ่งชื่นชอบ ท่าเรือ ไปทางซ้ายหรือขวาของ Studio หรือใน Table ที่กว้างขวาง ที่นั่ง ซึ่งชื่นชอบท่าเรือไปด้านบนหรือด้านล่าง

List View example in Collision Groups Editor

การลงทะเบียนกลุ่ม

เวิร์ดเพรสรวมถึงกลุ่มความสามารถ ความสามารถปกติ หนึ่งซึ่งไม่สามารถเปลี่ยนชื่อหรือลบได้ ทั้งหมด BaseParts อยู่ในกลุ่มความสามารถเริ่มต้นโดยอัตโนมัต

เพื่อสร้างกลุ่มความสามัคคีใหม่:

  1. คลิกปุ่ม เพิ่มกลุ่ม ที่ด้านบนของแผงเรียบร้อย, ใส่ชื่อกลุ่มใหม่, และกด Enter กลุ่มใหม่ปรากฏในทั้งสองคอลัมน์ของรายการ, หรือในทั้งสองคอลัมน์และแถวบนของตาราง

    New group added to Collision Groups Editor in List View
  2. ทำซ้ำขั้นตอนนี้หากจำเป็นต้องเลือกชื่อที่มีความหมายสำหรับแต่ละกลุ่ม หมายเหตุว่าคุณสามารถเปลี่ยนชื่อกลุ่มได้ในระหว่างการพัฒนาโดยการคลิกในส่วนของมันหรือโดยการเลือกมันและคลิกปุ่

    Button and field indicated for renaming a group in the Collision Groups Editor

การกำหนดความสามัคคีของกลุ่ม

ตามค่าเริ่มต้นการกระทะกันของวัตถุในกลุ่มทั้งหมดจะชนกัน เพื่อป้องกันวัตถุในกลุ่มหนึ่งจากการชนกันกับวัตถุในกลุ่มอื่น เช็ค กล่องในแถว/คอลัมที่เกี่ยวข้อง

ในตัวอย่างต่อไปนี้, วัตถุในกลุ่ม ลูกบาศก์ จะ ไม่ ชนกับวัตถุในกลุ่ม ประตู

Group configured in List View of Collision Groups Editor

การเรียงลำดับวัตถุให้กลุ่ม

เพื่อการเรียกตัวแปรที่มีอยู่ให้กลุ่มที่คุณได้ลงทะเบียนผ่าน Studio editor:

  1. เลือกหนึ่งหรือมากกว่า BaseParts ที่มีคุณสมบัติเป็นส่วนหนึ่งของกลุ่มความสามัคคี

  2. กำหนดให้พวกเขาอยู่ในกลุ่มโดยการคลิกปุ่ม สำหรับรายการของมัน โอเบ็กต์สามารถเป็นของกลุ่มเดียวกันได้เท่านั้นในแต่ละครั้งดังนั้นจึงวางพวกเขาในกลุ่มใหม่จะนำพวกเขาออกจากกลุ่ม

    Plus button indicated in Collision Groups Editor for adding selected parts to a group

เมื่อได้รับการกำหนด กลุ่มใหม่จะปรากฏใต้สมบัติของวัตถุ CollisionGroup

Chosen collision group indicated as the part's CollisionGroup property

G Collision StudioSelectable

เครื่องมือใน Studio ใช้ระบบการกรองความสามัคคีเพื่อกำหนดว่าไอเท็มใดที่เป็นตัวเลือกสำหรับการคลิกใน 3D วิวพอร์ต์ ไอเท็มที่มีกลุ่มความสามัคคีที่กำหนดจะไม่ถูกระบุ

เช่น หากคุณมีด่านตรวจในประสบการณ์การแข่งขันซึ่งมีพื้นที่ที่มีประสิทธิภาพถูกกำหนดโดยชิ้นส่วนโปร่งใสขนาดใหญ่, คุณสามารถกำหนดให้พวกเขาไปที่กลุ่ม Checkpoints

Checkpoints group configured to be non-collidable with StudioSelectable group

สำหรับรหัสของปลั๊กอิน ขอแนะนำให้คุณกำหนด "StudioSelectable" ให้เป็นตัวกรองกลุ่มความสามัคคีของ RaycastParams เมื่อค้นหาชิ้นส่วนใต้ตัวเลือกเมื่อคุณใช้เครื่องมือใน

การเลือกปลั๊อกอินที่แนะนำ Raycast

local UserInputService = game:GetService("UserInputService")
local raycastParams = RaycastParams.new()
raycastParams.CollisionGroup = "StudioSelectable" -- เพื่อปฏิบัติตามคำแนะนำ
raycastParams.BruteForceAllSlow = true -- เพื่อให้ส่วนที่มี CanQuery ของ "เท็ม" สามารถเลือกได้
local mouseLocation = UserInputService:GetMouseLocation()
local mouseRay = workspace.CurrentCamera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y)
local filteredSelectionHit = workspace:Raycast(mouseRay.Origin, mouseRay.Direction * 10000, raycastParams)

การกรองของชิ้นส่วน

เพื่อป้องกันการชนกันระหว่างสองส่วนที่มีการตั้งค่า กลุ่มการชน ไม่ได้ เช่น ระหว่างล้อของรถและชั้นของมัน พิจารณาข้อจํากัด ไม่มีการชน ด้านล่าง ข้อดีของมันคือ:

  • ไม่ต้องการกลุ่มความสามัคคีและ/หรือสคริปต์การกำหนดค่า ดังนั้นคุณจึงสามารถสร้างและแบ่งปันโมเดลด้วยการกรองความสามัคคีที่ปรับแต่งได้
  • ชิ้นส่วนที่เชื่อมต่อกันจะไม่ชนกัน แต่พวกเขายังคงสามารถชนกับวัตถุอื่นได้

การปิดการโคลลิชันตัวละคร

ตัวละครผู้เล่น Roblox มีการโต้ตีกันโดยปกติ นี่อาจนำไปสู่การเล่นเกมที่ไม่ได้ตั้งใจ เช่น ตัวละครกระโดดขึ้นกันเพื่อไปยังพื้นที่เฉพาะ หากพฤติกรรมนี้ไม่พึ

สคริปต์ - ปิดการโคลลิชันตัวละคร

local PhysicsService = game:GetService("PhysicsService")
local Players = game:GetService("Players")
PhysicsService:RegisterCollisionGroup("Characters")
PhysicsService:CollisionGroupSetCollidable("Characters", "Characters", false)
local function onDescendantAdded(descendant)
-- ตั้งกลุ่มความสามัคคีสำหรับลูกหลานของทุกส่วน
if descendant:IsA("BasePart") then
descendant.CollisionGroup = "Characters"
end
end
local function onCharacterAdded(character)
-- ประมวลผลตัวลูกหลานที่มีอยู่และใหม่สำหรับการตั้งค่าฟิสิกส์
for _, descendant in character:GetDescendants() do
onDescendantAdded(descendant)
end
character.DescendantAdded:Connect(onDescendantAdded)
end
Players.PlayerAdded:Connect(function(player)
-- ตรวจสอบเมื่อตัวละครของผู้เล่นถูกเพิ่ม
player.CharacterAdded:Connect(onCharacterAdded)
end)

โคลิชันรุ่น

Model วัตถุเป็นคอนเทนเนอร์สำหรับชิ้นส่วนโดยไม่ต้องมีต้นฉบับจาก

ตัวอย่างรหัสต่อไปนี้เชื่อมต่อทั้งหมด BaseParts ของโมเดลหลายส่วนเข้ากับเหตุการณ์ความสามัคคีและติดตามจำนวนเงินความสามัคคีทั้งหมดกับอื่น ๆ

โคลิชันรุ่น

local model = script.Parent
local numTouchingParts = 0
local function onTouched(otherPart)
-- ใช้เวลาในการเรียกใช้ของแต่ละรุ่น
if otherPart:IsDescendantOf(model) then return end
-- เพิ่มจำนวนชิ้นส่วนที่สัมผัส
numTouchingParts += 1
print(model.Name, "intersected with", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
local function onTouchEnded(otherPart)
-- เพิกเฉยต่อตัวอย่างของโมเดลที่ไม่เกี่ยวข้องกับตัวเอง
if otherPart:IsDescendantOf(model) then return end
-- ลดจำนวนชิ้นส่วนที่สัมผัส
numTouchingParts -= 1
print(model.Name, "un-intersected from", otherPart.Name, "| Model parts touching:", numTouchingParts)
end
for _, child in model:GetChildren() do
if child:IsA("BasePart") then
child.Touched:Connect(onTouched)
child.TouchEnded:Connect(onTouchEnded)
end
end

ความสามารถระหว่าง Mesh และ Solid Model ความสามารถระหว่าง Mesh และ Solid Model

MeshPart และ PartOperation (ของชิ้นส่วนที่เชื่อมโยงโดย ก

สมบัติ CollisionFidelity มีตัวเลือกต่อไปนี้ในลำดับความสมบูรณ์แบบและผลกระทบด้านประสิทธิภาพตั้งแต่ต่ำสุดไปยังสูงสุด:

  • กล่อง — สร้างกล่องชนิดขอบเขต เหมาะสำหรับวัตถุขนาดเล็กหรือวัตถุที่ไม่ใช้งาน
  • Hull — สร้างร่างกายโค้งกลมที่เหมาะสมสำหรับวัตถุที่มีร่อนหรือช่องว่างน้อยลง
  • ค่าเริ่มต้น — สร้างรูปร่างการชนกระแทกที่เกี่ยวพันกับพื้นที่โดยรอบที่เหมาะสมสำหรับวัตถุที่มีความต้องการในการใช้งานที่ซับซ้อน
  • การแปลง Convex ที่แม่นยำเฉพาะจุด — ให้ความสมบูรณ์แบบที่แม่นยำที่สุด แต่ก็ยังไม่ใช่การแทนที่ 1:1 ของวิดีโอ ตัวเลือกนี้มีค่าใช้จ่ายในการประมวลผลมากที่สุดและใช้เวลานานขึ้นสำหรับ
Original mesh of castle tower

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับประสิทธิภาพของตัวเลือกความนิ่งของการชนและวิธีการลดการสูญเสีย ดู การปรับปรุงประสิทธิภาพ ที่นี่ สำหรับการเดินทางที่เข้าใจได้เกี่ย