TLDR: Dengan membuat komponen terdiri dari beberapa jerat untuk memulai.
Saya setuju dengan Asakeron / Byte56 / Laurent bahwa diperlukan tingkat tipuan antara pasangan mesh / material, dan entitas itu sendiri. Alih-alih melihat GraphicsComponent sebagai simpul dan material, anggap itu sebagai gumpalan piksel pada raster terakhir - bagaimana mendapatkannya / mereka mendapatkan detail implementasi dan tidak lebih.
Saya banyak memikirkan hal ini untuk proyek saya dan saya pikir solusi optimalnya adalah membuat GraphicsComponent komponen yang jauh lebih tinggi, mencakup banyak fungsi dari objek 'Model' tradisional - karena fungsi ini bukan opsional! Untuk membuat poligon itu lebih dari sekadar data buffer dan shader diperlukan, seperti:
- Posisi yang telah Anda sebutkan
- Data Skinning / Animasi
- Pass Saat Ini (misalnya jika menggunakan dua pass alpha)
- Informasi casting bayangan (jika Anda melakukannya)
- Informasi tentang bagaimana dan kapan memperbarui materi
- Fungsi pemusnahan
Dan itu hanya untuk aset 3D, tanpa mempertimbangkan sistem partikel, papan iklan, dll. Tetapi semua itu hanya berkaitan dengan grafik / kode rendering - itu tidak memengaruhi fisika, suara, atau penulisan skrip, sehingga masuk akal bahwa ia harus diduduki. komponen Grafik / Rendering.
Saya berakhir dengan:
Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore //This is the 'game object' - it is passed to the GraphicsController
ModelComponent : GraphicsComponent //This is the actual graphics component, used by the GraphicsController in the context of the game object.
ModelComponentPart : GraphicsComponent //This is also a graphics component
Mesh //These are implementation details
Material
ModelComponentPart : GraphicsComponent
Mesh
Material
Skeleton
Animations
Di dalam:
Model adalah setiap aset game yang memiliki komponen grafis.
ModelComponent analog dengan Model tradisional dan pada kenyataannya, untuk aset 3D. Pengontrol GraphicsComponent (jika Anda menggunakan pola Model-View-Controller) bertanggung jawab untuk mencari tahu apa jenis aset grafis itu dan menggambar dengan benar (perhatikan bahwa ModelComponent adalah subkelas dari GraphicsComponent).
Ada juga beberapa kompromi di tambang untuk kesederhanaan dan kompatibilitas keterbelakangan, seperti setiap GraphicsComponent juga merupakan Entity, dan Entity menyimpan data Posisi secara langsung sehingga hanya dihitung di satu tempat, tetapi idenya sama: GraphicsComponent menangani apa yang ada diperlukan untuk menggambar item - semua yang dibutuhkan - bukan hanya apa yang berasal dari pemodel.