กำลังมองหาเทคนิคที่ดีสำหรับการเคลื่อนไหวของตัวละครในเกมแฮ็ค & สแลช


51

ฉันกำลังสร้างเกมแฮ็ค & สแลชและฉันต้องการให้ตัวละครของฉันเคลื่อนไหวอย่างเช่น Torchlight, Diablo เป็นต้นปัจจุบันฉันสร้างชุดของโหนดสำหรับพื้นที่ที่สามารถเดินได้ทั้งหมดของพื้น เมื่อฉันคลิกที่ผู้เล่นที่ไหนสักแห่งไปที่นั่นผ่านเส้นทางของการสอดแทรกโหนด มันดูไม่เป็นธรรมชาติมาก ผู้เล่นเคลื่อนไหวเหมือนหุ่นยนต์ ศัตรูใช้ระบบโหนดนี้เพื่อการเคลื่อนไหวและแบ่งปันปัญหาเดียวกัน แต่ฉันมีปัญหาอีกหนึ่งข้อกับพวกเขา เมื่อศัตรูตรวจพบผู้เล่นพวกเขาจะไปหาเขาโดยเส้นทางที่สั้นที่สุด บางครั้งพวกเขาใช้เส้นทางเดียวกันและต่อแถวเข้ากับผู้เล่นแทนที่จะล้อมรอบเขา ฉันไม่รู้วิธีที่จะทำให้ศัตรูเลือกเส้นทางที่แตกต่างและล้อมรอบผู้เล่น คุณรู้หรือไม่ว่าฉันจะแก้ปัญหานี้ได้อย่างไร? บางทีฉันควรใช้วิธีการที่แตกต่างกันสำหรับการเคลื่อนไหวของตัวละคร?


เทคนิคปัจจุบันของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่


ภาพหน้าจอของ Torchlight:ป้อนคำอธิบายรูปภาพที่นี่

--- UPDATE ---

ฉันต้องการทราบวิธีจัดการกับสถานการณ์เหล่านี้:

สถานการณ์ที่ 1 ฉันมีสิ่งกีดขวางแบบไดนามิก / แบบคงที่ในแบบของฉัน

ป้อนคำอธิบายรูปภาพที่นี่

สถานการณ์ที่ 2 ศัตรูมีเส้นทางแซมไปยังผู้เล่น (เข้าคิวเพื่อต่อสู้กับเรา) ป้อนคำอธิบายรูปภาพที่นี่


10
+1 สำหรับไดอะแกรมและภาพหน้าจอ (และเป็นคำถามที่ดี) มีประโยชน์เสมอ
The Duck คอมมิวนิสต์

นี่เป็นคำถามที่ยอดเยี่ยม (+1) ซึ่งฉันหวังว่าจะมีการสนทนาและข้อเสนอแนะมากมายเกี่ยวกับวิธีต่างๆในการจัดการกับความท้าทายนี้ (อิทธิพลแบบสุ่มในการเปลี่ยนเส้นทาง AI ฯลฯ )
Randolf Richardson

1
ฉันพบว่ามันเป็นแนวปฏิบัติที่ดีในการใช้ระบบการให้คะแนนเมื่อคุณสร้าง AI ขึ้นอยู่กับคะแนนของศัตรูแต่ละคน (เวลาในการเข้าถึงผู้เล่น) คุณสามารถให้พฤติกรรมที่เฉพาะเจาะจงได้ ตัวอย่างเช่นหาก 8 mobs เป็นค่าสูงสุดที่สามารถโจมตีผู้เล่นคนที่มีคะแนนสูงกว่าแปดคนแรกสามารถพยายามหาเส้นทางที่ยาวไปยังผู้เล่นได้อย่างรู้เท่าทันทำให้พวกเขาดูฉลาดขึ้น
Jonathan Connell

ฉันยังคงมองหาคำตอบฉันจะจัดการกับสิ่งกีดขวาง (dynamic / static) บน nav mesh ได้อย่างไร ฉันไม่สามารถใช้ Recast
piotrek

คำตอบ:


24

พฤติกรรมพวงมาลัยร่วมกับโครงสร้างข้อมูลนำทาง

มีหลายวิธีในการทำเช่นนี้ แต่นั่นเป็นแนวคิดพื้นฐาน มันอาจจะง่ายกว่าที่จะใช้mesh navigationเพื่อให้คุณสามารถใส่ pathfinding ในแต่ละส่วนนูน

หากคุณแน่วแน่เกี่ยวกับการเก็บกราฟคุณสามารถใช้ลักษณะการทำงานของSeekสำหรับแต่ละโหนดในเส้นทางแทนที่จะใช้เส้นทางจากโหนดหนึ่งไปอีกโหนดหนึ่ง

วิธีการอีกวิธีหนึ่งที่คุณสามารถทำได้คือPath Smoothingแต่โปรดจำไว้ว่านี่เป็นการคำนวณที่ค่อนข้างแพง

หวังว่าจะช่วย

แก้ไข:

เพื่อช่วยให้มีการหลีกเลี่ยงปัญหาอุปสรรคของคุณใช้การจัดเรียงของบางอย่างหลีกเลี่ยงอุปสรรค


ขอบคุณสำหรับคำตอบคุณรู้หรือไม่ว่าฉันจะสร้างตาข่ายนำทางได้อย่างไร หรือมีวิธีอื่นที่จะทำให้มัน? แผนที่ของฉันถูกสร้างขึ้นด้วยชิ้นส่วนที่ไร้รอยต่อ (สี่คน / รูปสามเหลี่ยม)
piotrek

1
คุณสามารถใช้ Recast ( code.google.com/p/recastnavigation ) เพื่อสร้างระบบนำทางได้ตลอดเวลา คุณเพียงแค่ต้องให้มัน "สามเหลี่ยมซุป" (พวงของรูปหลายเหลี่ยม) และมันจะสร้างให้คุณ
Ray Dey

ฉันเป็นคนเดียวที่พบสิ่งนี้ แต่การเชื่อมโยง: ai-blog.net/archives/000152.htmlตายไปแล้ว จริงๆแล้วฉันไม่สามารถเข้าถึง www.ai-blog.net
123iamking

3

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

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

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


2

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

นี่คือตัวอย่างของพฤติกรรม boid: http://www.red3d.com/cwr/boids/

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


แต่สิ่งที่ยกตัวอย่างเช่นบันได? ศัตรูสามารถโจมตีฉันที่นั่นด้วยทำให้เป็นตาข่ายนำทางอีกอันหรือไม่
piotrek

มันควรเป็นส่วนหนึ่งของตาข่าย nav เป็นรูปร่างนูนของตัวเอง
Tetrad

1
อีกทางหนึ่งคุณสามารถใช้การชี้จุดเพื่อชี้ทางเดินต่อและถอยกลับไปสู่พฤติกรรมการบังคับเลี้ยวตามหลักฟิสิกส์เมื่อคุณ "เข้าใกล้"
Tetrad

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

1
นี่คือบล็อกโพสต์เกี่ยวกับวิธีการทำงานของ recast ในการจัดการ: digestingduck.blogspot.com/2011/03/
Tetrad

1

มีอัลกอริทึมชื่อ rrt ซึ่งใช้สำหรับปัญหาการค้นหาเส้นทางในโลกแห่งความจริง พื้นผิวที่ฮีโร่ของคุณ (หรือศัตรู) สามารถเดินไปได้คือสิ่งที่ใส่เข้าไปพร้อมกับส่วนที่วัตถุสามารถเคลื่อนที่ได้และใช้อัลกอริธึมการหาค่าเหมาะที่สุดเพื่อหาเส้นทางไปยังจุดหมายปลายทาง เท่าที่ฉันรู้ว่าอัลกอริทึมนี้ใช้กันอย่างแพร่หลายในลีก robocup มันรวดเร็วค้นหาเส้นทางที่สั้นที่สุดและหลีกเลี่ยงการชนและการเลี้ยวที่คมชัด คุณสามารถใช้การแสดง powerpointเพื่อทำความเข้าใจเกี่ยวกับวิธีสร้างพา ธ


หลังจากดูเพิ่มเติมดูเหมือนว่างานนำเสนอที่ฉันให้เพียงแค่บอกว่า rrt ทำอะไรและยังแนะนำการอนุมัติใหม่ซึ่งอ้างว่าทำงานได้ดีขึ้นในบางกรณีและเขาแนะนำอัลกอริทึมสำหรับการหาเส้นทางของเกม RTS หวังว่ามันจะช่วยคุณ
Ali1S232

0

เพื่อให้เส้นทางการค้นหาเส้นทางดูสมจริงยิ่งขึ้นฉันแนะนำให้คุณอ่านบทความเกี่ยวกับ A * ที่ดูเป็นธรรมชาติใน Game Programming Gems Vol.1

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