Membuat C # AI Sederhana di Unity

gambar

Hampir semua permainan membutuhkan kecerdasan buatan (AI) yang berinteraksi dengan pengguna, paling sering dalam bentuk kekuatan yang memusuhi pemain. Dalam beberapa kasus, AI harus membantu pemain, dalam kasus lain ia harus melawannya, tetapi semua karakter yang dikendalikan oleh komputer memiliki beberapa kesamaan. Bergantung pada persyaratan proyek, AI dapat menggunakan perilaku sederhana atau kompleks. Persyaratan tersebut dapat berupa diplomasi dengan pemain lain atau pengembaraan sederhana bolak-balik di platform. Bagaimanapun, perlu untuk memastikan bahwa AI melakukan tugasnya secara efisien.

Dalam proyek ini, saya akan menunjukkan kecerdasan buatan yang sangat sederhana. Misalkan kita membuat game di mana seorang pemain harus menyelinap di dekat markas musuh. Ketika seorang pemain diperhatikan oleh kamera keamanan, musuh dibuat di dekatnya dan untuk waktu singkat mengejar pemain. Itulah yang kami implementasikan dalam proyek pada tingkat paling sederhana. Setelah menyelesaikan proyek, Anda akan menerima objek pemain yang dikendalikan, lingkaran yang digunakan sebagai kamera musuh, dan objek musuh yang akan mengejar pemain ketika objek kamera menginformasikan tentang keberadaannya.

Persiapan


Pertama kita perlu membuat proyek 3D. Klik pada tombol Baru di bagian atas jendela setelah memulai Unity, seperti yang ditunjukkan pada Gambar 1.


Gambar 1: membuat proyek baru

Beri nama proyek AI Anda dan pastikan itu adalah proyek 3D. Setelah memilih tempat di komputer untuk menyimpan proyek, klik tombol Buat Proyek di bagian bawah, yang ditunjukkan pada Gambar 2.


Gambar 2: layar pengaturan proyek

Setelah membuat proyek, hal pertama yang perlu kita lakukan adalah mengatur folder di jendela Aset untuk mengatur pekerjaan kita. Klik kanan pada jendela Aset dan pilih Buat → Folder untuk membuat folder baru. Namai folder ini Bahan . Kemudian buat folder kedua dan beri nama Script . Gambar 3 menunjukkan bagaimana tampilannya.


Gambar 3: membuat folder baru

Setelah semua ini, jendela Aset akan terlihat seperti yang ditunjukkan pada Gambar 4.


Gambar 4: Jendela aset .

Selanjutnya, buat lantai di mana semua benda akan berdiri. Di jendela Hierarki , pilih Buat → Objek 3D → Pesawat untuk membuat objek pesawat yang akan digunakan sebagai lantai.


Gambar 5: Membuat Obyek Pesawat.

Beri nama objek Lantai ini dan ubah nilai Skala X -nya menjadi 7, dan nilai Skala Z menjadi 3. Setelah itu, jendela Inspektur dengan objek Lantai yang dipilih akan terlihat seperti yang ditunjukkan pada Gambar 6.


Gambar 6: Mengatur properti objek Floor .

Sekarang kita perlu membuat bahan baru untuk Lantai untuk membedakannya dari sisa benda yang akan ditempatkan di tempat kejadian. Dalam folder Bahan pada jendela Aset , buat materi baru dengan mengklik kanan pada jendela Aset dan pilih Buat → Bahan .


Gambar 7: membuat materi baru

Setelah selesai, beri nama Lantai bahan.


Gambar 8: Bahan lantai .

Di bagian atas jendela Inspektur dengan Lantai dipilih, pilih pemilih warna.


Gambar 9: memilih color picker.

Tentu saja, Anda dapat memilih warna apa saja untuk lantai, tetapi dalam contoh ini saya memilih merah-coklat, seperti yang ditunjukkan pada Gambar 10.


Gambar 10: color picker.

Pilih objek Lantai di jendela Hierarki , dan di komponen Mesh Renderer , pilih panah kecil di sebelah Bahan .


Gambar 11: Mempersiapkan perubahan materi.

Seret bahan Lantai dari jendela Aset ke bidang Elemen 0 komponen Mesh Renderer di jendela Inspektur .


Gambar 12: Mendefinisikan material Lantai sebagai bahan objek Lantai .

Setelah selesai dengan objek Lantai , kita harus membuat di sekitar area dinding agar pemain tidak jatuh dari tepi. Kembali ke Buat → Objek 3D → Pesawat untuk membuat bidang baru. Kami menyebutnya bidang Tembok ini dan mengaturnya ke dimensi yang sama dengan Lantai , yaitu Skala X dengan nilai Skala 7 dan Z dengan nilai 3. Kemudian buat tiga dinding lagi, pilih objek dan tekan Ctrl + D tiga kali. Setelah itu, letakkan dinding di sekitar gender sesuai dengan data dalam tabel.

Judul
Posisi X
Posisi Y
Posisi z
Rotasi x
Rotasi z
Dinding
-35
21
0
0
-90
Dinding (1)-1
11
-15
90
0
Dinding (2)
-1
11
13.5
-90
0
Dinding (3)
34
21
0
0
90

Tabel 1: Posisi dan rotasi semua objek Dinding .

Setelah menyelesaikan semua ini, Anda perlu mengubah posisi kamera sehingga terlihat di lantai dari atas. Pilih objek Kamera Utama dan atur Posisi Y ke 30, Posisi Z ke 0, dan Rotasi X ke 80.


Gambar 13: mengatur objek kamera.

Adegan sudah disiapkan, jadi sudah waktunya untuk membuat karakter pemain. Di jendela Hierarki , klik Buat → Objek 3D → Sphere untuk membuat objek sphere. Beri nama objek ini Player , lalu klik tombol Add Component di bagian bawah jendela Inspector .


Gambar 14: menambahkan komponen baru.

Sekarang temukan Rigidbody . Setelah itu, pilih komponen Rigidbody dari daftar dan tambahkan Rigidbody ke objek Player .


Gambar 15: menambahkan komponen benda tegar .

Selanjutnya, Anda perlu memberi tag pada pemain, yang nantinya akan berguna bagi kami dalam kode. Klik menu tarik-turun Tag di sudut kiri atas jendela Inspektur dan pilih tag Player .


Gambar 16: Menentukan tag baru.

Kita perlu mengatur posisi pemain agar dia tidak berada di bawah objek Lantai . Dalam contoh, saya menempatkan pemain di sudut kiri atas dengan posisi X sama dengan 26, Posisi Y sama dengan 1, dan posisi Z sama dengan -9.


Gambar 17: penempatan pemain.

Agar kode masa depan kita berfungsi dengan benar, kita tentu saja harus melampirkannya ke objek. Kembali ke jendela Hierarki dan kali ini pilih Buat → Objek 3D → Cube . Sebut kubus Guard ini, tambahkan komponen Rigidbody dan komponen Agen NavMesh dengan menggunakan tombol Add Component di jendela Inspektur . Selanjutnya, letakkan di suatu tempat di sudut kiri atas tempat kejadian. Setelah itu, jendela Inspektur objek Guard akan terlihat seperti ini:


Gambar 18: Penjaga objek di jendela Inspektur .

Dan objek ini harus diletakkan seperti ini:


Gambar 19: Penempatan objek Guard .

Akhirnya, kita membutuhkan objek yang digunakan sebagai "mata" dari objek Guard , yang akan memberi tahu Guard bahwa pemain menyentuhnya. Untuk terakhir kalinya, buka jendela Hierarchy dan pilih Create → 3D Object → Sphere untuk membuat objek sphere lainnya. Beri nama objek ini Looker . Kali ini kita tidak perlu menambahkan komponen lain ke dalamnya. Namun, kami akan mengubah ukuran objek. Setelah memilih Looker , ubah variabel komponen Transform berikut di jendela Inspektur .

  • Skala X pada 9.
  • Skala Y pada 0,5.
  • Skala Z pada 9.

Setelah itu, posisikan Penampil sehingga terletak di bagian tengah atas lantai, seperti yang ditunjukkan pada Gambar 20.


Gambar 20: Lokasi Penampil.

Ini adalah waktu yang tepat untuk memberi Looker materi yang unik sehingga Anda dapat melihat bahwa itu layak untuk dihindari. Di folder Bahan di jendela Aset , klik kanan dan buat materi baru. Beri nama Looker dan beri warna merah terang. Setelah itu, tunjuk bahan ini sebagai bahan objek Looker untuk mengubah warnanya. Setelah itu, adegannya akan terlihat seperti ini:


Gambar 21: Objek looker dengan materi baru.

Satu-satunya hal yang tersisa bagi kami adalah membuat mesh navigasi untuk Guard , yang dapat dipindahkannya. Ada menu Window di bagian atas editor Unity. Pilih Jendela → Navigasi untuk membuka jendela Navigasi seperti pada Gambar 22.


Gambar 22: Jendela navigasi .

Pilih objek Lantai di Hierarki , lalu di jendela Navigasi , pilih kotak centang Navigasi Statis .


Gambar 23: Statis Navigasi .

Selanjutnya, pilih opsi Bake di bagian atas jendela.


Gambar 24: Beralih ke menu Bake .

Menu Bake terbuka, di mana Anda dapat mengubah properti mesh navigasi yang akan kita buat. Dalam contoh kita, tidak ada yang perlu diubah. Cukup klik tombol Bake di kanan bawah.


Gambar 25: membuat jaring navigasi baru.

Pada titik ini, Unity akan meminta Anda untuk menyelamatkan tempat kejadian. Simpan, setelah itu jala navigasi akan dibuat. Sekarang adegan akan terlihat seperti ini:


Gambar 26: Adegan saat ini dengan jaring navigasi yang ditambahkan.

Sekarang semua yang ada di Unity sudah dikonfigurasikan, jadi sekarang saatnya membuat skrip yang diperlukan agar proyek berjalan. Di jendela Aset , klik kanan dan pilih Buat → C # Script . Beri nama Pemain skrip ini. Ulangi operasi ini dua kali lagi, buat skrip dengan nama Guard and Looker .


Gambar 27: membuat skrip baru.

Setelah itu, folder Script di jendela Aset akan terlihat seperti ini:


Gambar 28: Folder skrip .

Pertama, kita akan mulai menulis kode skrip Player . Klik dua kali skrip Player di jendela Aset untuk membuka Visual Studio dan mulai membuat kode.

Kode


Skrip Player cukup sederhana, yang dilakukannya adalah membiarkan pengguna memindahkan objek bola. Di bawah deklarasi kelas, kita perlu mendapatkan tautan ke komponen Rigidbody yang sebelumnya kita buat dalam proyek.

private Rigidbody rb; 

Tepat setelah itu, dalam fungsi Mulai , kami memerintahkan Unity untuk mengatur komponen Rigidbody saat ini dari objek Player ke rb .

 rb = GetComponent<Rigidbody>(); 

Setelah itu, skrip Player akan terlihat seperti ini:


Gambar 29: Skrip pemain saat ini.

Sekarang setelah nilai rb ditetapkan, kita perlu membiarkan objek Player bergerak ketika kita menekan tombol panah. Untuk memindahkan objek, kita akan menggunakan fisika, menerapkan gaya ke objek ketika pengguna menekan tombol panah. Untuk melakukan ini, cukup tambahkan kode berikut ke fungsi Pembaruan :

 if (Input.GetKey(KeyCode.UpArrow)) rb.AddForce(Vector3.forward * 20); if (Input.GetKey(KeyCode.DownArrow)) rb.AddForce(Vector3.back * 20); if (Input.GetKey(KeyCode.LeftArrow)) rb.AddForce(Vector3.left * 20); if (Input.GetKey(KeyCode.RightArrow)) rb.AddForce(Vector3.right * 20); 

Dengan ini kami telah menyelesaikan skrip Player . Script yang sudah selesai akan terlihat seperti ini:


Gambar 30: skrip Player jadi.

Simpan pekerjaan Anda dan kembali ke Unity. Kali ini, pilih skrip Penjaga di jendela Aset . Untuk membuat kode Guard berfungsi, Anda perlu menambahkan konstruk penggunaan ke bagian atas skrip.

 using UnityEngine.AI; 

Selanjutnya, deklarasikan variabel berikut segera setelah deklarasi kelas.

 public GameObject player; private NavMeshAgent navmesh; 

Objek Player digunakan sebagai nilai variabel pemain dari objek Guard . Ini akan berguna nanti ketika kita memerintahkan objek Guard untuk mengejar pemain. Kemudian variabel navmesh dinyatakan menerima komponen NavMeshAgent dari objek. Kami akan menggunakannya nanti ketika Penjaga mulai mengejar pemain setelah ia mengetahui bahwa pemain itu menyentuh objek Penampil . Dalam fungsi Mulai , kita perlu mengatur nilai variabel navmesh ke komponen NavMesh Agent objek:

 navmesh = GetComponent<NavMeshAgent>(); 

Kemudian, dalam fungsi Pembaruan , kami menambahkan satu baris kode:

 navmesh.destination = player.transform.position; 

Baris ini menetapkan tujuan untuk objek Guard . Dalam kasus kami, ini akan mengambil posisi saat ini dari objek Player dan pindah ke titik ini. Setelah operasi, objek akan terus mengejar pemain. Pertanyaannya adalah, bagaimana proses respon dilakukan? Itu tidak akan dikodekan dalam skrip Guard , tetapi dalam skrip Looker . Sebelum beralih ke script Looker, lihat Gambar 31 untuk memverifikasi kode skrip Guard Anda.


Gambar 31: skrip Guard yang sudah jadi.

Di dalam Looker, kita perlu mendeklarasikan variabel berikut:

 public GameObject guard; private float reset = 5; private bool movingDown; 

Setelah itu, kami mengomentari fungsi Mulai , yang tidak kami butuhkan dalam skrip ini. Mari beralih ke fungsi Perbarui dan tambahkan kode berikut:

 if (movingDown == false) transform.position -= new Vector3(0, 0, 0.1f); else transform.position += new Vector3(0, 0, 0.1f); if (transform.position.z > 10) movingDown = false; else if (transform.position.z < -10) movingDown = true; reset -= Time.deltaTime; if (reset < 0) { guard.GetComponent<Guard>().enabled = false; GetComponent<SphereCollider>().enabled = true; } 

Di sinilah tindakan utama proyek berlangsung, jadi mari kita menganalisis kodenya. Pertama, tergantung pada nilai dari variabel boolean movingDown , objek yang dilampirkan skrip ini akan bergerak ke atas atau ke bawah. Begitu dia mencapai titik tertentu, dia akan mengubah arah. Selanjutnya, Looker akan menurunkan nilai reset berdasarkan waktu nyata. Begitu penghitung waktu menjadi kurang dari nol, ia akan mengambil skrip Guard dari objek Guard dan menonaktifkannya, setelah itu objek Guard akan mulai bergerak ke posisi terakhir yang diketahui pemain hingga saat ini, dan kemudian berhenti. Looker juga menyalakan collider-nya lagi sehingga seluruh proses dapat dimulai kembali. Sekarang skrip kami terlihat seperti ini:


Gambar 32: Script looker .

Berbicara tentang colliders: sekarang saatnya untuk membuat kode konflik yang mengatur ulang timer Looker dan menyertakan skrip Guard . Di fungsi Perbarui , buat kode berikut:

 private void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Player") { guard.GetComponent<Guard>().enabled = true; reset = 5; GetComponent<SphereCollider>().enabled = false; } } 

OnCollisionEnter Unity secara otomatis mengenalinya sebagai kode tumbukan, dan karenanya mengeksekusi ketika tumbukan terjadi dengan objek lain. Dalam kasus kami, ini pertama-tama memeriksa untuk melihat apakah objek yang bertabrakan memiliki tag Player . Jika tidak, ia mengabaikan sisa kode. Jika tidak, ini akan mengaktifkan skrip Guard , mengatur timer reset ke 5 (mis., Lima detik), dan menonaktifkan collider-nya sehingga pemain masih bisa bergerak melalui objek dan tidak secara tidak sengaja tersangkut di objek Looker . Fungsi ini ditunjukkan pada Gambar 33.


Gambar 33: Kode tabrakan untuk Looker.

Itu semua kode proyek sudah siap! Anda dapat melakukan beberapa hal lagi sebelum menyelesaikan proyek. Simpan semua pekerjaan dan kembali ke Unity.

Penyelesaian proyek


Untuk menyelesaikan proyek, kita hanya perlu melampirkan skrip ke objek yang sesuai dan mengatur beberapa variabel. Pertama, pergi dari jendela Navigasi ke jendela Inspektur :


Gambar 34: transisi ke jendela Inspektur.

Setelah itu, mari kita mulai dengan objek Player . Pilih di jendela Hierarchy , dan kemudian di bagian bawah jendela Inspektur klik pada tombol Add Component dan tambahkan skrip Player . Ini melengkapi objek Player .


Gambar 35: Komponen skrip pemain.

Selanjutnya, pilih objek Guard . Seperti sebelumnya, lampirkan skrip Guard ke objek. Kali ini kita perlu memberi tahu Guard siapa pemainnya. Untuk melakukan ini, seret objek Player dari Hierarki ke dalam bidang Player dari komponen skrip Guard , seperti yang ditunjukkan pada Gambar 36.


Gambar 36: Membuat objek Player nilai dari bidang Player .

Kita juga perlu menonaktifkan skrip Guard . Dalam proyek kami, Guard akan mengejar pemain setelah menyalakan skripnya. Script Guard ini harus dimasukkan hanya setelah pemain menyentuh objek Looker . Yang perlu Anda lakukan adalah hapus centang pada kotak di sebelah teks Guard (Script) di komponen:


Gambar 37: Menonaktifkan skrip Guard .

Akhirnya, mari kita beralih ke objek Looker dan lampirkan script Looker ke sana. Kali ini, objek Looker akan membutuhkan objek Guard sebagai nilai variabel Guard -nya. Sama seperti kita menetapkan objek Player ke variabel Player dari skrip Guard , kita akan melakukan hal yang sama dengan objek Guard dan skrip Looker . Seret Penjaga dari Hirarki ke bidang Penjaga skrip Penampil . Dan proyek selesai! Klik tombol Play di bagian atas editor Unity untuk menguji proyek Anda.


Gambar 38: Menguji suatu proyek.

Coba pindahkan objek Player ke objek Looker (ingat bahwa pemindahan dilakukan dengan panah!). Perhatikan bahwa setelah ini, objek Guard akan mulai mengejar pemain. Dia akan melanjutkan pengejaran selama sekitar 5 detik, setelah itu dia akan menyerah.


Gambar 39: Proyek yang sepenuhnya selesai dalam aksi.

Kesimpulan


AI ini sangat sederhana, tetapi dapat dengan mudah diperluas. Misalkan, jika kita membayangkan bahwa objek Looker adalah kamera, dan penjaga melihat melalui itu untuk menemukan Anda, itu akan logis untuk memberikan objek Guard sepasang mata sendiri. Pemain bisa pergi dekat kamera, tetapi mereka harus memperhitungkan mata penjaga. Anda juga dapat menggabungkan proyek ini dengan konsep menemukan jalan : berikan penjaga jalan yang akan ia ikuti, sehingga menciptakan lingkungan yang lebih menarik bagi pemain.

AI sederhana seperti itu dapat dikembangkan dengan berbagai cara. Anda mungkin tidak ingin melakukan apa pun di atas dan memutuskan untuk melakukan sesuatu sendiri. Saya menyarankan Anda untuk bereksperimen, mungkin Anda akan memiliki ide proyek yang menarik, yang layak untuk diselesaikan.

Source: https://habr.com/ru/post/id419641/


All Articles