Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Game Development
  2. Unity 2D
Gamedevelopment

Penyelesaian Perpaduan untuk Memukul Sasaran Bergerak

by
Difficulty:BeginnerLength:MediumLanguages:

Malay (Melayu) translation by Adjatay Bashroh Aldad (you can also view the original English article)

Final product image
What You'll Be Creating

Semasa membangunkan permainan yang melibatkan elemen tindakan, kita sering perlu mencari jalan untuk bertembung dengan sasaran yang bergerak. Senario sedemikian biasanya boleh dipanggil 'memukul sasaran sasaran' masalah. Ini sangat menonjol dalam permainan pertahanan menara atau perintah peluru berpandu seperti permainan. Kita mungkin perlu membuat algoritma AI atau algoritma yang dapat memikirkan gerakan dan api musuh.

Mari lihat bagaimana kita dapat menyelesaikan masalah ini, kali ini dalam Perpaduan.

1. Permainan Perintah Peluru Berpandu

Untuk tutorial khusus ini, kami akan mempertimbangkan permainan arahan peluru berpandu. Dalam permainan, kami mempunyai turet di atas tanah yang memancarkan peluru berpandu pada asteroid yang masuk. Kita tidak sepatutnya membenarkan asteroid itu memukul tanah.

Main permainan adalah berasaskan paip, di mana kita perlu mengetuk untuk menujukan turet. Dengan bantuan manusia, mekanik permainan cukup mudah kerana menara hanya perlu bertujuan dan api. Tetapi bayangkan jika turet perlu memadam secara automatik pada asteroid yang masuk.

Cabaran untuk Auto-Firing AI

Turet perlu mengetahui berapa banyak asteroid yang mendekati tanah. Sebaik sahaja ia mempunyai satu set semua asteroid mendekati, maka ia perlu melakukan analisa ancaman untuk menentukan sasaran mana yang akan dituju. Asteroid bergerak perlahan adalah ancaman yang lebih rendah daripada yang bergerak pantas. Juga, asteroid yang lebih dekat dengan tanah adalah ancaman yang pasti.

Masalah ini boleh diselesaikan dengan membandingkan kelajuan dan kedudukan asteroid masuk. Sebaik sahaja kita menentukan yang mana yang hendak disasarkan, kita mencapai masalah yang paling rumit. Bilakah api menara? Di mana sudut harus api? Bilakah patut peluru berpandu meletup selepas tembakan? Persoalan ketiga menjadi relevan kerana letupan peluru berpandu juga dapat menghancurkan asteroid dan mempunyai radius yang lebih besar juga.

Untuk memudahkan masalah ini, turet boleh membuat keputusan untuk memadamkan api dengan segera. Kemudian kita hanya perlu memikirkan sudut tembakan dan jarak letupan. Juga, mungkin ada kes di mana asteroid telah melepasi kawasan di mana ia boleh dilanda, bermakna tiada penyelesaian!

Anda harus memuat turun sumber perpaduan yang disediakan bersama dengan tutorial ini untuk melihat penyelesaian dalam tindakan. Kita akan melihat bagaimana kita memperoleh penyelesaian itu.

2. Penyelesaian

Kami akan melakukan penyegaran sedikit matematik sekolah menengah untuk mencari penyelesaian. Ia sangat mudah dan melibatkan penyelesaian persamaan kuadratik. Persamaan kuadratik kelihatan seperti ax^2 bx c = 0, di mana x adalah pembolehubah yang dapat dijumpai dan ia berlaku dengan kuasa tertinggi 2.

Menganalisa Masalah

Mari kita cuba untuk mewakili masalah kami diagrammatically.

diagram of the incoming asteroid and the predicted path of missile

Baris hijau menunjukkan laluan yang diramalkan untuk diikuti oleh asteroid. Semasa kita berhadapan dengan gerakan seragam, asteroid bergerak dengan halaju yang tetap. Turret kami perlu memutar dan melancarkan peluru berpandu di sepanjang jalan biru untuk bertembung dengan asteroid pada masa depan.

Untuk pergerakan seragam, jarak yang dilalui oleh objek adalah hasil masa dan kelajuan objek, iaitu D = T x S, di mana D bermaksud jarak, T ialah masa yang diambil untuk perjalanan D, dan S adalah kelajuan perjalanan . Dengan asumsi bahawa asteroid dan peluru berpandu kita pasti bertabrakan, kita dapat mencari jarak garis biru diikuti oleh peluru berpandu dari segi masa t. Pada masa yang sama t, asteroid kita juga akan mencapai kedudukan yang sama.

Pada dasarnya, pada masa yang sama t, asteroid akan mencapai kedudukan perlanggaran dari kedudukannya sekarang, dan peluru berpandu juga akan mencapai posisi perlanggaran yang sama pada waktu yang sama t. Maka pada masa t, kedua-dua asteroid dan peluru berpandu akan berada pada jarak yang sama dari turet kerana mereka akan berlanggar antara satu sama lain.

Masukkan Matematik

Kita boleh menyamakan jarak dari turet ke asteroid dan peluru berpandu pada masa depan masa ini t untuk mendapatkan persamaan kuadratik kami dengan variable t. Pertimbangkan dua mata pada satah dua dimensi dengan koordinat (x1, y1) dan (x2, y2). Jarak D antara mereka boleh dikira menggunakan persamaan di bawah.

Jika kita menunjuk kedudukan turret sebagai (Tx,Ty), laju peluru berpandu sebagai s dan kedudukan perlanggaran yang tidak diketahui sebagai (X,Y), maka persamaan di atas boleh ditulis semula sebagai:

di mana t adalah masa yang diambil untuk peluru berpandu untuk mengembara jarak D. Menyamakan kedua-dua, kita mendapat persamaan pertama kita untuk tidak diketahui X dan Y dengan satu lagi yang tidak diketahui t.

Kita tahu bahawa asteroid juga mencapai tempat perlanggaran yang sama (X,Y) dalam masa yang sama t, dan kita mempunyai persamaan berikut dengan menggunakan komponen mendatar dan menegak vektor halaju asteroid. Jika halaju asteroid boleh dilambangkan oleh (Vx,Vy) dan kedudukan semasa sebagai (Ax,Ay), maka X dan Y tidak diketahui seperti di bawah.

Penggantian ini dalam persamaan terdahulu memberikan kita persamaan kuadrat dengan satu t tidak diketahui.

Memperluas dan menggabungkan istilah serupa:

Mewakili kuasa dua sebagai ^2 dan simbol pendaraban sebagai * mungkin telah menjadikan rupa di atas seperti hieroglif, tetapi pada dasarnya bermuara pada persamaan kuadratik akhir ax2 bx c = 0, di mana x adalah variabel t, a adalah Vx^2 Vy^2 - s^2, b ialah 2 * (Vx * (Ax - Tx) Vy * (Ay - Ty)), dan c ialah (Ay - Ty) ^2 (Ax - Tx) ^2. Kami menggunakan persamaan di bawah dalam derivasi.

Menyelesaikan Persamaan Kuadratik

Untuk menyelesaikan persamaan kuadrat, kita perlu mengira diskriminasi D menggunakan formula:

Sekiranya diskriminasi kurang daripada 0 maka tiada penyelesaian, jika ia adalah 0 maka ada penyelesaian tunggal, dan jika ia adalah nombor positif maka terdapat dua penyelesaian. Penyelesaian dikira menggunakan formula yang diberikan di bawah.

Menggunakan formula ini, kita dapat mencari nilai-nilai untuk masa depan t apabila perlanggaran akan berlaku. Nilai negatif untuk t bermakna kita telah melepaskan peluang untuk api. Tidak diketahui X dan Y dapat dijumpai dengan menggantikan nilai t dalam persamaan masing-masing.

Sebaik sahaja kita mengetahui titik perlanggaran, kita boleh memutarkan turet kami untuk memecat peluru berpandu, yang pasti akan memukul asteroid bergerak selepas t saat.

3. Melaksanakan dalam Perpaduan

Untuk projek Unity sampel, saya telah menggunakan ciri ciptaan sprite versi Perpaduan terkini untuk mewujudkan aset pemegang tempat yang diperlukan. Ini boleh diakses dengan Cipta> Sprites> seperti yang ditunjukkan di bawah.

Implementing in Unity

Kami mempunyai skrip permainan bernama MissileCmdAI yang dilampirkan pada kamera tempat kejadian. Ia memegang rujukan kepada sprite turret, prefab peluru berpandu, dan prefab asteroid. Saya menggunakan SimplePool oleh quill18 untuk mengekalkan objek objek untuk peluru berpandu dan asteroid. Ia boleh didapati di GitHub. Terdapat skrip komponen untuk peluru berpandu dan asteroid yang dilampirkan pada pruf dan mengendalikan gerak mereka sebaik sahaja dibebaskan.

Asteroid

Asteroid secara rawak melahirkan pada ketinggian tetap tetapi kedudukan mendatar secara rawak dan dilemparkan pada kedudukan mendatar secara rawak di atas tanah dengan kelajuan rawak. Kekerapan pemijahan asteroid dikawal menggunakan AnimationCurve. Kaedah SpawnAsteroid dalam skrip MissileCmdAI kelihatan seperti di bawah:

Kaedah Pelancaran dalam kelas Asteroid ditunjukkan di bawah.

Seperti yang dilihat dalam kaedah Kemaskini, sebaik sahaja asteroid telah mengembara jarak yang telah ditetapkan ke tanah, deployDistance, ia akan kembali ke objek objeknya. Pada asasnya ini bermakna ia telah bertembung dengan alasan. Ia akan melakukan perkara yang sama sekiranya berlanggar dengan peluru berpandu.

Penargetan

Untuk penargetan auto berfungsi, kita perlu memanggil kaedah sepadan yang sering untuk mencari dan menargetkan asteroid yang masuk. Ini dilakukan dalam skrip MissileCmdAI dalam kaedah Start.

Kaedah FindTarget melompat melalui semua asteroid yang ada di tempat kejadian untuk mencari asteroid terdekat dan paling cepat. Sebaik sahaja dijumpai, ia kemudian memanggil kaedah AcquireTargetLock untuk menggunakan pengiraan kami.

AcquireTargetLock adalah tempat keajaiban terjadi apabila kita menggunakan kemahiran menyelesaikan persamaan kuadratik untuk mencari waktu perlanggaran t.

Sebaik sahaja kita menemui titik impak, kita dapat dengan mudah mengira jarak untuk peluru berpandu untuk bergerak untuk memukul asteroid, yang diteruskan melalui pemboleh ubah deployDist ke kaedah LockOn peluru berpandu. Peluru berpandu menggunakan nilai ini untuk kembali ke kolam objeknya apabila ia telah mengembara jarak ini dengan cara yang sama seperti asteroid. Sebelum ini berlaku, ia pasti akan memukul asteroid, dan kejadian perlanggaran akan dicetuskan.

Kesimpulan

Sebaik sahaja kita melaksanakannya, hasilnya kelihatan hampir ajaib. Dengan mengurangkan nilai aiPollTime, kita boleh menjadikannya turet AI yang tidak dapat dikalahkan yang akan menembak sebarang asteroid kecuali kelajuan asteroid menjadi hampir atau lebih tinggi daripada kelajuan peluru berpandu kami. Derivasi yang kita ikuti dapat digunakan untuk menyelesaikan berbagai masalah serupa yang dapat diwakili dalam bentuk persamaan kuadratik.

Saya ingin anda bereksperimen lagi dengan menambahkan kesan graviti kepada gerakan asteroid dan peluru berpandu. Ini akan mengubah usul kepada gerakan projektil, dan persamaan yang sama akan berubah. Semoga berjaya.

Perhatikan juga bahawa Perpaduan mempunyai ekonomi yang aktif. Terdapat banyak produk lain yang membantu anda membina projek anda. Sifat platform juga menjadikannya pilihan terbaik dari mana anda boleh meningkatkan kemahiran anda. Walau apa pun, anda boleh melihat apa yang kami ada di Envato Marketplace.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.