Saya sedang dalam proses memindahkan game top down 2d yang telah saya kerjakan menjadi mesin fisika tubuh kaku yang tepat seperti Farseer. Sampai sekarang, saya baru saja meretas kode fisika saya sendiri di mana diperlukan.
Saya mencoba mempelajari cara yang tepat untuk melakukan sesuatu di sini.
Apa cara yang tepat untuk membuat AI Anda mengikuti set path setelah Anda membuatnya menjadi tubuh yang kaku di dalam mesin fisika?
Jika saya memiliki jalur node navigasi di peta saya yang perlu saya ikuti AI, sebelumnya saya hanya akan memindahkannya di sepanjang jalur secara manual dengan menghitung posisi berikutnya yang harus mereka tempuh untuk langkah waktu berikutnya dan secara manual mengaturnya ke posisi itu .
Tapi sekarang mereka adalah tubuh yang kaku dan tunduk pada tabrakan dan kekuatan apa pun yang mungkin mengenai mereka dan menjatuhkan mereka dari jalur.
Jadi untuk membuat AI bergerak saya yakin saya sekarang harus menerapkan impuls / kekuatan kepada mereka? Saya seharusnya tidak lagi secara manual mengatur posisi mereka setiap frame.
Jadi saya pikir saya harus pergi dari dunia deterministik di mana saya memaksa AI untuk secara ketat mengikuti jalan ke dunia non-deterministik di mana mereka bisa tersingkir ke segala arah jika terkena dan saya hanya mendorong mereka ke arah simpul berikutnya di jalur. untuk membuat mereka bergerak.
Apakah itu benar? Apakah itu cara orang lain melakukannya?
Ini menimbulkan beberapa pertanyaan tentang bagaimana kemudian menghindari AI Anda terjebak di sudut-sudut pemandangan sekarang karena mereka tidak berjalan di jalur yang tepat, bagaimana kalian menangani hal semacam itu?
Atau lebih baik menggabungkan keduanya dan masih memiliki AI Anda mengikuti jalur tetap dengan mengatur posisi mereka secara manual, dan hanya bereaksi terhadap kekuatan lain dalam keadaan tertentu yang dapat Anda kontrol dengan mudah?
Terima kasih atas sarannya kawan.
Jawaban:
Perilaku kemudi bekerja sangat baik dalam kombinasi dengan mesin fisika, karena mereka biasanya diterapkan dengan cara yang mengembalikan "kekuatan kemudi" yang kemudian dapat diterapkan pada tubuh fisika Anda.
Untuk membuat unit mengikuti jalan, Anda bisa menggunakan Mencari untuk pergi dari jalur-simpul ke jalur-simpul (pastikan untuk menghindari overshoot) dan kemudian gunakan Kedatangan di simpul terakhir di jalur Anda.
Adapun kekhawatiran Anda tentang macet: Pemodelan kekuatan penggunaan mengikuti jalan seharusnya cukup akurat. Anda benar bahwa suatu objek mungkin terlempar keluar dari jalur jika bertabrakan dengan objek lain, tetapi karena Anda akan menghitung kekuatan kemudi di setiap pembaruan, objek tersebut harus berada di jalur lagi dalam waktu singkat. Jika penyimpangan dari jalur setelah tabrakan berpotensi besar, maka saya sarankan Anda mengingat posisi terakhir Anda setiap kali tabrakan terjadi dan kemudian mengarahkan objek kembali ke posisi terakhir sebelum melanjutkan rute normal.
sumber
Saya katakan Anda berada di jalur yang benar, Anda mungkin ingin melihat artikel ini:
http://www.policyalmanac.org/games/aStarTutorial.htm
Ini menjelaskan beberapa penghindaran tabrakan dasar dan pencarian jalur menggunakan algoritma A *.
Edit:
Jika Anda benar-benar hanya membutuhkan apa cara terbaik untuk mendorong objek Anda ke arah yang benar adalah, maka Anda harus menggunakan kekuatan (katakanlah, MovementForce atau sesuatu) menunjuk ke arah jalur terbaik yang Anda temukan menggunakan algoritma pencarian jalur dari Anda pilihan
sumber
Menilai apa yang dikomentari @davidluzgouveia di pos anonim, saya akan membuka proyek saya. Mengikuti jalan dan menemukan jalan sangat berbeda. Path finding adalah lebih dari apa yang diposting secara anonim, dan untuk mencari path saya akan melihat algoritma Dijkstra. Untuk mengikuti jalur saya menggunakan mesin fisika pilihan saya sepenuhnya. Cara saya mengaturnya adalah bahwa setiap lokasi berjalan dengan unit kelas, diatur dalam pathing subclass-nya melalui offset 2D, ya mereka 2D dan bukan 3D ini karena cara saya mengatur fisika dalam permainan saya .
Penjelasan 3D: Setiap unit hanya memiliki satu collider utama yang secara eksklusif diatur untuk tabrakan dengan medan dan objek dunia. Ini bentuk kapsul dan memiliki jari-jari, dan tinggi secara programatis. Itu dibangun di tengah model dan harus memanjang melewati bagian depan dan atas model. Tapi saya juga memiliki permukaan offset untuk seberapa jauh itu berada di tanah setiap saat, dan mengapung berapa banyak itu diperbolehkan meluncur ke bawah sebelum memantul sedikit, pada suatu waktu. Ini terdengar seperti saya sedang menerapkan semacam perbaikan kacau untuk masalah tabrakan medan, tapi saya punya alasan.
Bagaimanapun, Anda harus menerapkan kekuatan pada objek kapsul ini, dan itu harus tetap melayang di atas tanah setiap saat. Itu bukan untuk mengatakan itu tidak bisa lebih tinggi, hanya saja itu tidak bisa lebih rendah. Alasan mengapa perlu melayang-layang (dalam kasus saya) adalah karena dalam tubuh yang kaku dan mesin fisika ragdoll, kaki-kaki unit saya digerakkan secara prosedural. Jadi dengan menerapkan kekuatan sederhana pada kapsul, kaki-kaki entitas saya akan memposisikan diri mereka sendiri. Mereka juga akan memiliki aplikasi gravitasi terpisah! Apa yang dilakukan adalah memungkinkan jika karakter saya miring, satu kaki bisa berada pada ketinggian yang lebih rendah dari yang lain.
Inilah yang harus Anda lakukan. Menilai dari apa yang Anda tanyakan itu. Jika Anda ingin meninggalkan beberapa fitur, itu jelas baik-baik saja, terutama jika itu adalah RTS atau FPS dan tidak ada yang akan melihat unit kaki atau peduli. Tetapi secara umum, unit harus memiliki satu objek tabrakan MAIN yang bekerja dengan pergerakan karakter hampir secara eksklusif.
Khususnya 2D: Anda masih harus memiliki titik utama, atau hanya semacam referensi, agar mesin bisa berputar yaitu untuk pergerakan unit. Anda dapat memberikan setiap unit subkelas lintasan yang memiliki beberapa lokasi yang harus dilalui, Anda dapat menentukannya dalam kode level, (mis. Location1 (x, y) location2 (x, y) dll.) Cara terbaik (saya tidak mungkin tahu jenis permainan apa yang sedang Anda kerjakan) mungkin untuk menentukan lokasi di level dan meminta setiap unit untuk memprosesnya sesuai dengan level dan setelah mencapai setiap lokasi, minta ganti lokasi yang diinginkan dengan yang berikutnya harus sampai.
Ada banyak cara Anda dapat memodifikasi itu, seperti memiliki daftar lokasi di tempat pertama untuk setiap unit, karena ini berarti tidak semua unit harus pergi ke lokasi yang sama. Namun, dengan cara yang sama, Anda bisa melakukan ini dalam kode level juga (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) Masa bodo)
Hanya beberapa ide! Saya sarankan Anda membaca versi 3D meskipun itu jauh kurang relevan.
EDIT: Saya memutuskan untuk menyediakan keduanya bagi siapa saja yang mungkin membaca ini (Ya itu benar) .... (Awalnya saya hanya membaca sekilas pertanyaan Anda dan tidak menyadari itu cukup spesifik 2D hingga saya membaca ulang>>.>)
sumber