Pertanyaan saya adalah ini:
Bagaimana seseorang menyimpan data konteks global, yaitu. informasi data dunia, waktu dunia saat ini, dll dalam sistem komponen entitas?
Saya berpikir untuk bekerja membangun game simulasi dunia terbuka gaya Dwarf Fortress di C ++. Saya telah membangun mesin game gaya komponen entitas hanya untuk bersenang-senang, dan saya saat ini sedang mencoba mencari tahu bagaimana saya akan bekerja di semua fitur yang saya inginkan. Selain permainan standar (rendering, fisika, data komponen khusus entitas, dll), saya juga ingin memiliki beberapa data kontekstual global yang dapat diakses oleh semua sistem yang relevan (yaitu, data dunia seperti tahun apa sekarang ini. , apakah pemanasan global sedang terjadi, Segala hal yang relevan dengan simulasi dunia). Saya awalnya berpikir untuk membuat komponen "dunia", tetapi ini sepertinya tidak ada gunanya dan sulit jika banyak sistem yang berbeda membutuhkan akses ke data "global" yang logis ini.
Apakah masuk akal untuk memiliki komponen "dunia" atau haruskah saya menyimpan data ini dengan cara lain?
Saya juga berpikir untuk membuat data ini menjadi global, sehingga memberikan akses ke sistem apa pun yang ingin menggunakannya; sepertinya pelanggaran prinsip entitas-komponen pada umumnya, dan mungkin berantakan karena alasan lain, tapi saya pikir itu mungkin benar-benar berhasil.
Hal lain yang saya pikirkan adalah menanamkan data konteks dunia yang relevan secara langsung ke dalam sistem itu sendiri. Sebagai contoh, jika saya memiliki AgeSystem
"umur" semua entitas yang memiliki getsWeakerAsTimePasses
komponen atau yang lainnya, maka mungkin sistem ini dapat menyimpan data waktu yang relevan untuk dunia secara langsung sebagai data anggota yang akan digunakan untuk menghitung perjalanan waktu dan berapa banyak untuk menua dan melemahkan orang, dll. Pilihan ketiga ini adalah yang paling tidak saya sukai, tetapi sesuatu telah terjadi pada saya dalam brainstorming.
Adakah yang bisa menyarankan?
sumber
Jawaban:
Cara apa pun yang berhasil adalah cara yang berhasil. Kedengarannya sinis, tapi sungguh, gim Anda 1000x lebih penting daripada arsitektur Anda. Pilih pendekatan apa pun yang Anda suka dan temukan mudah digunakan.
Yang pernah saya lihat di game pengiriman nyata (menggunakan desain berbasis komponen, bukan ECS khusus; Saya belum pernah melihat ECS murni "di alam liar", meskipun banyak desain komponen memiliki elemen mirip ECS):
handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics")
, ya, sungguh)Mereka semua bekerja. Saya memiliki keluhan dengan beberapa pendekatan dan favorit yang jelas, tetapi mereka semua telah digunakan untuk mengirimkan game AAA. Kadang-kadang beberapa pendekatan dalam satu proyek (40-100 + tim insinyur cenderung membuat kode duplikat serampangan, sayangnya).
sumber