Apakah ada cara sederhana untuk menghentikan musuh yang berdiri di tempat yang sama?

24

Jadi: permainan top-down, musuh saya mengejar pemain, ketika mereka berada dalam jarak tertentu mereka berdiri diam dan menembak. Jika mereka semua datang dari arah yang sama, mereka semua akhirnya berdiri di tempat yang sama (yaitu berdiri "di dalam" satu sama lain), karena saya saat ini tidak melakukan deteksi tabrakan antara musuh - mereka bebas untuk saling melewati.

Apa cara sederhana ini? Apakah beberapa bentuk deteksi tabrakan atau ai?

Iain
sumber
1
Batasi diri Anda untuk satu musuh. : P
Kylotan

Jawaban:

18

Anda tidak perlu deteksi tabrakan, tetapi Anda harus memberikan sedikit kecerdasan kepada musuh Anda, dan minta mereka menghindari saling bertabrakan. Deteksi tabrakan tanpa itu hanya akan membuat musuh Anda terlihat bodoh - orang saling menghindari, mereka biasanya tidak bertabrakan.

Carilah "berkelompok" untuk beberapa perilaku sederhana.

Ide dasarnya adalah bahwa segala sesuatunya harus menuju pemain, tetapi menjauh dari rintangan yang dekat (satu sama lain, dinding, hal semacam itu).

JasonD
sumber
6
Ini disebut juga disebut boids. Baca tentang aturan sederhana seputar boids di sini: en.wikipedia.org/wiki/Boids Seharusnya sepele untuk menerapkan pembatasan ini.
Nailer
12

Anda dapat menginspirasi diri sendiri tentang perilaku berkelompok , seperti Boids .

Ini cenderung terdiri atas 3-4 aturan yang sangat sederhana yang, diterapkan dengan benar, menghasilkan perilaku yang sangat memuaskan dan "tampak rumit".

Dalam kasus Anda, Anda dapat mencoba sesuatu seperti ini:

  • Pemisahan (radius minimal antara musuh)
  • Kohesi (sehingga mereka bepergian dalam kelompok)
  • Alignment (sehingga mereka cenderung bergerak ke arah yang sama)
  • Ditargetkan (mereka cenderung bergerak ke arah pemain)
egarcia
sumber
Ini hampir merupakan salinan jawaban JasonD yang kata demi kata. Aku bersumpah aku tidak melihatnya sebelum memposting.
egarcia
3

Anda mungkin ingin memeriksa difusi kolaboratif (animasi hebat di sini) atau beberapa jenis pola anti-objek untuk pergerakan. Meskipun algoritma difusi itu sendiri mungkin tidak menghentikan musuh untuk menyeberang, Anda dapat menambahkan kendala tambahan untuk membuatnya tidak mungkin atau tidak mungkin.

Leander
sumber
Pengungkapan penuh: cukup yakin saya menemukan tautan difusi kolaboratif di sini di suatu tempat di GD, tetapi saya tidak dapat seumur hidup menemukan pos yang merujuknya sekarang. Itu cukup menemukan. =)
leander
Ini sangat luar biasa tapi saya sedikit lebih rumit dari yang saya butuhkan. Akan tetap membaca whitepaper tetapi berhasil menerapkan solusi yang lebih sederhana.
Iain
2

Bagaimana jika Anda melarang bergerak melalui unit lain? Menurut saya, Anda akan membutuhkannya cepat atau lambat. Setiap kali jalur saat ini diblokir oleh sebuah unit, sesuaikan jalur untuk bergerak di sekitar itu.

jmp97
sumber
2

Ada beberapa referensi untuk perilaku mengemudi dan berkelompok di situs web Craig Reynold . Mereka relatif sederhana untuk diterapkan tetapi dapat menghasilkan beberapa perilaku muncul yang indah.

tenpn
sumber
Ini pada dasarnya adalah jawaban yang sama dengan 2 lainnya, tetapi +1 untuk tautan - Situs web itu adalah referensi yang sangat bagus.
AShelly
1

Semua jawaban lain menghasilkan hasil yang lebih baik, tetapi cara termurah (?) Untuk menghindari pengelompokan lengkap adalah dengan hanya menambahkan vektor acak yang mungkin 25% dari vektor gerakan terhitung asli sehingga benda memantul sedikit di dalam kelompok gumpalan umum . Ini tidak akan membuat semuanya benar-benar saling menjauh, tetapi tergantung pada apa yang Anda coba capai, saya telah menemukan ini cukup. Objek masih dapat dikelompokkan dengan metode ini jika Anda menjalankan lingkaran di sekitar mereka, tetapi seiring waktu mereka cenderung menyebar.

Berikut ini adalah gim kecil-biar saya buat beberapa tahun lalu yang menunjukkan metode ini: http://deleter.phatcode.net/index.php?page=projects&p=4

Deleter
sumber
1

Orang-orang selalu memunculkan boids karena itu memberikan hasil yang sangat baik, tetapi menerapkan boids mungkin berlebihan untuk tujuan spesifik Anda. Di masa lalu saya mendapatkan hasil yang sangat baik dengan hanya mengacak posisi target dalam lingkaran kecil.

Misalnya, untuk demo yang saya buat di Unity saya menggunakan perintahnya Random.insideUnitSphere untuk melakukan puffballs berkelompok

jhocking
sumber
+1 Saya setuju, contoh lain dari strategi ini (dengan jaminan yang mungkin sedikit lebih baik untuk tidak tumpang tindih) dapat ditemukan di sini: unit "Unclutter" dalam game RTS
MichaelHouse