ทำให้ศัตรู flocking หลายตัวล้อมรอบสิ่งกีดขวางได้อย่างมีประสิทธิภาพ


20

ฉันกำลังพยายามปรับปรุงการหาเส้นทางสำหรับศัตรูในเกมของฉัน ตอนนี้พวกเขาเพียงแค่ขยับไปยังตำแหน่งที่แน่นอนของผู้เล่นโดยการคำนวณมุมระหว่างพวกเขากับผู้เล่นและเคลื่อนที่ไปในทิศทางนั้น ฉันยังมีอัลกอริทึม flocking ที่ป้องกันศัตรูจากการซ้อนทับกันดังนั้นพวกเขาจะรวมตัวกันเป็นกลุ่มแทนที่จะจับกลุ่มกัน

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

ฉันสงสัยว่ามันอาจจะทำงานหนักเกินไปหรือไม่ในการคำนวณเส้นทางไปยังผู้เล่นโดยใช้ A * จากนั้นใช้อัลกอริทึม flocking เพื่อป้องกันการจับกันเป็นก้อน เดิมทีเกมของฉันจะเป็นเกมยิงตามคลื่น แต่ฉันตัดสินใจที่จะทำให้เกมนี้อยู่ในระดับที่เส้นเลือดของ Hotline Miami ดังนั้นจึงเป็นไปได้ที่ฉันจะมีศัตรูน้อยลง พวกเขาแข็งแกร่งขึ้น

นี่เป็นทางออกที่ทำงานได้หรือไม่? ฉันใช้ Java กับ Slick2D เป็นเอ็นจิ้นเกมของฉัน หรือมีวิธีแก้ปัญหา / อัลกอริทึมที่ดีกว่าที่จัดการกับปัญหาทั้งสองนี้ได้หรือไม่


7
ดังที่ฉันอธิบายไว้ในการแก้ไขว่า "นี่มันหนักเกินไปหรือเปล่า" เป็นคำถามที่ถามผู้สร้างโปรไฟล์ของคุณเพราะมันจะขึ้นอยู่กับการนำไปใช้งานของคุณฮาร์ดแวร์เป้าหมายงบประมาณด้านประสิทธิภาพและบริบทของเกมของคุณ - ทุกสิ่งที่คุณ อย่างใกล้ชิด แต่คนแปลกหน้าอินเทอร์เน็ตไม่ได้ หากคุณต้องการได้รับการค้นหาเส้นทางฝูงอย่างมีประสิทธิภาพเราสามารถแนะนำกลยุทธ์เพื่อช่วยในเรื่องนี้ แต่มีเพียงโปรไฟล์ของคุณเท่านั้นที่สามารถตอบสนองสิ่งที่มีประสิทธิภาพเพียงพอสำหรับความต้องการของคุณ หากคุณทำโปรไฟล์และระบุปัญหาประสิทธิภาพเฉพาะเรายังสามารถช่วยคุณค้นหาวิธีแก้ไขปัญหานั้น
DMGregory

1
วิธีที่คุณใช้งานจะมีผลกับประสิทธิภาพ ตัวอย่างเช่นการเรียกใช้ A * กับผู้นำและพึ่งพา flocking สำหรับผู้ติดตาม
Pikalek

หากเกมของคุณมีพื้นฐานมาจากการต่อสู้กับศัตรูเหล่านี้อัลกอริทึมที่คุณใช้จะมีผลกระทบอย่างมากต่อความรู้สึกของเกม ดังนั้นคุณควรลองใช้วิธีการที่แตกต่างกันเช่นรู้สึกว่าศัตรูรู้ระดับและตำแหน่งของผู้เล่นอย่างสมบูรณ์แบบตลอดเวลาและพวกเขาติดตามเขาอย่างที่กำกับโดย AI ที่รู้ทุกอย่าง? - วิธีการอื่น ๆ อาจทำให้ศัตรูวิ่งไปในทิศทางทั่วไปที่ผู้เล่นส่งเสียงและมีเพียงสายตาที่วิ่งตรงมาหาเขาหรือตะโกนและแจ้งศัตรูอื่น ๆ ที่ผู้เล่นอยู่ ...
Falco

@Falco เนื่องจากเกมไม่มีคลื่นอีกต่อไปและจะเป็นระดับพื้นฐานและเนื่องจากศัตรูเป็นซอมบี้ ... ฉันกำลังพิจารณาที่จะสร้างมันขึ้นมาดังนั้นคุณจะต้องเห็นหรือทำเสียงดังเพื่อหาพวกเขา ดังนั้นถ้าคุณใช้อาวุธที่มีเสียงดัง? มันส่งเสียงในระยะหนึ่งและศัตรูทั้งหมดในเส้นทางที่มุ่งไปยังตำแหน่งของเสียงที่ปล่อยออกมาจากนั้นจะสุ่มเส้นทางรอบบริเวณนั้น
Darin Beaudreau

คำตอบ:


49

ดูเหมือนว่ากรณีการใช้งานสำหรับ Flow Fields

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

หากไทล์ / ขอบทั้งหมดของคุณมีค่าใช้จ่ายการเดินทางเท่ากันคุณสามารถใช้การค้นหาแบบกว้างแรกง่ายๆ มิฉะนั้นอัลกอริทึมของ Dijkstra (เช่น A * ที่ไม่มีเป้าหมาย / การแก้ปัญหา) ทำงาน

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

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

สิ่งนี้จะปรับขนาดได้ดีขึ้นและดีกว่าศัตรูที่คุณมีในฝูงของคุณ สำหรับศัตรูตัวเดียวมันมีราคาแพงกว่า A * เพราะมันจะค้นหาทั้งแผนที่ (แม้ว่าคุณจะสามารถออกไปก่อนได้เมื่อคุณไปถึงตัวแทนการค้นหาเส้นทางทั้งหมด) แต่เมื่อคุณเพิ่มศัตรูให้มากขึ้นพวกเขาจะได้รับส่วนแบ่งค่าใช้จ่ายในการหาเส้นทางเพิ่มขึ้นเรื่อย ๆ โดยการคำนวณส่วนเส้นทางที่ใช้ร่วมกันมากกว่าหนึ่งครั้ง นอกจากนี้คุณยังได้รับประโยชน์จากข้อเท็จจริงที่ว่า BFS / Dijkdtra นั้นง่ายกว่า A * และโดยทั่วไปจะถูกกว่าในการประเมินการตรวจสอบต่อเซลล์

ตรงจุดที่จุดคุ้มทุนถูกกระทบจากจุด A * แต่ละจุดที่ถูกกว่าไปยัง A * ด้วยการบันทึกความจำที่ถูกกว่า (ที่คุณใช้ผลลัพธ์บางส่วนสำหรับการค้นหาเส้นทางที่ผ่านมาเพื่อเพิ่มความเร็วในฟิลด์ถัดไป) ราคาถูกกว่านั้นขึ้นอยู่กับการใช้งานของคุณจำนวนตัวแทนและขนาดของแผนที่ แต่ถ้าคุณวางแผนฝูงศัตรูจำนวนมากที่เข้ามาใกล้จากหลายทิศทางในพื้นที่ จำกัด เขตการไหลหนึ่งจะเกือบถูกกว่า A * ซ้ำแน่นอน

ในฐานะที่เป็นตัวอย่างมากคุณสามารถดูวิดีโอที่นี่กับ 20 000 ตัวแทนทั้งหมดพร้อมกัน pathfinding บนตารางขนาดเล็กที่สมเหตุสมผล


เทคนิคนี้ฟังดูเรียบร้อยดีจริงๆ ฉันจะตรวจสอบมันออก
Darin Beaudreau

15
เป็นไปได้ที่จะใช้อัลกอริทึมไฮบริดที่สร้างฟิลด์โฟลว์บางส่วนโดยไม่ต้องค้นหาแผนที่มากกว่าการเรียก A * ซ้ำ ๆและไม่เคยค้นหาตำแหน่งเดียวกันสองครั้ง แนวคิดพื้นฐานคือการเลือกศัตรูโดยพลการและเริ่มการค้นหา A * จากผู้เล่นไปยังศัตรูนั้นทำเครื่องหมายเซลล์เมื่อคุณพบพวกเขาเช่นเดียวกับในการสร้างสนามไหลปกติ เมื่อการค้นหาพบศัตรูให้เลือกศัตรูอื่น (ที่คุณยังไม่ได้พบ) เป็นเป้าหมายแล้วจัดเรียงชุดที่เปิดใหม่ตามฮิวริสติกใหม่และค้นหาต่อไป หยุดเมื่อคุณพบศัตรูทั้งหมด
Ilmari Karonen

1
แล้วการหลีกเลี่ยงการชนล่ะ นั่นคือ (ค่อนข้าง) ที่กล่าวถึงใน OP (หลีกเลี่ยงการตัดเมื่อพวกเขามาถึงผู้เล่น) ดูเหมือนว่าคุณจะต้องเรียกใช้ djikstras ใหม่ทุกครั้งที่มีการเคลื่อนไหว (หรือเพิ่มตรรกะเพิ่มเติม)
ดาวอังคาร

2
@Mars The OP พูดเกี่ยวกับ flocking ดังนั้นฉันจะสมมติว่าทุกคนสามารถเคลื่อนที่ด้วยความเร็วเดียวกัน สถานที่เพียงแห่งเดียวที่การชนกันของปัญหาคือปัญหาคอขวดซึ่งต้องใช้ฝูงแกะเพื่อหยุดและรอ อย่างไรก็ตามมันไม่จำเป็นต้องเปลี่ยน pathfinding - คิวง่าย ๆ อาจจะทำงานได้ดีพอในกรณีส่วนใหญ่และเส้นทาง biasing (การเลือกแบบสุ่มหลอกบางอย่างของเส้นทางอื่นที่มีราคาใกล้เคียงกัน) จะทำให้ฝูงดูเป็นธรรมชาติมากขึ้น กระแสที่ยังหลีกเลี่ยงฝูงทั้งหมดที่พยายามผ่านช่องว่างแบบเรียงต่อกันเดียว :)
Luaan

3
@Luaan ในเกมเรียงไพ่คุณจะประหลาดใจว่ามีการชนกันบ่อยครั้งเพียงใด โดยส่วนตัวฉันพบว่าตัวเลือก "เข้าคิว" จะน้อยกว่าที่ดีที่สุด นอกจากนี้หากหน่วยไม่สามารถผ่านกันและกันคุณจะต้องคำนวณใหม่เมื่อหน่วยเริ่มเข้าสู่ตำแหน่งสุดท้ายของพวกเขาและกรณีขอบอื่น ๆ Flocking นั้นยาก;)
ดาวอังคาร

8

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

ตัวอย่างเช่นติดตามระยะทางของผู้เล่นจากตำแหน่งเป้าหมาย A * หากอยู่เหนือขีด จำกัด การคำนวณใหม่ * จากนั้นเพียงแค่ทำการอัพเดตการเคลื่อนไหว เกมส่วนใหญ่ใช้การรวมกันของวิธีชี้คะแนนเช่นกริดที่ง่ายขึ้นสำหรับการค้นหาเส้นทางและตรรกะที่จัดการการเคลื่อนไหวระหว่างจุดที่มีอัลกอริทึมการหลีกเลี่ยงพวงมาลัยโดยใช้ raycasts ตัวแทนพยายามที่จะวิ่งไปยังจุดที่ห่างไกลโดยการหลบหลีกสิ่งกีดขวางในบริเวณใกล้เคียงเป็นวิธีที่ดีที่สุดในความคิดของฉัน

เป็นการดีที่สุดที่จะทำงานกับเครื่องจักรสถานะ จำกัด ที่นี่และอ่านหนังสือ "Programming Game AI By Example" โดย Mat Buckland หนังสือนำเสนอเทคนิคที่พิสูจน์แล้วสำหรับปัญหาของคุณและรายละเอียดคณิตศาสตร์ที่จำเป็น มีซอร์สโค้ดจากหนังสืออยู่บนเว็บ หนังสืออยู่ใน C ++ แต่มีการแปลบางส่วน (รวมถึง Java)


2
ด้วยวิธี A * ที่ไม่ได้รับการอัพเดทบ่อยครั้งมันอาจจะมีประโยชน์ในการทำให้เซที่อัปเดตของคุณคงไว้ซึ่งงบประมาณสำหรับจำนวนศัตรูที่ได้รับอนุญาตให้เข้าสู่เส้นทางอีกครั้งในเฟรมเดียว ด้วยวิธีนี้คุณสามารถรักษาต้นทุนสูงสุดในการค้นหาเส้นทางสูงสุดต่อหนึ่งเฟรมและมีประสิทธิภาพมากขึ้นในการจัดการเส้นทาง AI จำนวนมากโดยการตัดค่าใช้จ่ายทั้งหมดของพวกเขาไปยังหลาย ๆ เฟรม AI ที่ใช้พา ธ เก่าสำหรับเฟรมหนึ่งหรือสองเมื่อเกินงบประมาณสำหรับเฟรมหรือล้มลงในการคำนวณที่ตายหากปิดแล้วมักจะไม่ถูกรบกวน
DMGregory

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

4

ไม่เพียงเป็นไปได้ แต่ฉันเชื่อว่ามันทำในเกมเชิงพาณิชย์ใน 90s - BattleZone (1998)

เกมนั้นมีหน่วย 3 มิติพร้อมการเคลื่อนไหวแบบไม่มีไทล์ฟรีและการสร้างฐานแบบไทล์

นี่คือวิธีการทำงาน:

อันดับแรก A * หรือบางอย่างที่คล้ายกัน (น่าจะเป็นรูปแบบของ A * ที่มีข้อ จำกัด ที่เข้มงวดเกี่ยวกับเส้นทางที่สามารถค้นหาได้ดังนั้นจึงไม่ต้องใช้ทรัพยากรมากเกินไปในการทำงาน แต่ไม่พบเส้นทางตลอดเส้นทางจนถึงปลายทาง) จะถูกใช้เพื่อค้นหาเส้นทางสำหรับ hovertank เพื่อไปยังปลายทางโดยไม่ติดขัดในสิ่งกีดขวางบนกระเบื้อง

จากนั้นรถถังจะบินไปรอบ ๆ พื้นที่จนราวกับว่ามันถูกดึงดูดไปยังศูนย์กลางของกระเบื้องใกล้เคียงในเส้นทางของมันและผลักไสไล่ตามอุปสรรครถถังอื่น ๆ ที่อยู่ใกล้เคียง ฯลฯ


1
ดังนั้นเป็นวิธีที่ดีในการจัดการตามเส้นทาง แต่ไม่แน่นอนอะไร หากฉันอนุญาตให้เข้าโค้งตัวเล็กฉันต้องสามารถหยุดศัตรูไม่ให้ชนกับมุมของสิ่งกีดขวาง ฉันควรรักษาพฤติกรรมการเตือนใจของศัตรูและสิ่งกีดขวางและเพิ่ม A * เพื่อจัดการกับสถานการณ์เหล่านั้นหรือไม่?
Darin Beaudreau
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.