Halo! Nama saya Vladimir Popov dan saya adalah pengembang klien di proyek Robot Perang.
Robot Perang telah ada selama beberapa tahun: selama ini, lusinan mekanisme baru telah muncul di dalam game. Dan, tentu saja, tidak ada dari mereka yang unik tanpa kemampuan mereka sendiri.
Saya akan memberi tahu Anda di artikel ini bagaimana sistem kemampuan dalam permainan kami bekerja dan bagaimana itu berkembang, secara sederhana dan tanpa rincian teknis.
Pertama, mari selami sejarah dan lihat implementasi lama - sekarang tidak lagi digunakan pada proyek.
Kemampuan lama sangat sepele: mereka memiliki satu komponen yang digantung di robot. Itu adalah konstruksi monolitik di mana pemrogram sepenuhnya menggambarkan bagaimana kemampuan bekerja: alirannya, bagaimana dan dengan apa ia berinteraksi. Semua logika dijelaskan di dalam satu komponen, yang mana desainer game dapat dengan mudah bergantung pada robot dan menyesuaikan parameternya. Tidak ada cara untuk mengubah kemampuan aliran - desainer game hanya dapat mengubah parameter dan pengaturan waktu.
Kemampuan lama hanya bisa ada di dua kondisi: aktif dan tidak aktif. Setiap negara bagian dapat diberikan tindakannya sendiri.
Perhatikan contoh ability Jammer. Dia pernah menjadi robot Stalker. Dia bekerja sebagai berikut:
- Jika kemampuan aktif, animasi diputar dan robot memasuki status Jammer. Dalam keadaan ini, robot tidak dapat ditargetkan.
- Jika kemampuannya tidak aktif, tidak ada yang terjadi.
- Ketika Anda mencoba untuk mengaktifkan kemampuan, ini akan diperiksa apakah lebih dari n detik telah berlalu sejak aktivasi terakhir.
- Penonaktifan terjadi secara otomatis setelah m detik.
Untuk waktu yang lama, fungsi ini sudah cukup bagi kami. Namun seiring waktu, semuanya berubah: baik perancang game maupun pemrogram tidak lagi puas dengan pendekatan ini. Sulit bagi pemrogram untuk mempertahankan kemampuan seperti itu, karena kodenya menjadi mengerikan - dengan rantai warisan yang sangat panjang, di mana setiap situasi harus dijelaskan. Desainer game tidak memiliki fleksibilitas sistem. Artinya, demi perubahan apa pun dalam kemampuan, mereka harus memesan revisi dari pemrogram, meskipun fungsionalitas yang persis sama ada dalam kemampuan yang berdekatan.
Kemudian kami menyadari bahwa kami perlu mengubah sesuatu. Dan mereka mengembangkan sistem baru. Di dalamnya, setiap kemampuan mulai direpresentasikan sebagai sekumpulan beberapa objek terkait. Fungsi itu dibagi menjadi negara bagian, kemampuan dan komponen negara bagian.
Bagaimana itu bekerja?
Kemampuan apa pun memiliki master . Ini adalah objek utamanya. Ini menghubungkan objek kemampuan lainnya ke dunia luar dan sebaliknya. Dan dia juga membuat semua keputusan utama. Bisa ada sejumlah
negara bagian . Intinya, status di sini tidak jauh berbeda dengan status "aktif" / "tidak aktif" di versi lama. Tapi sekarang jumlahnya bisa berapa saja, dan tujuannya menjadi lebih abstrak. Hanya satu negara bagian yang dapat aktif dalam satu waktu.
Inovasi utama dari sistem lama adalah komponennya . Komponen menjelaskan beberapa jenis tindakan. Setiap negara bagian dapat memiliki sejumlah komponen.
Bagaimana cara kerja kemampuan baru?
Kemampuan tersebut hanya dapat berada di salah satu negara bagian pada satu waktu. Master terlibat dalam mengubahnya. Komponen yang ditautkan ke status bereaksi terhadap aktivasi / penonaktifan status dan, bergantung pada ini, dapat mulai melakukan tindakan atau berhenti menjalankannya.
Semua objek sekarang dapat disesuaikan. Perancang permainan dapat mencampur status dan komponen satu sama lain dengan cara apa pun dan dengan demikian mendapatkan kemampuan baru dari blok yang telah dipasang sebelumnya. Pemrogram sekarang hanya diperlukan untuk membuat komponen atau status baru, yang sangat memudahkan penulisan kode. Sekarang mereka bekerja dengan entitas kecil, mendeskripsikan beberapa elemen sederhana dan tidak mengumpulkan kemampuan itu sendiri - desainer game mulai melakukan ini.
Arus menjadi seperti ini:
- Master mengaktifkan negara bagian pertama;
- ;
- ;
- ;
- ;
- ;
- .
Selanjutnya, prosedur ini diulangi lagi dan lagi. Untuk kemudahan penggunaan, keadaan tidak hanya wadah untuk komponen, tetapi juga menentukan kapan harus beralih ke keadaan lain dan meminta master untuk beralih.
Seiring waktu, ini menjadi tidak cukup bagi kami, dan skema kemampuannya diubah menjadi bentuk berikut:
Master, status, dan komponen tetap di tempatnya, tetapi elemen baru ditambahkan ke dalamnya.
Hal pertama yang menarik perhatian Anda adalah kami telah menambahkan ketentuan ke setiap status dan komponen. Untuk negara bagian, mereka menetapkan persyaratan tambahan untuk meninggalkan negara bagian. Untuk komponen, mereka menentukan apakah komponen dapat melakukan aksinya.
Wadah muatan (muatan) berisi muatan, mengisi ulang, menghentikan pengisian bila perlu, dan memberikan biaya ke negara bagian untuk digunakan.
Pengatur waktu digunakan ketika beberapa negara bagian harus memiliki waktu eksekusi yang sama, tetapi waktu pelaksanaannya sendiri tidak ditentukan.
Penting untuk dicatat bahwa semua objek ability bersifat opsional. Secara teknis, hanya master dan satu negara yang cukup untuk kemampuan bekerja.
Tidak banyak kemampuan yang dirakit sepenuhnya tanpa keterlibatan pemrogram, tetapi pengembangan secara umum menjadi terasa lebih murah, karena pemrogram sekarang menulis hal-hal yang sangat kecil: misalnya, satu status baru atau dua komponen, sisanya digunakan kembali.
Mari kita rangkum apa saja bagian dari kemampuan yang kita miliki dan apa itu:
- Master bertindak sebagai mesin negara. Ini memberi negara bagian dan komponen informasi tentang dunia, dan dunia - informasi tentang suatu kemampuan. Master berfungsi sebagai penghubung antara status, komponen, dan bagian layanan dari suatu kemampuan: biaya dan timer eksternal.
- Status mendengarkan perintah untuk aktivasi dan deaktivasi dari master dan, karenanya, mengaktifkan dan menonaktifkan komponen, dan juga meminta master untuk beralih ke status lain. Negara memutuskan kapan dia perlu beralih ke yang berikutnya. Untuk melakukan ini, dia menggunakan kondisi internalnya: apakah pemain mengklik tombol kemampuan, apakah waktu tertentu telah berlalu sejak pengaktifan status, dll. - dan kondisi eksternal yang terkait dengan status.
- : . : , , .
- , , . . , . , . â , .
- Wadah muatan berisi muatan, mengisinya kembali, berhenti mengisi ulang bila diperlukan, dan memberikan biaya kepada negara bagian. Ini digunakan dalam kemampuan multi-charge ketika Anda perlu memberi pemain kesempatan untuk menggunakannya beberapa kali, tetapi tidak lebih dari n kali berturut-turut.
- Pengatur waktu digunakan ketika beberapa status memiliki durasi yang sama, tetapi tidak diketahui berapa lama masing-masing status tersebut valid. Setiap negara bagian dapat memulai timer selama n detik. Semua negara bagian yang tertarik berlangganan acara tentang akhir timer dan melakukan sesuatu saat berakhir.
Sekarang mari kembali ke diagram kemampuan. Bagaimana dia mulai bertindak?
- Di awal permainan, master memilih status pertama dan mengaktifkannya;
- Negara mengaktifkan semua komponennya;
- ;
- ;
- , ;
- ;
- .
Negara dapat menggunakan biaya sebagai kondisi transisi tambahan. Jika transisi seperti itu terjadi, jumlah tagihan berkurang. Selain itu, negara bagian dapat menggunakan timer umum. Dalam hal ini, total waktu pelaksanaannya akan ditentukan oleh pengatur waktu, dan setiap status dapat berlangsung kapan saja.
Kami tidak menemukan sesuatu yang benar-benar baru untuk UI. Ini diatur seperti ini dengan kami.
The Master memiliki UI sendiri. Ini mendefinisikan beberapa elemen yang harus selalu ada di UI dan tidak bergantung pada status mana yang saat ini aktif.
Setiap negara bagianada pasangan di UI. UI negara hanya ditampilkan ketika statusnya aktif. Dia menerima data tentang keadaannya dan dapat menampilkannya dengan satu atau lain cara. Misalnya, status durasi biasanya memiliki bilah dan teks di UI-nya yang menunjukkan waktu yang tersisa.
Dalam kasus ketika negara menunggu perintah eksternal untuk melanjutkan kemampuan, UI-nya menampilkan tombol. Dan menekannya mengirimkan perintah ke negara bagian.
Sekarang mari kita lihat hasil kerja kemampuan menggunakan contoh spesifik. Mari kita mulai dengan robot bernama Inquisitor.
Kami memiliki empat negara bagian yang berubah satu demi satu. Di atas negara bagian, Anda dapat melihat tampilannya di UI. Di dua di antaranya, Anda dapat melihat komponen yang merujuk padanya. Dua kondisi lainnya tidak memiliki komponen.
Alur kerja kemampuan:
- WaitForClick. .
- , . WaitForGrounded.
- . , . , , Jammer, .
- .
- : Sound Jammer, Shake, n.
- Duration, n , .
- Duration, : .
- Setelah selesai, kemampuan kembali ke kondisi pertama.
Contoh lainnya adalah Phantom. Banyak yang terjadi di sini mirip dengan Inkuisitor, tetapi masih ada beberapa nuansa:
- Kami mulai dengan WaitForClick.
- Kemudian Durasi, di mana teleportasi diatur, statistik mekanisme diubah, suara dan animasi dimainkan.
- Setelah itu - DurationOrClick, di mana statistik bulu diubah, animasi dan FX dimainkan.
- Jika klik dibuat, kita pergi ke Durasi lain, di mana teleportasi bulu, perubahan statistik, animasi, FX, dan suara dimainkan.
- Setelah keadaan ini atau setelah akhir waktu DurationOrClick, kita pergi ke Duration.
Perbedaan utamanya adalah bahwa status bercabang muncul di sini. DurationOrClick pergi ke status a , jika waktu yang ditentukan telah berlalu, atau ke negara b , jika pemain berhasil mengklik tombol kemampuan sebelumnya.
Dengan demikian, tampaknya sistem kami telah berevolusi dari yang sederhana menjadi kompleks, tetapi dengan demikian menyederhanakan kehidupan programmer dan desainer game. Bantuan yang pertama sekarang sangat dibutuhkan saat menambahkan komponen kecil, sedangkan yang terakhir telah menerima otonomi yang lebih besar dan sekarang dapat secara mandiri mengumpulkan kemampuan baru dari negara bagian dan komponen yang ada. Pada saat yang sama, para pemain juga menerima keuntungan dalam bentuk kemampuan mekanisme yang lebih beragam dan kompleks.