Bagaimana saya bisa menggunakan banyak jerat per entitas tanpa memutus satu komponen dari tipe tunggal per entitas?


11

Kami hanya beralih dari mesin permainan berbasis hierarki ke mesin permainan berbasis komponen. Masalah saya adalah bahwa ketika saya memuat model yang memiliki hierarki jerat, dan cara saya memahami, adalah bahwa suatu entitas dalam sistem berbasis komponen tidak dapat memiliki beberapa komponen dari jenis yang sama, tetapi saya memerlukan "meshComponent" untuk setiap jala dalam model. Jadi bagaimana saya bisa menyelesaikan masalah ini.

Di situs ini mereka menerapkan mesin permainan berbasis Komponen: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


Saya pikir ini terlalu lokal.
jcora

4
Saya pikir ini pertanyaan umum. Bisakah objek game memiliki banyak instance dari komponen yang sama?
Mathias Hölzl

Ya, bisa saja , jika diminta seperti itu. Bagi saya sepertinya dia sedang mencari jawaban untuk masalah yang sangat spesifik.
jcora

4
"... entitas dalam sistem berbasis komponen tidak dapat memiliki banyak komponen dari jenis yang sama ..." - mengapa tidak?
Den

Saya tidak berpikir itu terlalu lokal. Misalnya di UE3, SkeletalMeshActorhanya punya satu SkeletalMeshComponent. Ini adalah masalah umum yang dapat diatasi dengan berbagai cara.
sam hocevar

Jawaban:


13

Komponen Posisi Anda dapat memiliki logika "orang tua / anak-anak", di mana setiap Entitas dengan Posisi dapat memiliki orang tua dan posisinya relatif terhadap orang tua mereka. Alih-alih memiliki beberapa mesh pada entitas yang sama, Anda dapat membuat lebih dari satu entitas, masing-masing dengan mesh sendiri dan menghubungkannya bersama. Anda bahkan dapat membuat entitas anak-anak mendengarkan acara orang tua mereka (atau sistem apa pun yang Anda miliki untuk komunikasi antar entitas) dan bereaksi sesuai dengannya.


Jadi saya memiliki hierarki entitas dan entitas ini memiliki komponen dan terkait dengan yang lebih besar. Apakah saat itu masih mesin game berbasis Komponen =)
Mathias Hölzl

@ MathiasHölzl apakah itu pertanyaan? Jenis hierarki ini tidak sama dengan hierarki yang bermasalah di OOP. Ini hanya hierarki grafis, Entitas anak-anak tidak akan mewarisi fungsi dari orang tua mereka dan memberi Anda masalah, ini biasanya dilakukan pula (memiliki pohon barang untuk dirender). Anda juga dapat pergi dengan jawaban Asakeron untuk masalah Anda, memiliki daftar Mesh, saya tidak melihat bagaimana itu bermasalah. Mungkin saya tidak mengerti pertanyaan Anda?
Luke B.

-1 Tidak yakin apakah itu benar-benar cara untuk pergi. Jika yang Anda butuhkan adalah komponen yang menangani hierarki jerat, mengapa tidak memiliki ModelComponentyang berisi hierarki jerat? Memisahkan entitas hanya untuk itu terdengar seperti solusi yang salah untuk masalah tersebut. Lihat jawaban Asakeron dan Byte56.
Laurent Couvidou

@LaurentCouvidou Saya tidak melihat mengapa menggunakan lebih dari satu Entitas akan salah, sepertinya solusi yang baik untuk saya. Saya hanya ingin memberikan alternatif yang berbeda untuk memiliki daftar jala, meskipun saya setuju bahwa daftar jala juga akan menjadi solusi yang baik.
Luke B.

@ LukasB. Karena grup mesh ini dapat berhubungan dengan satu entitas secara keseluruhan, dengan komponen yang bergantung pada ini, misalnya AI, bunyi, fisika ... Dengan melakukan ini, Anda berakhir dengan grafik adegan dan semua keanehannya.
Laurent Couvidou

8

Komponen meshCon Anda mungkin berisi daftar jerat. Saya tidak yakin bagaimana Anda menerapkan mesin Anda, tetapi suatu sistem dapat dengan mudah beralih ke semua jerat dan hanya menggambar mereka.


1
Jala juga memiliki komponen seperti transformasi, fisik, grafik ...
Mathias Hölzl

1
Jadi mesh adalah entitas? Atau apakah semuanya komponen? Cara saya melihatnya, mengubah, fisik dan grafik harus menjadi komponen dalam entitas bukan di mesh, mesh hanya deskripsi dari simpul.
Luke B.

1
Ya itu harus menjadi komponen tetapi komponen tidak dapat memiliki komponen sehingga sulit untuk mengimplementasikan hirarki model.
Mathias Hölzl

1
Saya percaya Anda harus memberikan informasi lebih lanjut tentang bagaimana Anda bermaksud membangun mesin Anda untuk mendapatkan jawaban yang lebih baik. Sistem Komponen Entitas dapat diimplementasikan dalam banyak cara, periksa jawaban ini oleh Kylotan untuk informasi lebih lanjut tentang itu.
Asakeron

4

Saya akan membuat komponen mesh saya dengan daftar objek mesh. Setiap objek mesh memiliki data mesh bersama dengan offset. Saat menggambar, sistem gambar mengambil posisi dari komponen posisi, lalu menggambar setiap jala di komponen jala pada posisi + offset.

Anda dapat memiliki beberapa jerat di dalam komponen mesh Anda, sambil tetap mengatakan dengan komponen mesh tunggal per entitas.


1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.