เมื่อสองวัตถุ 3D มีการสัมผัสกันภายในโลก 3D สำหรับการจัดการการชนกันที่ปรับแต่งได้ BasePart มีชุดของ เหตุการณ์การชน และ การกรองการชน เทคนิ
เหตุการณ์ความร่วมมือ
เหตุการณ์ชน เกิดขึ้นเมื่อ สอง BaseParts สัมผัสหรือหยุดสัมผัสในโลก 3D คุณสามา
- คุณสมบัติของ 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 ของคุณ โดยการคลิกที่ปุ่ม กลุ่มความสามัคคี ในแท็บ แบบ โดยคุณสามารถเข้าถึงได้โดย
เฟิร์นิเจอร์เวิร์ดทำงานใน either มุมมองรายการ ซึ่งชื่นชอบ ท่าเรือ ไปทางซ้ายหรือขวาของ Studio หรือใน Table ที่กว้างขวาง ที่นั่ง ซึ่งชื่นชอบท่าเรือไปด้านบนหรือด้านล่าง
การลงทะเบียนกลุ่ม
เวิร์ดเพรสรวมถึงกลุ่มความสามารถ ความสามารถปกติ หนึ่งซึ่งไม่สามารถเปลี่ยนชื่อหรือลบได้ ทั้งหมด BaseParts อยู่ในกลุ่มความสามารถเริ่มต้นโดยอัตโนมัต
เพื่อสร้างกลุ่มความสามัคคีใหม่:
คลิกปุ่ม เพิ่มกลุ่ม ที่ด้านบนของแผงเรียบร้อย, ใส่ชื่อกลุ่มใหม่, และกด Enter กลุ่มใหม่ปรากฏในทั้งสองคอลัมน์ของรายการ, หรือในทั้งสองคอลัมน์และแถวบนของตาราง
ทำซ้ำขั้นตอนนี้หากจำเป็นต้องเลือกชื่อที่มีความหมายสำหรับแต่ละกลุ่ม หมายเหตุว่าคุณสามารถเปลี่ยนชื่อกลุ่มได้ในระหว่างการพัฒนาโดยการคลิกในส่วนของมันหรือโดยการเลือกมันและคลิกปุ่
การกำหนดความสามัคคีของกลุ่ม
ตามค่าเริ่มต้นการกระทะกันของวัตถุในกลุ่มทั้งหมดจะชนกัน เพื่อป้องกันวัตถุในกลุ่มหนึ่งจากการชนกันกับวัตถุในกลุ่มอื่น เช็ค กล่องในแถว/คอลัมที่เกี่ยวข้อง
ในตัวอย่างต่อไปนี้, วัตถุในกลุ่ม ลูกบาศก์ จะ ไม่ ชนกับวัตถุในกลุ่ม ประตู
การเรียงลำดับวัตถุให้กลุ่ม
เพื่อการเรียกตัวแปรที่มีอยู่ให้กลุ่มที่คุณได้ลงทะเบียนผ่าน Studio editor:
เลือกหนึ่งหรือมากกว่า BaseParts ที่มีคุณสมบัติเป็นส่วนหนึ่งของกลุ่มความสามัคคี
กำหนดให้พวกเขาอยู่ในกลุ่มโดยการคลิกปุ่ม ⊕ สำหรับรายการของมัน โอเบ็กต์สามารถเป็นของกลุ่มเดียวกันได้เท่านั้นในแต่ละครั้งดังนั้นจึงวางพวกเขาในกลุ่มใหม่จะนำพวกเขาออกจากกลุ่ม
เมื่อได้รับการกำหนด กลุ่มใหม่จะปรากฏใต้สมบัติของวัตถุ CollisionGroup
G Collision StudioSelectable
เครื่องมือใน Studio ใช้ระบบการกรองความสามัคคีเพื่อกำหนดว่าไอเท็มใดที่เป็นตัวเลือกสำหรับการคลิกใน 3D วิวพอร์ต์ ไอเท็มที่มีกลุ่มความสามัคคีที่กำหนดจะไม่ถูกระบุ
เช่น หากคุณมีด่านตรวจในประสบการณ์การแข่งขันซึ่งมีพื้นที่ที่มีประสิทธิภาพถูกกำหนดโดยชิ้นส่วนโปร่งใสขนาดใหญ่, คุณสามารถกำหนดให้พวกเขาไปที่กลุ่ม Checkpoints
สำหรับรหัสของปลั๊กอิน ขอแนะนำให้คุณกำหนด "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 ของวิดีโอ ตัวเลือกนี้มีค่าใช้จ่ายในการประมวลผลมากที่สุดและใช้เวลานานขึ้นสำหรับ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับประสิทธิภาพของตัวเลือกความนิ่งของการชนและวิธีการลดการสูญเสีย ดู การปรับปรุงประสิทธิภาพ ที่นี่ สำหรับการเดินทางที่เข้าใจได้เกี่ย