Saat saya menulis AI pertama saya

Hai, Habr. Kisah saya dimulai pada Januari 2019.

Pengembang game Tima saya dan saya memutuskan untuk mengambil proyek terbesar dalam sejarah kami, platformer 2D. Tidak, kami tidak melakukan FlappyBirds atau ular sebelumnya, tetapi jumlah pekerjaan dalam proyek ini hanya menghancurkan otak kami. Untuk memulainya, kami meninggalkan tangga vertikal yang biasa, dan mengambil tangga. Kami menulis logika untuk pintu-pintu itu, yang bisa dikunci “dengan kunci” dan mengacaukan blok yang bisa dirusak. Ada saatnya ketika perlu untuk menulis Kecerdasan Buatan. Sebagai penulis naskah paling berpengalaman dari tim kami yang tidak berpengalaman, kehormatan menulis AI jatuh kepada saya. Saya menangis di bantal, tidak mengerti apa yang harus dilakukan, saya sangat bangga bahwa saya akan menulis salah satu mekanik yang paling sulit dalam proyek kami.

Tahap 1: menemukan jalan dan bergerak di sepanjang jalan


Langkah 1.1: Menemukan Jalan

Karena lokasi utama tidak akan berada di udara terbuka, tetapi di gedung-gedung, itu perlu untuk mencari rute di antara puluhan pintu, tangga dan kamar. Setelah berpikir, pemimpin tim memutuskan bahwa itu layak dilakukan parodi tertentu dari algoritma A *, di mana kita akan memiliki node di mana bot akan berjalan. membuat adegan uji coba, meletakkan node, untuk kejelasan, menggantung SprateRenderers pada mereka. Apa yang harus dilakukan selanjutnya?

Dengan mengingat pertanyaan ini, saya berjalan selama 3 hari. Sejauh ini, salah satu kawan saya belum mengusulkan algoritma yang menarik ketika node akan bersemangat, seperti neuron otak.

Jadi Ada simpul A, di dekat sana ada AI dan simpul B, di mana AI harus datang. memberikan semua Node ID mereka dan menandai node yang terhubung yang akan mereka kirim sinyal. Setiap node memiliki variabel boolean sendiri "isChecked" dan variabel "triggeredBy", yang berisi ID dari node yang "bersemangat" itu. Jadi, ketika node B terpengaruh, itu akan melalui rantai ke simpul A, mengenali semua ID dari node yang dilewati sinyal. Jadi saya mendapatkan path dari ID dari node yang harus dilalui oleh bot. Jika Anda tiba-tiba tidak mengerti bagaimana ini bekerja, maka saya akan menceritakan sebuah kisah.
Suatu kali, Ivan tidak ada hubungannya, jadi dia memutuskan untuk membuat pohon keluarga. Sayangnya, dia tidak memiliki informasi yang cukup untuk menerjemahkan ide ini menjadi kenyataan. Ivan sangat tertarik pada gagasan ini sehingga dia memutuskan bahwa ketika dia mencapai nenek moyang utama dia akan dapat menemukan kerabatnya yang tak terduga. Ivan tahu di mana ia bisa bertemu dengan ayahnya untuk berbicara dan pergi ke sana. Ayah memberi tahu dia bahwa nama kakek Ivan adalah Ivan dan diberitahu di mana dia bisa ditemukan. Ivan menemukan Ivan, dan dia berkata bahwa kakek buyut Ivan bisa mengenal leluhur ini secara pribadi, tetapi dia sudah lama meninggal. Ivan mengabdikan separuh hidupnya untuk mempelajari ilmu hitam, tetapi pada akhirnya ia mampu membangkitkan kembali kakek buyutnya. Kakek buyut mengatakan bahwa leluhurnya adalah manusia serigala dan bahwa tubuhnya dimakamkan di tepi tiga pinus. Ivan pergi ke sana dan menemukan seorang pria sedang menggali kuburan. Ternyata pria ini adalah dua belas sepupu Ivan. Ivan sangat terkejut bahwa mereka datang ke satu tempat, tetapi saudaranya ternyata seorang programmer dan menjelaskan semuanya.

- Prinsip navigasi dari permainan favorit saya * nama * berfungsi di sini!

- Dan apa itu?

- Dari masing-masing ahli waris, Anda dapat mengunjungi orang tua yang sama dalam sistem, jika dalam sistem ini setiap pewaris secara pribadi mengenal orang tuanya.
Inilah hasilnya:



Ini adalah array variabel int yang berarti ID node yang harus dilalui unit.

Langkah 1.2.1: bergerak di sepanjang jalan

Saya punya daftar ID simpul, saya punya bot. Apa selanjutnya Dan kemudian apa yang Anda butuhkan untuk memindahkan bot di sepanjang jalan ini.

Yah, saya pikir opsi ini: bot mencapai node, memeriksa, mencari apa yang terjadi selanjutnya, pergi ke node berikutnya. Berhasil Berpenghasilan. Saya senang ... Tapi ...

Tahap 1.2.2: tangga dan interaksinya dengan AI

Seperti yang biasa dikatakan oleh seorang pahlawan kulit hitam dan putih: "Tangga ... musuh utama saya .."

Itu perlu untuk menentukan apakah simpul berikutnya berada di atas AI, di bawah atau di level. Bergantung pada informasi ini, ia akan berjalan melewati tangga (mengabaikan tabrakan), atau naik ke atasnya (berinteraksi dengan tabrakan). Oh, dan banyak sel saraf mati dalam pertempuran dengan mesin ... Saya membaca di forum bahwa Anda dapat mengatur semuanya berlapis-lapis dan di tab Edit-> Physics2D Anda dapat mengonfigurasi mengabaikan tabrakan dari satu lapisan dan lainnya. Itu semua berhasil!
Tinggal mengajarkannya membuka pintu saja. Tidak ada masalah.

Hasilnya:





Tahap 2: Emosi dan Isyarat


Tahap 2.1: Emosi

Ya, kami memutuskan untuk melampirkan emosi ... Dan isyarat.

Emosi akan disorot dengan ekspresi wajah dan animasi aksi.

Replika akan ditampilkan dengan overhead teks.

Saya mengacaukan emosi dalam sekali jalan ... Untuk ini, saya sudah membuat variabel "emotionID", yang menyimpan ID emosi. Dan di sini adalah replika ...

Langkah 2.2: Replika

Untuk kecantikan dibuatlah frase kelas yang terpisah

[System.Serializable] //      class Phrases { public string Name; // ,    public int byEmotionID; // ,      public string[] Phrases;//   } 

Membuat array kelas ini. Lebih jauh, hanya bergantung pada emotionID, saya memasukkan frasa apa pun dari daftar. Diperbarui setiap N detik.

Tetapi saya memutuskan untuk melangkah lebih jauh! Untuk setiap karakter saya membuat file dengan ekstensi .phrs, disandikan ini dengan menambahkan X byte ke nomor byte setiap karakter dalam file. Hasilnya adalah teks yang tidak dapat dibaca dan tidak dapat diubah. melakukan sesuatu seperti markupnya, membuat algoritma yang mengambil dan menerjemahkan semuanya ke dalam array ini ke dalam kelas Frasa oleh markup ini.
Hebat! Semuanya bekerja!

Saya ingin menulis sebuah program pada ketajaman yang bersih untuk mengisi file seperti itu, tetapi di sini kita pergi ke akhir cerita.

Akhirnya ..?


Kami cepat bosan dengan pekerjaan besar yang tidak dibayar ... Memasang encoder baru tidak membantu ... Tim berantakan ... Kode masih terletak di cloud Unity.

Tentu saja, belum lama ini ide untuk melanjutkan proyek mulai muncul, tetapi dengan monetisasi lebih lanjut ... Jika sesuatu berhasil, maka saya mungkin akan menulis seluruh sejarah pengembangan. Tapi di sinilah cerita saya tentang penulis naskah pemula dan AI berakhir.

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


All Articles