ฉันจะใช้ "การรับรู้" ของหน่วยได้อย่างไร


12

ฉันใช้ Unity3d เพื่อพัฒนาเกมต้นแบบลูกผสม RTS / TD อะไรคือวิธีที่ดีที่สุดสำหรับ "การรับรู้" ระหว่างหน่วยและศัตรูของพวกเขา มันมีเหตุผลหรือไม่ที่ต้องให้ทุกหน่วยตรวจสอบระยะทางกับศัตรูทุกคน

วิธีที่ฉันจะทำในตอนนี้คือการมีทรงกลมทริกเกอร์ในทุกหน่วย หากศัตรูเข้าสู่ทริกเกอร์ยูนิตจะรับรู้ถึงศัตรูและเริ่มการตรวจสอบระยะทาง สิ่งนี้บันทึกการตรวจสอบที่ไม่จำเป็นบ้างไหม?

การปฏิบัติที่ดีที่สุดที่นี่คืออะไร


ฉันควรเพิ่มว่าจำนวนยูนิต / ศัตรูจะอยู่ในระดับของผู้บัญชาการทหารสูงสุด
Phil

คำตอบ:


10

ดูในลำดับชั้นของโวลุ่มที่มีขอบเขต (BVH) โดยส่วนใหญ่จะใช้ในการตรวจจับการชนกันเพื่อลดจำนวนของการตรวจสอบที่จำเป็นเมื่อคำนวณการชนหรือในการเรนเดอร์เพื่อทำการคัดลอก frustum บนวัตถุ เนื่องจากคุณใช้ทรงกลมอยู่แล้วฉันขอแนะนำต้นไม้ทรงกลมแม้ว่าไดรฟ์ข้อมูลอื่น ๆ เช่น AABB อาจมีประสิทธิภาพมากกว่า ฉันไม่แน่ใจว่า Unity สนับสนุนอะไรในแบบที่ฉันไม่เคยใช้ แต่อาจมีบางอย่างในการตรวจจับการชนกันหรือการเรนเดอร์บางส่วนของเครื่องยนต์

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

ขั้นตอนที่ต้องใช้ในแต่ละเฟรม:

  1. ย้ายศัตรู
  2. สร้าง / อัพเดต BVH สำหรับตำแหน่งศัตรูใหม่
  3. ย้ายยูนิตและตรวจสอบกับต้นไม้ทรงกลม

สิ่งนี้สามารถลดการตรวจสอบที่จำเป็นเมื่อมีศัตรูมากมาย แต่ค่าใช้จ่ายในการอัปเดตและการจัดเก็บต้นไม้อาจไม่คุ้มค่าเมื่อไม่มีจำนวนมาก ฉันไม่คุ้นเคยกับผู้บัญชาการทหารสูงสุดที่จะรู้ว่าคุณทำอะไรดังนั้นฉันแค่สมมติว่า 'หลายร้อย' คุณจะต้องโพรไฟล์ในสถานการณ์ต่าง ๆ เพื่อค้นหาว่าค่าใช้จ่ายจะคุ้มกับคุณหรือไม่


3
+1 วิธีนี้จะง่ายที่สุดแม้ว่าจะมีข้อผิดพลาด OP อาจต้องการนำสิ่งนี้ไปใช้ นอกจากนี้ใน RTS ส่วนใหญ่หน่วยจะตอบสนองด้วยความล่าช้า ในความเป็นจริง AI ส่วนใหญ่ในเกมจะถูกคำนวณ 10-30 เฟรมต่อวินาทีซึ่งเกมอาจทำงานที่ 30-60 เฟรมต่อวินาที (แน่นอนว่าตัวเลขนั้นประมาณไว้)
Samaursa

ขอบคุณนี่คือสิ่งที่ฉันต้องการเพื่อนำฉันไปหนึ่งก้าว ฉันจะค้นหา BVH และวิธีการนำไปใช้ใน Unity โพสต์การสอนมากและให้ข้อมูล! +1
Phil

โอ้และตรวจสอบผู้บัญชาการทหารสูงสุดหากคุณอยู่ใน RTS มันเป็นเกมที่ดีมากแน่นอนเช่นเดียวกับเกมของ Chris Taylor ทั้งหมด
Phil

7

ไม่จำเป็นต้องใช้ BVH เพราะเครื่องมือการชนของ Unity นั้นทำเพื่อคุณอยู่แล้ว

เพียงแนบทริกเกอร์ทรงกลมขอบเขตขนาดใหญ่เข้ากับแต่ละยูนิต(แสดงช่วงของมัน)และจัดการOnCollisionEnter()และการOnCollisionExit()เรียกกลับเพื่อติดตามว่าศัตรูอยู่ในระยะของแต่ละหน่วย

โปรดทราบว่ากรณีที่คุณสนใจคือเมื่อหน่วยอื่นชนกับทรงกลมไม่ใช่เมื่อทรงกลมของหน่วยอื่นปะทะกับทรงกลม


1
ฉันคิดว่านี่ต้องได้รับการ upvoted อย่างน้อยเหนือคำตอบที่ยอมรับ คำตอบที่ได้รับการยอมรับนั้นดีสำหรับการศึกษา แต่คำตอบนี้ควรอยู่ด้านบนเนื่องจากนี่เป็นวิธีที่ใช้ได้จริงที่สุด
Varaquilex

ฉันเชื่อว่าคุณหมายถึงOnTriggerEnter()และOnTriggerExit()ใช่มั้ย
Jibb Smart

1

อีกวิธีหนึ่งที่ปรับขนาดได้ดีมากและสามารถนำไปใช้กับสิ่งอื่น ๆ ได้อีกมากมายคือแผนที่ influeunce สร้างชุดตารางย่อยของกระเบื้องรอบ ๆ หน่วยเพื่อทำการสแกนภายในรัศมี X สแกนไทล์เหล่านี้เพื่อดูศัตรูที่ยืนอยู่บนหนึ่งในนั้น หากคุณต้องการศัตรูที่ใกล้เคียงที่สุดคุณสามารถเรียงลำดับตามระยะทางได้

นี่อาจเป็นวิธีที่มีประสิทธิภาพมากที่สุดโดยเฉพาะถ้าคุณวางแผนที่จะทำสิ่งอื่นด้วยแผนที่อิทธิพลเช่นหมอกแห่งสงครามหรือเส้นทาง

นี่เป็นวิดีโอที่ฉันทำอธิบายแนวคิด: https://www.youtube.com/watch?v=MEd6XV2Pecw

และนี่คือการดำเนินการ: https://www.youtube.com/watch?v=y_ewoxlZlgc

ฉันไม่แนะนำให้เริ่มต้นการรวบรวมหน่วยของไทล์กริดเมื่อเริ่มต้น - แต่จะต้องมีการรวบรวม

หรือคุณสามารถใช้อาร์เรย์ที่มีความยาว X หากคุณรู้ว่าจะไม่มีหน่วย X มากกว่าบนกระเบื้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.