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?
Jawaban:
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:
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.
sumber
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()
danOnCollisionExit()
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.
sumber
OnTriggerEnter()
danOnTriggerExit()
, kan?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.
sumber