Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Unity 2D

Kesatuan solusi untuk memukul target bergerak

by
Difficulty:BeginnerLength:MediumLanguages:

Indonesian (Bahasa Indonesia) translation by Ade Khairul Umam (you can also view the original English article)

Final product image
What You'll Be Creating

Ketika mengembangkan permainan yang melibatkan unsur tindakan, seringkali kita perlu mencari cara berbenturan dengan target yang bergerak. Skenario seperti dapat biasanya disebut 'memukul bergerak menargetkan' masalah. Ini terutama menonjol di menara pertahanan permainan atau rudal perintah seperti permainan. Kami mungkin perlu untuk membuat AI atau algoritma yang dapat mengetahui musuh gerak dan api itu.

Mari kita lihat bagaimana kita dapat memecahkan masalah khusus ini, kali ini dalam kesatuan.

1. permainan perintah rudal

Untuk tutorial ini tertentu, kami akan mempertimbangkan permainan perintah rudal. Dalam permainan kami memiliki sebuah menara di tanah yang kebakaran rudal di sebuah asteroid masuk. Kita tidak boleh membiarkan sebuah asteroid untuk jatuh ke tanah.

Bermain game ini berbasis keran, dimana kita perlu tekan untuk tujuan kubah meriam. Dengan bantuan manusia, mekanika gamenya cukup sederhana seperti kubah hanya perlu mengarahkan dan api. Tapi bayangkan jika turet perlu secara otomatis kebakaran di masuk Asteroid.

Tantangan untuk Auto-menembak AI

Turet kebutuhan untuk mengetahui berapa banyak asteroid mendekati tanah. Sekali memiliki seperangkat semua mendekati asteroid, maka akan perlu untuk melakukan analisis ancaman untuk menentukan mana yang ingin menargetkan. Asteroid bergerak lambat adalah ancaman yang lebih rendah daripada yang bergerak cepat. Juga, sebuah asteroid yang lebih dekat ke tanah adalah suatu ancaman juga.

Masalah ini dapat diselesaikan dengan membandingkan kecepatan dan posisi dari masuk Asteroid. Setelah kita telah menentukan mana yang untuk menargetkan, kita mencapai paling rumit masalah. Kapan harus kubah meriam api? Pada sudut yang harus itu api? Bila rudal diatur untuk meledak setelah penembakan? Pertanyaan ketiga menjadi relevan karena ledakan rudal juga dapat menghancurkan asteroid dan memiliki radius lebih besar efek serta.

Untuk menyederhanakan masalah, kubah dapat memutuskan untuk api segera. Maka kita perlu untuk hanya mengetahui sudut penembakan dan jarak detonasi. Juga, mungkin ada kasus yang mana asteroid telah melewati daerah mana itu bisa memukul, berarti ada solusi!

Anda harus men-download sumber kesatuan yang disediakan dengan tutorial ini untuk melihat solusi dalam tindakan. Kita akan melihat cara kami memperoleh solusi itu.

2 solusi.

Kami akan melakukan sedikit penyegaran kami matematika SMA untuk menemukan solusi. Ini sangat mudah dan melibatkan memecahkan persamaan kuadrat. Persamaan kuadrat terlihat seperti axˆ2 + bx + c = 0, dimana x adalah variabel dapat ditemukan dan itu terjadi dengan kekuatan tertinggi 2.

Menganalisis masalah

Mari kita mencoba untuk mewakili masalah kita dengan Rajah.

diagram of the incoming asteroid and the predicted path of missile

Jalur hijau menunjukkan jalan yang diperkirakan akan diikuti oleh asteroid. Karena kita berhadapan dengan seragam gerak, asteroid bergerak dengan kecepatan konstan. Turet kami akan perlu memutar dan api rudal sepanjang jalur biru untuk bertabrakan dengan asteroid di masa.

Seragam gerak, jarak bepergian dengan objek adalah produk dari waktu dan kecepatan objek, yaitu D = T x S, mana D singkatan dari jarak, T adalah masa yang diambil untuk perjalanan D, dan S adalah kecepatan perjalanan. Dengan asumsi bahwa kami asteroid dan rudal pasti akan bertabrakan, kita dapat menemukan jarak garis biru diikuti oleh rudal dalam hal waktu t. Dalam waktu sama t, asteroid kami juga akan mencapai posisi yang sama.

Pada dasarnya, di waktu sama t, asteroid akan mencapai posisi tabrakan dari posisinya sekarang, dan rudal juga akan mencapai posisi tabrakan yang sama di waktu sama t. Jadi pada waktu t, asteroid dan rudal akan di jarak yang sama dari kubah sebagai mereka akan bertabrakan dengan satu sama lain.

Masukkan matematika

Kita dapat menyamakan jarak dari kubah ke asteroid dan rudal ini masa depan waktu t untuk memperoleh kami Persamaan kuadrat dengan t variabel. Pertimbangkan dua titik pada dua dimensi pesawat dengan Koordinat (x1, y1) dan (x 2, y2). Jarak D antara mereka dapat dihitung dengan rumus sebagai berikut.

Jika kita menunjukkan posisi turret sebagai (Tx, Ty), rudal kecepatan sebagai s dan tidak diketahui tumbukan posisi sebagai (X, Y), maka persamaan di atas dapat ditulis ulang seperti:

mana t masa yang diambil untuk rudal untuk perjalanan jarak D. Equating kedua, kita mendapatkan persamaan pertama kami untuk tidak diketahui X dan Y dengan t lain tidak diketahui.

Kita tahu bahwa asteroid juga mencapai tempat tabrakan yang sama (X, Y) dalam waktu sama t, dan kami memiliki persamaan berikut yang menggunakan komponen horisontal dan vertikal asteroid kecepatan vektor. Jika kecepatan asteroid dapat dilambangkan oleh (Vx, Vy) dan saat ini posisi sebagai (kapak, Ay), maka diketahui X dan Y dapat ditemukan sebagai berikut.

Mengganti ini dalam persamaan sebelumnya memberi kita Persamaan kuadrat dengan t tidak diketahui tunggal.

Memperluas dan menggabungkan istilah yang serupa:

Mewakili kekuatan dua sebagai ˆ2 dan simbol perkalian sebagai * mungkin telah membuat di atas terlihat seperti hieroglif, tetapi pada dasarnya mendidih ke akhir Persamaan kuadrat axˆ2 + bx + c = 0, dimana x adalah t variabel, adalah Vxˆ2 + Vyˆ2 - sˆ2, b 2 * (Vx * (Ax - Tx) + VY* (Ay - Ty)), dan c (Ay - Ty) ˆ2 + (Ax - Tx) ˆ2. Kami menggunakan persamaan di bawah ini di derivasi.

Memecahkan Persamaan kuadrat

Memecahkan Persamaan kuadrat, kita perlu menghitung diskriminan D menggunakan rumus:

Jika diskriminan kurang dari 0 kemudian ada solusi, jika 0 maka ada solusi tunggal, dan jika sejumlah positif maka ada dua solusi. Solusi dihitung dengan menggunakan formula yang diberikan di bawah ini.

Menggunakan formula ini, kita dapat menemukan nilai-nilai untuk t masa ketika tumbukan akan terjadi. Nilai negatif untuk t berarti kita telah melewatkan kesempatan untuk api. Yang tidak diketahui X dan Y dapat ditemukan dengan mengganti nilai t dalam persamaan masing-masing mereka.

Setelah kita mengetahui tumbukan titik, kita dapat memutar kami menara api peluru kendali itu, yang pasti akan memukul asteroid bergerak setelah t secs.

3. melaksanakan dalam kesatuan

Untuk sampel persatuan proyek, saya telah menggunakan fitur pembuatan sprite kesatuan versi terbaru untuk menciptakan pengganti diperlukan aset. Ini dapat diakses dengan membuat > sprite > seperti ditunjukkan di bawah.

Implementing in Unity

Kami memiliki skrip permainan bernama MissileCmdAI yang melekat pada adegan kamera. Ini memegang referensi ke Menara sprite, rudal cetakan, dan asteroid cetakan. Saya menggunakan SimplePool oleh quill18 untuk menjaga kolam objek untuk rudal dan asteroid. Hal ini dapat ditemukan pada GitHub. Ada komponen skrip untuk rudal dan asteroid yang melekat pada prefabs mereka dan menangani gerakan mereka sekali dilepaskan.

Asteroid

Asteroid secara acak melahirkan tetap tinggi tapi posisi horizontal acak dan dilontarkan pada posisi horisontal acak di tanah dengan kecepatan acak. Frekuensi asteroid pemijahan dikendalikan menggunakan AnimationCurve. Metode SpawnAsteroid dalam naskah MissileCmdAI terlihat sebagai berikut:

Metode peluncuran di kelas Asteroid yang ditunjukkan di bawah.

Seperti yang terlihat dalam metode Update, setelah asteroid telah bepergian jarak telah ditetapkan ke tanah, deployDistance, itu akan kembali ke kolam objek. Pada dasarnya ini berarti telah bertabrakan dengan tanah. Ini akan melakukan hal yang sama pada acara tabrakan dengan rudal.

Penargetan

Dalam rangka untuk auto-penargetan untuk bekerja, kita perlu untuk memanggil method tersebut sering untuk menemukan dan target masuk asteroid. Hal ini dilakukan dalam MissileCmdAI script di metode mulai.

Metode FindTarget loop melalui semua asteroid hadir dalam adegan untuk menemukan asteroid terdekat dan tercepat. Setelah ditemukan, itu kemudian memanggil metode AcquireTargetLock untuk menerapkan perhitungan kami.

AcquireTargetLock adalah mana keajaiban terjadi ketika kami mengajukan keterampilan memecahkan persamaan kuadrat kita untuk menemukan waktu t tabrakan.

Setelah kita menemukan titik dampak, kita dapat dengan mudah menghitung jarak untuk misil untuk melakukan perjalanan untuk mencapai asteroid, yang diteruskan melalui variabel deployDist ke metode LockOn dari rudal. Rudal menggunakan nilai ini untuk kembali ke kolam objeknya setelah menempuh jarak ini dengan cara yang sama seperti asteroid. Sebelum ini terjadi, itu pasti akan menabrak asteroid, dan peristiwa tabrakan akan dipicu.

Kesimpulan

Setelah kami menerapkannya, hasilnya terlihat hampir ajaib. Dengan mengurangi nilai aiPollTime, kita dapat membuatnya menjadi turret AI yang tak terkalahkan yang akan menembak jatuh asteroid apa pun kecuali kecepatan asteroid mendekati atau lebih tinggi dari kecepatan rudal kita. Derivasi yang kami ikuti dapat digunakan untuk memecahkan berbagai masalah serupa yang dapat direpresentasikan dalam bentuk persamaan kuadrat.

Saya ingin Anda bereksperimen lebih lanjut dengan menambahkan efek gravitasi ke gerakan asteroid dan rudal. Ini akan mengubah gerakan menjadi gerakan proyektil, dan persamaan yang sesuai akan berubah. Semoga berhasil.

Perhatikan juga bahwa Unity memiliki ekonomi aktif. Ada banyak produk lain yang membantu Anda membangun proyek Anda. Sifat dari platform juga menjadikannya pilihan yang bagus dari mana Anda dapat meningkatkan keterampilan Anda. Apapun masalahnya, Anda dapat melihat apa yang kami miliki di Envato Marketplace.

Advertisement
Advertisement
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.