ลองพิจารณาเลเยอร์ของคุณตอนรันไทม์
การเปิด / ปิดการชนสำหรับวัตถุบางอย่างที่มีทั้งชั้น
Physics.IgnoreCollisionและPhysics.IgnoreLayerCollisionอนุญาตให้คุณปิดการชนระหว่างสอง colliders และระหว่างสอง layer ตามลำดับ
หากคุณต้องการแยก collider ที่เฉพาะเจาะจงออกจากการชนไม่มีวิธีการดังกล่าวในตัว หากคุณกำลังใช้อุปกรณ์ที่ไม่ใช่จลนศาสตร์กับ colliders ที่ไม่มีทริกเกอร์ก็จะมีการตอบสนองแม้ว่าคุณจะพยายามกรองการตอบสนองด้วยแท็ก
วิธีที่เราทำสิ่งนี้ให้สำเร็จในโครงการของเราคือการสร้างเลเยอร์ชื่อว่า "Void" โมฆะไม่ชนอะไรเลย
ตอนนี้คุณสามารถปิดใช้งานการชนของ collider ได้ชั่วคราวโดยการตั้งค่าเลเยอร์เป็น "Void" และเปิดใช้งานอีกครั้งโดยเรียกคืนเลเยอร์เก่า
นี่คือส่วนสำคัญ:
int oldLayer = -1;
int voidLayer;
void Start()
{
voidLayer = LayerMask.NameToLayer("Void");
}
void DisableCollider(Collider col)
{
oldLayer = col.gameObject.layer;
col.gameObject.layer = voidLayer;
}
void EnableCollider(Collider col)
{
col.gameObject.layer = oldLayer;
}
เราทำสิ่งนี้โดยเฉพาะเพราะการเปิดใช้งานและปิดการใช้งาน colliders ที่เป็นลูกของ rigidbodies สามารถทำให้สิ่งต่าง ๆ เกิดขึ้นได้ในบางสถานการณ์ ดังนั้นคุณจึงไม่สามารถปิดการใช้งานส่วนหนึ่งของ collidbody แบบผสมได้ แต่คุณสามารถสลับรอบเลเยอร์ของหนึ่งในส่วน Collider แบบผสมได้
ตอนนี้สถานการณ์เฉพาะของคุณ
เพื่อลดการปะทะกันของซอมบี้ที่กระทบกับรถของคุณให้พิจารณาว่าซอมบี้ของคุณก่อให้เกิดการแข็งตัวของกล้ามเนื้อหรือทำให้มวลของพวกมันเล็กมาก (เช่นลอย Epsilon) ดังนั้นการกระแทกจึงไม่มีผลกระทบต่อแรงผลักดันของรถ คุณสามารถใช้สวิตช์เลเยอร์นี้ได้เพื่อไม่ให้เกิดการชนตามมาแม้ว่าแรงกระแทกแรกจะใช้แรงเล็กน้อยกับตัวถังรถยนต์
คุณสามารถเปลี่ยนเป็นเลเยอร์ที่ไม่ชนกับรถ
คุณสามารถใส่ collider อีกตัวลงบนซอมบี้ที่เปิดใช้งานบนทางวิ่งได้ วิธีนี้คุณสามารถใช้แรงกระแทกกับ OnTriggerEnter ได้ คุณไม่สามารถแม่นยำได้ แต่คุณสามารถประมาณได้ว่าบรรทัดฐานการติดต่ออาจจะดีพอที่จะทำให้ซอมบี้สนุก
คุณต้องถามตัวเอง: