Saat ini, saya mensimulasikan kekuatan dampak fisika untuk penghindaran lokal unit tetapi metode ini kadang-kadang mendorong unit keluar dari formasi dan memiliki efek yang sangat tidak diinginkan ketika unit menggumpal.
Untuk game RTS seperti Starcraft 2, bagaimana penghindaran lokal dilakukan? Apakah fisika disimulasikan atau pengontrol omnicient memutuskan di mana semuanya seharusnya? Saya tahu pertanyaan ini mungkin sedikit luas, jadi saya bertanya secara spesifik bagaimana cara mencapai perilaku penghindaran lokal Starcraft 2; meskipun apa pun yang bekerja akan sangat dihargai.
Saya tidak mencari kode apa pun - hanya sumber daya yang berguna atau penjelasan tentang bagaimana Starcraft 2 (atau game serupa) menangani penghindaran lokal.
Saat ini, saya memiliki deteksi tabrakan (dengan vektor penetrasi), gaya tabrakan, dan gerakan dengan kecepatan diimplementasikan. Setiap unit diperiksa terhadap yang lain untuk tabrakan - jika mereka bertabrakan, objek segera diimbangi oleh vektor penetrasi maka gaya tabrakan diterapkan. Kemudian loop lain menggerakkan objek dengan kecepatannya dan menerapkan gaya tarik ke kecepatan. Offset ini mengurangi masalah gaya tabrakan yang berlebihan yang diterapkan pada unit bergerombol, tetapi unit kadang-kadang masih menembak.
Solusi yang saya cari perlu memenuhi persyaratan berikut (seperti dalam Starcraft 2):
- Objek tidak tumpang tindih; atau setidaknya tumpang tindih akhirnya harus diselesaikan.
- Objek tidak mendorong satu sama lain lebih dari yang diperlukan sehingga 2 unit dapat berdiri dan bergerak bersebelahan dalam suatu formasi.
- Seharusnya tidak ada perilaku aneh ketika benda-benda menggumpal ke arah tujuan yang sama.
- Dapat mendukung unit dengan ukuran yang berbeda, dan bahkan bentuk cembung yang berbeda.
Apa yang saya pikirkan sejauh ini adalah bukannya mendeteksi tabrakan, mendeteksi tabrakan di masa depan sehingga tumpang tindih tidak pernah terjadi. Kemudian terapkan kendala, pastikan kecepatan 2 unit tidak menyebabkan mereka tumpang tindih. Saya masih mengutak-atik algoritma untuk membatasi gerakan di luar tumpang tindih.
sumber
Jawaban:
Sepertinya yang Anda cari adalah algoritma Optimal Reciprocal Collision Avoidance . The kertas sebelumnya juga layak membaca. Meskipun makalah ini mungkin sedikit melibatkan teori di balik algoritma ini cukup mudah:
Asumsikan bahwa Anda sudah memiliki simulasi (permainan) dengan agen (unit) yang memiliki semacam volume pembatas di sekitar mereka. Volume pembatas ini kemungkinan besar sudah Anda gunakan untuk melakukan deteksi dan respons tabrakan. Untuk setiap agen, tentukan kecepatan
v_p
yang disukai yang mungkin atau mungkin tidak didasarkan pada tujuan agen.Sekarang, untuk melakukan simulasi:
v_p
, ini adalah kecepatan baru unit.Jika semua agen menjalankan algoritma yang sama, maka mereka akan memilih kecepatan yang saling melengkapi satu sama lain dan akan menghindari agen lain. Dalam beberapa situasi, Anda dapat menyebabkan osilasi seperti hal canggung yang terjadi ketika Anda berjalan langsung ke seseorang di aula dan Anda berdua mencoba untuk bergerak keluar dari arah yang sama, tetapi makalah tersebut membahas cara menghindarinya.
Untuk menghitung dua tahap algoritma di atas, Anda dapat menggunakan Minkowski Sums untuk menentukan apa hambatan kecepatan, dan kemudian menggunakan model pemrograman linier (seperti Algoritma Simplex ) untuk menentukan titik terdekat dengan
v_p
yang menghindari hambatan kecepatan. Juga, kode untuk melakukan penghindaran tabrakan tersedia untuk teliti Anda dan telah porting ke C # untuk digunakan dalam mesin game seperti Unity. Teknik ini telah digunakan setidaknya di Warhammer 40.000: Space Marine , dan mungkin game lainnya .sumber
Saya tidak tahu bagaimana unit Anda bekerja tetapi saya berasumsi bahwa mereka seperti mesin negara:
Kemungkinan status
Jika Anda memperhatikan bagaimana starcraft mendekati masalah ini, Anda akan menemukan bahwa:
Di sini skenario 1:
Apakah saya memiliki ruang untuk pergi ke sana? Iya ? Lalu pergi
Skenario 2:
Apakah saya memiliki ruang untuk pergi ke sana? Tidak ? Hei, bisakah kamu menyediakan ruang untukku, kamu menghalangi aku. Saya sudah memiliki perintah untuk pindah foward tetapi saya akan mengakomodasi Anda.
Jadi apa yang perlu Anda terapkan:
sumber
Salah satu cara untuk melakukannya adalah dengan memiliki formasi form otomatis unit, dan meminta mereka untuk tetap pada posisi yang relatif terhadap pusat formasi . Kemudian, alih-alih memindahkan setiap unit, pindahkan pusat formasi secara terpisah.
Berikut adalah cara dasar untuk melakukannya menggunakan formasi kotak dan pegas sederhana untuk menjaga unit di posisi yang sesuai:
sumber
Saya tahu beberapa orang tidak menyukai link dumping, namun saya menemukan Pendekatan Berbasis Potensi Multi-Agen untuk Bot Game Strategi Real-Time (ISBN 978-91-7295-160-0) sebagai kertas yang sangat mencerahkan, dan itu jelas menyampaikan jauh lebih dari yang saya bisa uraikan. Makalah ini mengeksplorasi menggunakan bidang potensial buatan (konsep yang berasal dari robot), untuk memfasilitasi penghindaran tabrakan lokal dalam konteks pengembangan game.
sumber