Bagaimana saya harus menerapkan "kesadaran" musuh unit?


12

Saya menggunakan Unity3d untuk mengembangkan game prototipe hybrid RTS / TD. Apa pendekatan terbaik untuk "kesadaran" antara unit dan musuh-musuh mereka? Apakah masuk akal untuk memiliki setiap unit memeriksa jarak ke setiap musuh dan terlibat jika dalam jangkauan?

Pendekatan yang saya tuju saat ini adalah memiliki pemicu lingkup pada setiap unit. Jika musuh memasuki pelatuk, unit menjadi sadar akan musuh dan mulai memeriksa jarak. Apakah ini menyimpan beberapa cek yang tidak perlu?

Apa praktik terbaik di sini?


Saya harus menambahkan bahwa penghitungan unit / musuh akan berada dalam skala Panglima Tertinggi
Phil

Jawaban:


10

Lihatlah hierarki pembatas volume (BVH). Mereka paling sering digunakan dalam deteksi tabrakan untuk mengurangi jumlah pemeriksaan yang dibutuhkan saat menghitung tabrakan atau rendering untuk melakukan frustum pemusnahan pada objek. Karena Anda sudah menggunakan bola, saya sarankan pohon bola meskipun volume lain seperti AABB mungkin lebih efisien. Saya tidak yakin apa jenis dukungan yang dimiliki Unity untuk hal-hal seperti saya belum pernah menggunakannya, tetapi mungkin ada sesuatu untuk ini sudah dalam deteksi tabrakan atau rendering bagian-bagian mesin.

Pada dasarnya, Anda ingin mengelompokkan musuh yang berdekatan satu sama lain menjadi beberapa bola induk. Ketika sebuah unit dipindahkan, Anda akan memeriksa sphere pemicu terhadap sphere induk alih-alih memeriksa setiap musuh. Jika bola pemicu bersinggungan dengan bola induk, Anda akan memeriksa setiap musuh di dalamnya. Jika tidak, Anda dapat membuang semua musuh yang ada di dalamnya. Anda ingin mengatur beberapa tingkat bola berdasarkan ukuran bola maksimum atau jumlah musuh untuk setiap bola dan melakukan pemeriksaan berdasarkan bola tingkat atas. Maka itu hanya masalah berjalan di pohon untuk memeriksa setiap musuh tanpa perlu melakukan pemeriksaan jarak untuk masing-masing.

Langkah-langkah yang dibutuhkan setiap frame:

  1. Pindahkan musuh
  2. Bangun kembali / perbarui BVH untuk posisi musuh baru
  3. Pindahkan unit dan periksa terhadap sphere-tree.

Ini dapat mengurangi pemeriksaan yang diperlukan ketika ada banyak musuh tetapi overhead memperbarui dan menyimpan pohon mungkin tidak layak ketika ada tidak banyak. Saya tidak terbiasa dengan Panglima Tertinggi untuk mengetahui apa yang Anda cari, jadi saya hanya berasumsi 'ratusan'. Anda harus membuat profil dalam situasi yang berbeda untuk mengetahui apakah biaya overhead akan sepadan dengan Anda.


3
+1 pendekatan ini akan menjadi paling sederhana meskipun akan ada beberapa kesalahan. OP mungkin ingin mengimplementasikan ini dan kemudian mengimplementasikan sesuatu seperti sebuah octree. Juga, di sebagian besar RTS, unit bereaksi dengan penundaan. Bahkan, sebagian besar AI dalam game dihitung 10-30 frame per detik di mana game mungkin berjalan pada 30-60 frame per detik (jumlahnya, tentu saja, perkiraan).
Samaursa

Terima kasih, inilah tepatnya yang saya butuhkan untuk membawa saya selangkah lebih maju. Saya akan mencari BVH dan bagaimana mengimplementasikannya di Unity. Posting yang sangat pedagogis dan informatif! +1
Phil

Oh, dan periksa Panglima Tertinggi jika Anda berada di RTS. Ini memang permainan yang sangat menyenangkan, seperti juga semua permainan Chris Taylor.
Phil

7

Tidak perlu menerapkan BVH, karena mesin tabrakan Unity pada dasarnya melakukan itu untuk Anda.

Cukup pasang pemicu lingkup-bola besar ke setiap unit (mewakili jangkauannya) dan tangani OnCollisionEnter()dan OnCollisionExit()panggil balik untuk melacak musuh yang berada dalam jangkauan masing-masing unit.

Perhatikan bahwa casing yang Anda minati adalah ketika unit lain bertabrakan dengan sphere, bukan ketika sphere unit lain bertabrakan dengan sphere.


1
Saya pikir ini perlu diunggulkan setidaknya di atas jawaban yang diterima. Jawaban yang diterima bagus untuk belajar, tetapi jawaban ini harus di atas karena ini adalah cara yang paling praktis.
Varaquilex

Saya percaya maksud Anda OnTriggerEnter()dan OnTriggerExit(), kan?
Jibb Smart

1

Solusi lain yang berskala sangat baik dan dapat digunakan untuk banyak hal lainnya adalah peta influeunce. Buat satu set petak petak di sekitar unit untuk memindai dalam radius X. Pindai ubin ini untuk melihat musuh yang berdiri di atasnya. Jika Anda ingin mendapatkan musuh terdekat, Anda dapat mengurutkan set Anda berdasarkan jarak.

Ini mungkin metode yang paling efisien, terutama jika Anda berencana untuk melakukan hal-hal lain dengan peta pengaruh seperti kabut perang atau merintis jalan.

Berikut adalah video yang saya buat menjelaskan konsep: https://www.youtube.com/watch?v=MEd6XV2Pecw .

Dan inilah implementasinya: https://www.youtube.com/watch?v=y_ewoxlZlgc

Saya sarankan untuk tidak menginisialisasi pengumpulan unit kotak petak saat startup - tetapi hanya saat koleksi diperlukan.

Atau, Anda bisa menggunakan larik X yang panjang jika Anda tahu tidak akan pernah ada lebih dari X unit pada ubin.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.