Sistem entitas berbasis komponen sangat populer akhir-akhir ini; semua orang tampaknya setuju bahwa mereka adalah jalan yang harus ditempuh, tetapi tidak ada yang benar-benar memiliki implementasi yang pasti dari sistem semacam itu. Saya bertanya-tanya, apa peran yang dimiliki entitas (berjalan-kiri, berdiri, melompat, dll) dalam CBS? Apakah mereka bertindak seperti pengontrol (yaitu mereka menangani acara dan mengubah atribut entitas berdasarkan peristiwa tersebut)?
Bagaimana dengan kasus-kasus di mana suatu negara bagian, misalnya, mengharuskan entitas memasuki mode tanpa klip? Haruskah, keadaan itu, ketika masuk, mungkin mengatur CollisionComponent entitas ke null pointer atau sesuatu? (Kemudian, saat keluar, negara harus mengembalikan CollisionComponent entitas ke keadaan sebelumnya.)
Juga, saya kira itu adalah tugas negara saat ini untuk mengubah keadaan entitas menjadi sesuatu yang lain, bukan?
sumber
Jawaban:
Saya mendapat kesan bahwa dalam desain berbasis komponen entitas pada dasarnya adalah wadah komponen (dengan kemungkinan beberapa pesan dilemparkan ke dalam). Dilihat dari perspektif ini masing-masing komponen akan menyimpan sedikit keadaan. Misalnya jika komponen perilaku hantu memutuskan perlu memasuki mode tak berwujud, komponen itu juga mengirim pesan ke komponen fisika yang memerintahkannya untuk mengaktifkan tanpa klip. Itu mungkin juga akan mengirim pesan ke ghost-model-components yang memberitahu untuk menendang alpha.
sumber
Mesin dan komponen negara adalah teknik ortogonal. Anda dapat memiliki status di komponen Anda atau tidak, sama seperti Anda dapat memiliki status di kelas apa pun. Anda dapat memiliki komponen mengamati (lihat Pola Pengamat) dan mengubah status komponen lain. Mesin negara memiliki banyak kegunaan dan implementasinya akan tergantung pada kebutuhan Anda.
Untuk karakter, karakter yang Anda gambarkan (berjalan, berdiri, melompat), saya telah melihat implementasi di mana semua komponen mempertahankan mesin negara mereka sendiri ... fisika, animasi, kontrol, ai. Komponen-komponen tersebut harus memiliki otoritas yang jelas tentang komponen mana mereka bereaksi, dan komponen mana yang dapat diubah.
sumber
Desain Komponen sebagai struktur dengan data saja, tidak ada logika yang lebih kompleks daripada getter dan setter. Jangan membuat dependensi antar Komponen atau Anda akan kehilangan sebagian besar manfaat Sistem Entitas.
Lihat contoh pendekatan ini (dekat dengan visi mesin) di sini: https://github.com/thelinuxlich/starwarrior_CSharp
Dan mesinnya sendiri: https://github.com/thelinuxlich/artemis_CSharp
sumber