Saya sedang mengerjakan game dengan arsitektur berbasis komponen. An Entity
memiliki satu set Component
instance, yang masing-masing memiliki satu set Slot
instance untuk menyimpan, mengirim, dan menerima nilai. Fungsi pabrik seperti Player
menghasilkan entitas dengan komponen dan koneksi slot yang diperlukan.
Saya mencoba menentukan tingkat granularitas terbaik untuk komponen. Sebagai contoh, sekarang Position
, Velocity
dan Acceleration
semua komponen yang terpisah, dihubungkan secara seri. Velocity
dan Acceleration
bisa dengan mudah ditulis ulang menjadi seragam Delta
komponen, atau Position
, Velocity
dan Acceleration
dapat dikombinasikan bersama komponen seperti Friction
dan Gravity
menjadi monolitik Physics
komponen.
Haruskah komponen memiliki tanggung jawab sekecil mungkin (dengan biaya banyak interkonektivitas) atau haruskah komponen terkait digabungkan menjadi yang monolitik (dengan biaya fleksibilitas)? Saya condong ke arah yang pertama, tetapi saya bisa menggunakan pendapat kedua.
sumber
Jawaban:
Ada garis antara granularity lengkap, yang mengarah ke tidak ada pemborosan kode atau keadaan seperti gumpalan (itulah sebabnya arsitektur komponen disukai), dan kegunaan.
Jelas hal-hal mungkin memiliki
Position
, tetapi mereka belum tentu dinamis (jadi mengapa harusVelocity
danAcceleration
?). Namun, sesuatu dengan aVelocity
akan menjadi objek yang bergerak, jadi masuk akal juga untukAcceleration
dikelompokkan.Apakah Anda akan memiliki kasus di mana v dan a akan dibutuhkan, tetapi Anda tidak ingin simulasi fisika untuk mereka? Demikian pula, akan ada gunanya
Gravity
jika mereka bukan benda fisika?tl; dr Kelompok apa yang masuk akal.
sumber
Entity
memilikiPosition
dan beberapa komponen yang membuatnyaPosition
berpartisipasi dalam fisika, maka ituEntity
adalah fisik de facto . Saya pikir apa yang dapat saya lakukan hanyalah menambahkan beberapa komponen untuk pengelompokan logis, dan menjaga semua komponen mendasar menjadi satu tanggung jawab. Jadi menambahkan, katakanlah,Movable
keEntity
akan memiliki efek yang sama seperti menambahkanPosition
,Velocity
, danAcceleration
.Untuk menghindari pengelolaan mikro setiap variabel yang saya sarankan dengan memulai yang berat, pilih divisi di sekitar tanggung jawab dan refactor ketika situasi muncul dengan sendirinya secara logis. Anda dapat memulai desain pertama di atas kertas. Pada titik tertentu, pembagian tanggung jawab besar ini akan menjadi blok bangunan entitas Anda.
Jadi sebagai contoh bergegas Anda memiliki Game. Game terbagi menjadi Lingkungan + Negara. Lingkungan terbagi menjadi StaticWorld + MovingStuff. Status dibagi menjadi AIControlled + PlayerControlled. Gagasan kotor Damage terbagi menjadi TakesDamage + GivesDamage.
Dan seterusnya.
Sama seperti saran umum untuk "Bangun game, bukan mesin!" untuk praktisi baru saya sarankan "Bangun Game, bukan sistem komponen yang rumit!" karena hanya dengan pengalaman pribadi dengan game yang berjalan Anda akan tahu apakah sistem komponen yang rumit diperlukan untuk pekerjaan mendatang.
sumber
Dugaan saya adalah menggabungkan komponen yang akan memiliki banyak interaksi. Dalam kasus Anda, saya akan menjaga posisi dalam satu komponen, dan memiliki kecepatan & akselerasi yang disatukan dalam komponen fisika.
Tapi itu sangat tergantung pada apa fitur game Anda (kecuali Anda membangun kerangka kerja tanpa memikirkan game tertentu).
sumber
Saya menyadari ini adalah pertanyaan lama tetapi mungkin seseorang akan menemukan jawaban ini bermanfaat.
Saya percaya itu
Systems
akan lebih membantu Anda untuk memahami bagaimana membangun Komponen. Sistem ada dalam arsitektur di mana komponen tidak mengandung logika mereka sendiri, selain dari fungsi pengambil / setter dan penolong sederhana. Sistem beroperasi pada Entitas yang memenuhi persyaratan Komponen. Inilah sebabnya mengapa yang terbaik adalah memisahkan data komponen sebanyak masuk akal untuk data yang akan diproses tanpa data lainnya.Misalnya, Anda mungkin memiliki
MovementSystem
pembaruan yang EntitasnyaPosition
berdasarkanVelocity
. Ini bisa untuk entitas sederhana dalam game. Tapi, untuk Player dan Musuh, Anda mungkin menginginkan gerakan yang telahAcceleration
diprosesAcceleratedMovementSystem
. Tapi untuk Hambatan mungkin Anda inginkanFriction
. The Terrain mungkin juga memiliki gesekan, tetapi tidak akan memiliki komponen kecepatan. Tapi bagaimana dengan ituGravity
? Tambahkan saja Player, Musuh, dan Rintangan, dan buatGravitySystem
untuk memprosesnya.Intinya adalah bahwa semakin dipisahkan Anda
Components
, semakin extensible yangEntities
akan ketika menggunakanSystems
.Sunting: Membuat pernyataan terakhir lebih jelas.
Sunting: Oke, saya sudah mengerjakan Sistem saya sendiri dan sampai pada realisasi ini. Contoh untuk membagi Posisi dan Velocity adalah bahwa memanipulasi Velocity menyebabkan Posisi berubah dengan MovementSystem. Akibatnya, 'InputMovementSystem' tidak memerlukan Posisi untuk membuat Player berpindah dari Input pengguna karena MovementSystem akan mengambil perubahan dalam Velocity untuk diterapkan ke Posisi. Memang, itu masih bekerja dengan baik untuk menyatukan mereka, tetapi itulah contoh mengapa tidak perlu.
Saya membaca posting blog baru-baru ini yang mengatakan sesuatu seperti ini:
sumber