Bir FPS için bir varlık sistemi tasarladım. Temelde şöyle çalışır:
GameWorld adında bir "dünya" hedefimiz var. Bu, bir GameObject dizisinin yanı sıra bir ComponentManager dizisini de tutar.
GameObject bir Bileşen dizisine sahiptir. Aynı zamanda gerçekten basit bir olay mekanizması sağlar. Bileşenlerin kendileri, tüm bileşenlere yayınlanan bir öğeye olay gönderebilir.
Bileşen temel olarak bir GameObject'e belirli özellikler veren bir şeydir ve GameObject aslında bunlardan sadece bir kabı olduğundan, bir oyun nesnesiyle yapması gereken her şey Bileşenlerde gerçekleşir. Örnekler ViewComponent, PhysicsComponent ve LogicComponent'dir. Aralarında iletişim gerekliyse, bu olayların kullanılmasıyla yapılabilir.
ComponentManager sadece Component gibi bir arayüzdür ve her Component sınıfı için genellikle bir ComponentManager sınıfı olmalıdır. Bu bileşen yöneticileri, bileşenleri oluşturmaktan ve bunları bir XML dosyası gibi bir şeyden okunan özelliklerle başlatmaktan sorumludur.
ComponentManager ayrıca, harici bir kütüphane kullanacağım (dünyada her şeyi bir kerede yapan) kullanacağım PhysicsComponent gibi bileşenlerin toplu güncellemelerini de gerçekleştirir.
Yapılandırılabilirlik için, bir XML dosyasını veya komut dosyasını okuyacak, dosyada belirtilen bileşenleri oluşturan (aynı zamanda toplu güncellemeler için doğru bileşen yöneticisine bir referans ekleyen) varlıklar için bir fabrika kullanacağım ve sonra onları bir GameObject nesnesine enjekte edin.
Şimdi benim sorunum geliyor: Bunu çok oyunculu oyunlar için kullanmaya çalışacağım. Buna nasıl yaklaşacağımı bilemiyorum.
Birincisi: Müşterilerin en baştan ne gibi kuruluşları olmalı? Tek oyunculu bir motorun hangi varlıkların yaratılacağına nasıl karar vereceğini açıklamakla başlamalıyım.
Seviye editöründe "fırça" ve "varlık" oluşturabilirsiniz. Fırçalar duvarlar, döşemeler ve tavanlar, temelde basit şekiller içindir. Varlıklar size bahsettiğim GameObject. Düzey düzenleyicide varlıklar oluştururken, bileşenlerinin her biri için özellikler belirleyebilirsiniz. Bu özellikler doğrudan varlığın senaryosunda bir kurucu gibi bir şeye aktarılır.
Motorun yükleyeceği seviyeyi kaydettiğinizde, varlıklar listesine ve bunlara ilişkin özelliklere ayrılır. Fırçalar bir "dünya spası" oluşumuna dönüştürülür.
Bu seviyeyi yüklediğinizde, sadece bütün varlıkları teşvik eder. Sesler basit, ha?
Şimdi, varlıkları ağlamak için sayısız sorunla karşılaşıyorum. İlk olarak, müşteriden baştan itibaren hangi varlıklar bulunmalıdır? Hem sunucunun hem de istemcinin seviye dosyasına sahip olduğunu varsayarsak, istemci, yalnızca sunucudaki oyun kurallarının amaçları için olsalar bile, düzeydeki tüm varlıkları daha iyi anlayabilir.
Bir başka olasılık da, müşterinin sunucu hakkında bilgi gönderir göndermez bir işletmeyi teşvik etmesi ve müşterinin yalnızca ihtiyaç duyduğu varlığa sahip olacağı anlamına gelir.
Diğer bir konu ise bilginin nasıl gönderileceğidir. Sunucunun delta sıkıştırma kullanabileceğini düşünüyorum, bu, istemciye her karede bir anlık görüntü göndermek yerine, yalnızca bir şey değiştiğinde yeni bilgiler göndereceği anlamına gelir. Bu, sunucunun şu anda her müşterinin bildiklerini takip etmesi gerektiği anlamına geliyor.
Ve son olarak, ağ motora nasıl enjekte edilmelidir? NetworkConponent olan, ağa bağlanmış olan her varlığa enjekte edilen bir bileşen düşünüyorum. Ancak ağ bileşeni ağdaki hangi değişkenleri ve bunlara nasıl erişileceğini nasıl bilmeli ve nihayet istemcideki karşılık gelen ağ bileşeni ağ değişkenlerinin nasıl değiştirileceğini nasıl bilmelidir?
Buna yaklaşmakta büyük sorun yaşıyorum. Bana yolda yardım edersen çok sevinirim. Bileşen sistemi tasarımının nasıl geliştirileceğine ilişkin ipuçlarına da açığım, bu yüzden bunu önermekten korkmayın.