Jadi, saya mulai memperkenalkan serangan ke ruang 2D RTS kami (Ini di Unity, jadi komponennya didorong). Awalnya itu sesederhana "musuh dalam jangkauan, kerusakan diterapkan". Namun akan ada beberapa "jenis" senjata / serangan yang terkait dengan kapal atau struktur khusus mereka. Serta faktor-faktor lain yang terlibat di masa lalu hanya kerusakan mentah seperti jenis kerusakan, dan mungkin inersia di masa depan.
Apakah kalian memiliki setiap unit dan tipe struktur memiliki tipe serangan itu sendiri. Berarti Anda membuat skrip untuk setiap unit / struktur yang menentukan jenis serangan, kerusakan, efek, jarak, partikel, sprite ... dll. Dan pasang itu sebagai komponen?
Atau buat skrip yang mendefinisikan jenis serangan, skrip untuk jenis proyektil yang terkait dengan itu ... dll. Dan kemudian perluas itu dan modifikasi itu untuk setiap unit, lampirkan setiap skrip ke unit / struktur.
Saya harap saya masuk akal, saya sudah merenungkan ini begitu lama saya tidak yakin apakah saya memecahkan masalah, atau hanya membuat masalah saya sendiri dan menggali diri saya ke dalam lubang.
Ketika Anda memiliki permainan yang dapat memiliki banyak jenis serangan yang mungkin atau mungkin tidak terbatas pada unit / struktur tertentu, bagaimana Anda mendesain kerangka kerja yang mengikat itu bersama-sama dengan unit / struktur tertentu dalam lingkungan desain yang digerakkan oleh komponen ?
Jika ini tidak cukup jelas, beri tahu saya.
Sunting: Jawaban yang bagus, terima kasih.
Pertanyaan yang Diperluas:
Jawabannya tampaknya bervariasi dari "setiap objek dapat memiliki skrip serangannya sendiri" hingga "Memiliki jenis serangan sebagai skrip mereka sendiri dan menetapkan bahwa untuk setiap objek untuk solusi yang lebih dapat digunakan kembali". Katakanlah saya memiliki serangan "blaster", ia menembakkan proyektil merah pada kecepatan tertentu. Kerusakan, laju kebakaran, dan ukuran proyektil tergantung pada unit yang menembaknya. Apakah lebih baik membuat skrip serangan untuk unit itu, atau mencoba dan memodifikasi "serangan blaster" agar sesuai dengan tujuan setiap unit yang ingin menggunakannya?
sumber
Jawaban:
Yah, sejujurnya saya bukan ahli dalam hal ini tapi ... Saya pikir itu tergantung pada seberapa kompleks dan beragamnya Anda pikir serangan akan terjadi. Karena ini adalah RTS, saya kira Anda akan memiliki unit atau struktur yang mungkin 10-50 atau lebih berbeda dengan tipe serangan mereka sendiri.
Opsi 1: Jika ada jumlah unit yang relatif rendah yang akan memiliki serangan yang agak mirip, saya hanya akan meletakkan semuanya dalam satu skrip besar dan menentukan parameter yang digunakan dalam inspektur.
Opsi 2: Jika, di sisi lain Anda membayangkan sejumlah besar tipe serangan dengan perilaku berbeda, Anda dapat memecah semuanya sehingga setiap unit dan bangunan mendapatkan skrip serangan unik mereka sendiri. Saya berpikir bahwa jika Anda melakukan ini, Anda mungkin ingin membuat skrip "helper" yang mendefinisikan potongan kode yang biasa digunakan yang dapat diambil oleh banyak skrip individual. Dengan cara ini Anda tidak perlu menulis ulang semuanya dan Anda akan tahu di mana semuanya berada.
Opsi 3: Apa yang Anda mungkin tidak boleh lakukan adalah memiliki pengelompokan skrip berbagi unit tertentu, ini akan membingungkan Anda dan akan menjadi berantakan jika kode yang Anda perlukan untuk serangan ada dalam 10 skrip berbeda.
Di sini, saya menggambar Anda.
sumber
"Here, I drew you a picture."
mengingatkan saya pada iniSaya tidak tahu banyak tentang Unity dan saya belum melakukan pengembangan game untuk sementara waktu, jadi izinkan saya memberi Anda jawaban pemrograman umum untuk pertanyaan ini. Saya telah mendasarkan jawaban saya pada pengetahuan yang saya miliki tentang sistem entitas-komponen secara umum, di mana entitas adalah angka yang dikaitkan dengan N banyak komponen, komponen hanya berisi data, dan sistem beroperasi pada set komponen yang terkait dengan entitas yang sama.
Ruang masalah Anda adalah ini:
Saya akan menyusun solusi seperti berikut:
Penting bahwa titik kontak antara serangan dan entitas setipis mungkin - ini akan membuat kode Anda dapat digunakan kembali dan mencegah Anda harus membuat kode duplikat untuk setiap jenis entitas yang berbeda yang menggunakan jenis serangan yang sama . Dengan kata lain, inilah beberapa kode pseudo JavaScript untuk memberi Anda ide.
Maaf jawaban ini agak 'berair'. Saya hanya memiliki istirahat makan siang setengah jam dan sulit untuk datang dengan sesuatu tanpa mengetahui sepenuhnya tentang Persatuan :(
sumber
Ketika sebuah unit / struktur / senjata menyerang, saya mungkin akan membuat Serangan (subklas dengan semua detail menyenangkan Anda) yang mengambil penyerang dan pembela (atau pembela). Serangan kemudian dapat berinteraksi dengan target / bek (lambat, racun, kerusakan, ubah status), gambar sendiri (sinar, sinar, peluru), dan buang sendiri ketika sudah selesai. Saya dapat meramalkan beberapa masalah seperti beberapa serangan racun, jadi mungkin target Anda akan mengimplementasikan antarmuka Damageable yang berinteraksi dengan Serangan, tapi saya pikir itu adalah pendekatan yang bisa diterapkan yang modular dan fleksibel untuk diubah.
Expanded Answer
Ini adalah bagaimana saya akan mendekati serangan blaster dengan pendekatan ini . Saya akan membiarkan yang lain menjawab sendiri.
Saya ingin unit saya mengimplementasikan antarmuka IAttacker atau kelas dengan statistik serangan dasar / metode. Ketika IAttacker menyerang IDamageable, ia menciptakan Serangan spesifik yang melewati dirinya sendiri dan targetnya (IAttacker dan IDamageable, atau mungkin kumpulan IDamageable). Serangan mengambil statistik yang dibutuhkan dari IAttacker (untuk menghindari perubahan selama peningkatan atau semacamnya - kami tidak ingin Serangan mengubah statistiknya setelah diluncurkan) dan jika perlu statistik khusus, kirimkan IAttacker ke tipe yang diperlukan (mis. IBlasterAttacker) dan mendapatkan statistik khusus seperti itu.
Dengan pendekatan ini, BlasterAttacker hanya perlu membuat BlasterAttack, dan BlasterAttack menangani sisanya. Anda dapat mensubklasifikasikan BlasterAttack atau membuat FastBlasterAttacker yang terpisah, MegaBlasterAttacker, SniperBlasterAttacker, dll, dan kode serangan untuk masing-masing adalah sama (dan mungkin diwarisi dari BlasterAttack): Buat BlasterAttack dan sampaikan diri saya dan target saya di. BlasterAttack menangani rinciannya. .
sumber