Bir varlık bileşen sisteminde küresel bağlam verileri nasıl saklanır?


10

Sorum şu:

Küresel bağlam verileri nasıl saklanır, yani. varlık bileşen sistemindeki dünya veri bilgileri, geçerli dünya saati, vb.?

C ++ 'da bir Cüce Kalesi tarzı açık uçlu dünya simülasyon oyunu oluşturmaya çalışmayı düşünüyorum. Sadece eğlence için bir varlık bileşeni tarzı oyun motoru oluşturdum ve şu anda istediğim tüm özelliklerde nasıl çalışacağımı anlamaya çalışıyorum. Standart oyun oynamaya (renderleme, fizik, tüzel kişiye özgü bileşen verileri, vb.) Ek olarak, tüm ilgili sistemlerin erişebileceği bazı küresel bağlamsal verilere sahip olmak istiyorum (yani, şu anda hangi yıl olduğu gibi dünya verileri) , küresel ısınmanın gerçekleşip gerçekleşmediği, Bir dünyayı simüle etmekle ilgili her türlü şey). Başlangıçta bir "dünya" bileşeni yapmayı düşündüm, ancak birçok farklı sistemin bu mantıksal "küresel" verilere erişmesi gerekiyorsa bu anlamsız ve zor görünüyor.

Bir "dünya" bileşenine sahip olmak anlamlı mı yoksa bu verileri başka bir şekilde mi saklamalıyım?

Ayrıca, bu verileri basitçe küresel hale getirmeyi ve böylece kullanmak isteyen herhangi bir sisteme erişim sağlamayı düşündüm; genel olarak varlık bileşeni ilkelerinin ihlali gibi görünüyor ve belki de başka nedenlerle dağınık, ama gerçekten işe yarayabileceğini düşündüm.

Düşündüğüm bir diğer şey, ilgili dünya bağlamındaki verileri doğrudan doğrudan sistemlerin içine yerleştirmek olacaktır. Örneğin, AgeSystembir getsWeakerAsTimePassesbileşeni olan ya da olmayan tüm varlıklara "yaşlanmış" olsaydım , belki de bu sistem dünya için ilgili zaman verilerini doğrudan zamanın geçişini hesaplamak için kullanacağı üye verileri olarak depolayabilirdi. Bu üçüncü seçenek benim en sevdiğim, ama beyin fırtınasında başıma gelen bir şeydi.

Birisi tavsiye edebilir mi?


3
Downvotes için gerekçe kibar ve sadece OP için değil, diğer kullanıcılar için de yararlıdır.
MichaelHouse

2
Bir çekiç yaptınız ve şimdi her şey çivi gibi görünüyor. Size programınızdaki verileri tutmak ve işlemek için ECS'den daha fazlasını kullanma izni veriyorum çünkü her şey bir çivi değil.
Patrick Hughes

Yanıtlar:


10

İşe yarayan herhangi bir yol, işe yarayan bir yöntemdir. Kulağa hoş geliyor, ama gerçekten oyununuz mimarinizden 1000 kat daha önemli. İstediğiniz yaklaşımı seçin ve kullanımı kolay bulun.

Gerçek nakliye oyunlarında gördüklerim (özellikle ECS'yi değil, bileşen tabanlı tasarımı kullanarak; Birçok vahşi tasarımın ECS benzeri unsurları olmasına rağmen, "vahşi doğada" hiç saf ECS görmedim):

  • singletons
  • İlgili diğer tüm sistemlere referanslar içeren bileşenlere / sistemlere iletilen "bağlam" nesneleri
  • Sistem tutamaçlarını ayrı bileşenlere geçiren bileşen fabrikaları
  • Bir nesne hiyerarşisinin kökündeki sistemlere referans depolayan bileşenler (sadece bazı tuhaf Unity oyunlarında)
  • Diğer tüm sistemlere referans tutan sistemlere veya bileşene iletilen tekil "Motor" nesneleri
  • Dize tabanlı kaynak arama sistemleri (C ++ 'da benzer bir şey yapmanıza izin verir handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics") evet, gerçekten )
  • Küresel veri yığınları ve bunlar üzerinde çalışan C tarzı serbest işlevler
  • Alanlar / altuzaylar ve eşlik eden video

Hepsi çalışıyor. Bazı yaklaşımlar ve bariz bir favori ile uğraşıyorum, ancak hepsi AAA oyunları göndermek için kullanıldı. Bazen tek bir projede çoklu yaklaşımlar (40-100 + mühendis ekipleri gelişigüzel yinelenen kod, ne yazık ki yaratma eğilimindedir).


2
Hangi favori favoriniz olduğunu merak ediyorum.
ashes999

Sağladığım bağlantılar slaytlarıma ve herhangi bir ipucu varsa, konu hakkında bir konuşma yapan bir videom. :)
Sean Middleditch

Ah, o zaman en sevdiğiniz uzay / alt uzay . :)
ashes999

Mükemmel cevap. Sanırım bir şey çözdüm ve aslında devam ettim ve "uzaylar / altuzaylar" kavramını oyun planımla birleştirdim.
Awesomania
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.