Bir Varlık-Bileşen-Sistem Motorunda, bağımlı varlık gruplarıyla nasıl başa çıkabilirim?


47

Birkaç oyun tasarım modelinin üzerinden geçtikten sonra oyun motorum için Entity-Component-System (ES Sistemi) ile anlaştım. Makaleler okudum (çoğunlukla T = Makine ) ve bazı kaynak kodları inceliyorum ve başlamak için yeterince başladığımı düşünüyorum.

Mücadele ettiğim tek bir temel fikir var. Birbirine bağlı varlık grupları ile nasıl başa çıkabilirim?

Bir örnek kullanmama izin ver:

Standart bir tepegöz atıcı yaptığımı ( Jamestown'u düşünün ) ve birden çok farklı ancak birbirine bağlı parçaları olan bir "patron varlık" oluşturmak istediğimi varsayalım . Yıkılma şöyle bir şeye benzeyebilir:

  • Gemi gövdesi: Hareket, Rendering
  • Savaş Topu: Pozisyon (Gemi gövdesine göre kilitlenmiş), Takipte \ Kahramanda Ateş Et, Engelli Kadar Zarar Görüyor
  • Çekirdek: Konum (Gemi gövdesine göre kilitlenmiş), Takip Etme \ Kahramana ateş etme, Engelli oluncaya kadar Hasar Alma, gemi grubundaki diğer tüm varlıkları Devre Dışı Bırakma (er ... yok etme)

Amacım, her yeni bir toplam Eleman inşa etmek istediğimde alt sistemi yeniden yazmak zorunda kalmadan farklı bir oyun öğesi olarak tanımlanacak (ve manipüle edilecek) bir şey olurdu.

Bu tür bir tasarımı ES Sisteminde nasıl uygularım?

  1. Bir tür ebeveyn-çocuk varlığı ilişkisini uygulayabilir miyim (işletmelerin çocukları olabilir)? Bu, Kurumların sadece boş konteyner olmaları ve daha fazla OOP hissetmelerine neden olan metodolojiyle çelişmektedir.
  2. Bunları bir tür Bileşen (BossComponent) ve ilgili sistemle (BossSubSystem) bağlayan ayrı varlıklar olarak mı uyguluyorum? Yardımcı olamam ama bileşenlerin nasıl iletişim kurdukları büyük bir ayı tuzağı gibi göründüğü için bunun zor olacağını düşünüyorum.
  3. Bunları bir bileşen koleksiyonuyla (ShipComponent, CannonComponents, CoreComponent) tek bir Varlık olarak mı uyguluyorum? Bu, ES Sisteminin amacından sapmış gibi görünüyor (buradaki bileşenler ağır ağırlık varlıklarına çok benziyor), ama bunu biliyorum, o yüzden bunu ortaya koyacağımı düşündüm.
  4. Onları bahsettiğim başka bir şey olarak mı uyguluyorum?

Bunun OOP'da çok kolay bir şekilde uygulanabileceğini biliyorum, ancak ES'yi OOP'a göre seçmem buna bağlı kalacağım. Bu tasarımı uygulamak için saf ES teorisini kırmam gerekirse, (daha önce saf tasarımdan ödün vermek zorunda olmadığım gibi değil), ancak bunu kötü tasarımla başlamak yerine performans nedeniyle yapmayı tercih ederim.

Ekstra kredi için, aynı tasarımı düşünün, ancak, "patron varlıkların" her biri aslında bir ana gövdeden, ana çekirdekten ve 3 "Patron Varlıktan" oluşan daha büyük bir "BigBoss varlık" ile bağlantılıydı. Bu benim için fazlasıyla yeterli olacak en az 3 boyut için bir çözüm görmeme izin verdi (büyük ebeveyn-ebeveyn-çocuk).


2
Basitçe, bir varlığa bağlı farklı tel örgü bileşenleri, patron varlığa tutturulmuş gemi ve top örgüsü, fazla yorulmuyor. BT bir varlık bileşen sistemi OOP IS!
Maik Semder

2
Evet, bu T-Machine makalelerinin en kötü kısmı, bunun bir şekilde nesneye yönelik olmadığı yönünde yanlış bir fikir. Varlıklar için çoğu bileşen sistemi, tamamen mirasa dayalı değil, tamamen nesneye yöneliktir.
Kylotan

3
Bence OOP dışı doğayı vurguladılar çünkü "klasik OOP'yi düşünmek" seni çok belaya sokacak. Birkaç insanın şimdiye kadar varlık sistemlerine başlamalarına yardımcı oldum ve bu en büyük engel. Bileşenlere kod koymaya çalışmak, birbirlerini alt alan vb. Bileşenlere sahip olmak, ilk başta büyük bir sorundur, ancak fikir sonunda tamamen kavradığında ışığın yandığını görmek güzel.
PSpeed

@MaikSemder Yorumlarımı temizledim ve sohbete
MichaelHouse

1
Anladığım kadarıyla @MaikSemder, ES sisteminde referanslamanız, bir İşletmenin aynı tipte birden fazla bileşeni olabilir ve bu bileşenlerden sorumlu olan Alt Sistem bu durumla başa çıkmak zorunda kalacak mı? Öyleyse, bir Varlığın birden fazla Render bileşeni olabilir ve bu bileşenlerin veri ve alt sistemleri her birinin nasıl düzgün bir şekilde oluşturulacağını belirler? Bu, daha az varlığa, potansiyel olarak daha az bileşene fakat biraz daha derin bir alt sistem mantığına yol açacak, doğru mu?
John Daniels,

Yanıtlar:


41

Bu durumda olsaydım, patronun her bir bölümünü ayrı bir varlık olarak yaratırdım. Bu "alt varlıklar" bir tür AttachmentPointveya ParentEntitybileşen içerecektir . Bu bileşen, ana kuruluşa yapılan bir referansı ve ebeveynlerin pozisyonundan bir kayma içerecektir. Pozisyonu güncellerken, ebeveyn pozisyonunu kontrol eder ve kendi pozisyonlarını oluşturmak için ofseti uygular. Ek olarak, ana varlığın devam etmesini sağlamak için kontroller yapabilir. Ayrıca, SubEntityana varlık için alt varlıkların varlığını izleyen bir bileşene sahip olabilirsiniz . Bu, kalkanlı kollar tahrip edildiğinde sadece patronun çekirdeğini savunmasız yapmak gibi şeyler yapmanıza izin verir.

Şu anda TargetEntitytaret takibinde ve goblinlerin kaynak alacağı zaman oyunumda bir bileşen kullanıyorum . Hedef varlığın pozisyonunu kontrol edebilir ve davranışını buna göre değiştirebilir. Konumu olmayan varlıklar hiçbir zaman hedef olarak eklenmez, bu yüzden orada endişelenmenize gerek yoktur. Ancak, daha derinleşirken, ebeveyn veya çocuk varlığı sağlığını kontrol etmek, kalkan, güç rezervleri veya her neyse, ebeveyn veya çocuk varlıklarının gerçekte ilgili bileşene sahip olmasını sağlamak zorundasınız.

Her parçayı kendi varlığı yapmak, patronun her bir parçasına ek ve farklı bileşenler eklemenizi sağlayarak varlık / bileşen çerçevesinin esnekliğini korur. Örneğin, patronun bir parçası bir tabanca bileşenine ve bir sağlık bileşenine sahip olabilirken, diğeri bir kalkan bileşenine ve bir sağlık bileşenine sahip olabilir.

Burada bu konuda başka bir tartışma buldum . Kullanıcıların aynı türden birden fazla bileşeni tek bir öğeye eklemeyi tartıştıkları (bana kötü bir fikir gibi görünüyor). Tüm konuşmayı okumamama rağmen, yararlı bir sohbet gibi görünüyor.


Burada pek çok iyi bilgi var. Çözümü iyi açıkladınız, bana bir örnek verdiniz ve muhtemelen daha sonra geri gelmem gereken 1 veya 2 soruyu daha cevaplayacaksınız. Bağlantılı tartışma, özellikle daha zorlu bir uygulamaya girmeye başladığımda, merak uyandırıcı görünüyor. @ Byte56 teşekkürler!
John Daniels,

Sorun değil John! Elbette bir EC sistemini hayata geçirmenin birçok farklı yolu var. Bu yanıt için aklındaki sistem ı tarif biridir bu cevap . Oyununda iyi şanslar!
MichaelHouse

Yaklaşımınız en esnek ve onu genel bir oyun motorunda kullanmanın sesi.
Coyote

7

Mevcut sistemleriniz hakkında çok fazla ayrıntı bilmeden, bunu modelleme biçimim (ve bir dereceye kadar kendi varlık sistemimde olması gereken), AttachedTo (parentEntity) gibi bir bileşene sahip olmaktır. Çocuklardan birine daha sonra AttachedTo (boss) bileşeni verilebilir.

Render sistemi (ya da her neyse) daha sonra bileşenleri olan varlıkları alır: Position, AttachedTo, vs. ve uygun hiyerarşileri oluşturur.


Bu fikir birliği cevabı gibi görünüyor. Bir dahaki sefere insanların çiğnemeleri için daha fazla uygulama detayı vereceğim. @ PSpeed ​​teşekkürler!
John Daniels

4

Yalnızca bir kimlikle temsil edilen bir varlığa sahip olmak istiyorsanız, varlıkların kapsamı özel bir bileşen aracılığıyla yapılabilir. CompositeComponent diyebilirsiniz ve buna bir çocuk varlık kimlikleri listesi ve bu listeye çocuk eklemek / çıkarmak için arayüzler bulunur.

Açıkçası, pozisyona vb. Bağlı olan herhangi bir bileşenin, varlığı uygun şekilde yerleştirmek için bununla çalışması gerekecektir. Bunun nasıl uygulanacağı, şu anda konumlandırmayı nasıl uyguladığınıza bağlı olacaktır.

Bu arada, “saf ES teorisi” yoktur - bileşenlerden varlıkların yapılması popüler bir yaklaşımdır ancak kesin yöntem henüz standartlaştırılmamıştır.


Evet, "saf" kelimesini herhangi bir tasarım tartışmasında kullanmamayı öğrenmeliyim ... böyle bir şey yok. ConpositeComponent route, burada fikir birliği gibi görünüyor. @Kylotan teşekkürler!
John Daniels,
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.