Sonlu durum makinelerini bileşen tabanlı mimariye nasıl bağlarsınız? [kapalı]


23

Devlet makineleri, bileşen tabanlı mimarilerde zararlı bağımlılıklara neden gibi görünüyor.

Özellikle bir durum makinesi ile durumla ilgili davranışlarda bulunan bileşenler arasında iletişim nasıl yapılır?

Neredeyim:

  • Bileşen tabanlı mimarilerde yeniyim.
  • Önemli olduğunu düşünmeme rağmen, dövüş oyunu yapıyorum. Durum makinemin "çömelme", ​​"kısa çizgi", "engelleme" vb. Durumları değiştirmek için kullanıldığını düşünüyorum.
  • Bu durum yönetimi tekniğini, bileşen tabanlı bir mimari için en doğal sistem olarak buldum, ancak okuduğum tekniklerle çelişiyor: Değişken Davranış Karakterleri için Dinamik Oyun Nesnesi Bileşen Sistemi Tüm bileşenlerin etkinleştirilmesini / devre dışı bırakılmasını önermektedir. aktivasyon için sürekli olarak bir koşulu kontrol ederek kendilerini.
  • "Koşmak" veya "yürümek" gibi eylemlerin burada kabul edilen yanıtla uyuşmayan devletler olarak anlamlı olduğunu düşünüyorum: /gamedev//a/7934
  • Bunu faydalı buldum ama belirsiz buldum: Bir bileşen tabanlı oyun mimarisinde davranış nasıl uygulanır? Durum makinesinden başka bir şey içermeyen ayrı bir bileşene sahip olmayı önerir. Ancak, bu, durum makinesi bileşeni ile neredeyse tüm diğer bileşenler arasında bir çeşit bağlantı gerektirmektedir. Bu kuplajın nasıl kullanılması gerektiğini anlamıyorum. Bunlar bazı tahminler:

    A. Bileşenler durum makinesine bağlıdır:
    Bileşenler getState()bir numaralandırma sabiti veren durum makinesi bileşenlerine referans alır . Bileşenler kendilerini düzenli olarak günceller ve gerektiğinde kontrol eder.

    B. Durum makinesi bileşenlere bağlıdır:
    Durum makinesi bileşeni, izlediği tüm bileşenlere referans alır. getState()Nerede olduklarını görmek için yöntemlerini sorgular .

    C. Aralarında bazı soyutlamalar
    Bir olay merkezi kullanın? Komuta düzeni?

    D. Bileşenler
    Durum Deseni'ne başvuran ayrı durum nesneleri kullanılır. Bir dizi bileşeni etkinleştiren / devre dışı bırakan ayrı durum nesneleri oluşturulur. Durum makinesi durum nesneleri arasında geçiş yapar.

  • Bileşenlere yönlerin bir uygulaması olarak bakıyorum . Bu yönü ortaya çıkarmak için dahili olarak ihtiyaç duyulan her şeyi yaparlar. Diğer bileşenlere güvenmeden bileşenlerin kendi başlarına çalışması gerektiği gibi görünüyor. Bazı bağımlılıkların gerekli olduğunu biliyorum, ancak devlet makineleri tüm bileşenleri kontrol etmek istiyor gibi görünüyor.

Yanıtlar:


7

Genel bakış oldukça hafif, ancak bu slaytları geçen sene New Game Conf için yaptığım bir sunumdan inceleyin:

https://docs.google.com/presentation/d/110MxOqut_y7KOW1pNwIdcccisIA3ooJwVR-xm-ecuc4/view

(aşağıdaki ilgili resimlere bakınız)

Tekniğin özü, eylem listesi modelini (biraz zayıflarak açıklanmıştır - slaytlarda), bileşen tabanlı bir oyun varlığına etki eden davranışsal durum makineleri ile birleştirmektir.

Temelde, basit AI sistemleri için ihtiyaç duyduğunuz davranışlar arası entegrasyon türlerine yönelik, sadece AI davranışı için özel bir kompozisyon sistemi oluşturmakla aynıdır.

Bu özel oyunun en sevdiğim yanı, önceden yazılmış bir davranış listesinden seçerek onları oyun nesnesinin (BrainComponent'te bulunan) istediği sıraya göre eylem listesine sokarak tamamen yeni tipte düşmanları nasıl yaratabileceğimizdi. öncelik ve her şey çalıştı. Engelleme / Engelleme dışı eylemleri mümkün kılan bir eylem listesiyle, bu uygulamanın ne kadar basit olmasına rağmen gerçekten harika şeyler yapabilir.

Gerçekten sadece bir StunBehaviorAction'ın eylem listesi yığınının üstüne itdiği "sersemletme" gibi davranışlar bile; sersemletici davranış etkinleştiğinde (oyun nesnesinin EarsComponent'in çarpıcı bir şok dalgası saldırısı duyduğunu gördükten sonra), içsel durumunu Sersemletmiş olarak ayarladı, AnimationComponent'e sersemletici animasyonu oynatmasını ve eylem durumunu Engelleme olarak ve zamanlayıcısını, oyunun nesnesi EnemyParametersComponent'ten sersemletilmiş bir zaman aşımı süresi geldi. Engelleme ve eylem listesinin başında olduğu için, eylem listesindeki diğer BehaviorAction'ların hiçbiri güncelleme yönteminin çağrısını alamaz, bu yüzden aslında kapatılırlar. Zaman aşımı süresi dolduğunda, StunBehaviorAction durumunu boşta ve eylem durumunu NonBlocking olarak ayarlar.

Uyguladığımız diğer davranışlar neredeyse hepsi tek bir iç durum makinesiyle gerçekleştirildi. Aslında devlet makinelerine sahip olmayan sadece ikisi PatrolPathBehaviorAction (eğer bir sıra PathAction'sı eylem listesine iterdi, eğer boştaydıysa, bu sırala MoveAction'ı itti) ve GuardHomeBehaviorAction'ı (her zaman sonunda eylem listesi ve her zaman sadece bir PathAction'ı düşmanın ana konumuna geri itin). Diğer her davranış bir durum makinesi idi.

10. slayt Slayt 25 Slayt 26


"Davranışlar" ve "Eylemler" arasındaki temel fark nedir?
Pup,

1
@Pup: Kod açısından, oluşturduğum gibi, bir Davranış bir Eylemdir. Kavramsal açıdan, Eylemler genellikle geçicidir - yalnızca "tamamlanana" kadar var olurlar - Davranışlar sonsuza kadar sürer ve listeden asla çıkarılmaz. Başka bir ekibin de benzer bir sistem kurduğunu gördüm, ancak iki liste var; biri Eylemler, diğeri Davranışlar için yeterince iyi çalışıyor. Bir Eylemin belirli davranışları engelleme yeteneğine sahip olmayı seviyorum, ancak bit maskelerini ve gruplamayı kullanarak (şeritler, bunları slaytlarda çağırdığımı sanıyorum). Üzgünüm, orta slaydın grafiği çok kötü. :)
Sean Middleditch

3

Daha önce çalıştığım bir şirkette, devlet merkezli AI ile bileşen tabanlı bir sistemimiz vardı. Bu nesne / birim için tüm davranışları kontrol eden bir AI bileşenimiz vardı. AI etkinken, dolaşmak, saldırmak, vb. Gibi, ihtiyaç duyulan herhangi bir mantığı yapmak için her karede bir güncelleme alırdı. AI rölantide iken veya hareket etmiyorken bileşen devre dışı bırakılmış ve her karede güncellenmemiştir. Bileşen devre dışı bırakılmışken, olaya dayalı mesajlar alabiliyordu, bu nedenle oyuncu yarıçapına giren bir oyuncu gibi bir mesaj alabildi ve AI bileşenini kare tabanlı güncellemeler yapabilmesi için yeniden etkinleştirerek buna cevap verebilir.

AI bileşeni, ne tür eylemler gerçekleştirdiğine bağlı olarak anında yaratabileceği ve yok edebileceği alt bileşenlere sahiptir. Örneğin, dolaşıyorsa, dolaşan bir alt bileşen oluşturabilir ve dolaşırken her kareyi güncelleyebilir ve ardından dolaşırken aggro'dsa, bu alt bileşeni kapatır ve bir saldırı alt bileşenini açar. AI bileşeni, bir nesnedeki diğer tüm bileşenlerden bağımsız olmalıdır. Örneğin, bir birimdeki hareket değerlerini sorgulayan bir girdi bileşenimiz vardı. Yaptığı sorgu hem insan hem de AI nesnelerinin cevap vereceği bir şeydi. Bu, AI bileşeninin, dolaşırken olduğu gibi, girdi bileşeninin alabileceği, sadece kontrol edilebilir bir bileşenin, girdi bileşeninin alabileceği değerleri ayarlayacağı şekilde, sadece kendisinin hareket değerlerini ayarlamasına izin verdi.


Peki, AI alt bileşenleri aslında işi yapıyor mu? AI bileşeni ile aynı düzeyde varlık bileşenleri olarak varlar mıydı?
Pup

Motorumuzdaki alt bileşenler temel bileşen sınıfının bir parçasıydı. Bu nedenle Component, türetilen herhangi biri , BaseComponentüzerinde herhangi bir sayıya sahip olabilir SubComponent. Buradaki Update()yöntem BaseComponent, alt bileşenlerin listesini kontrol eder ve bunları çağırır Update(). SubcomponentsTamamen isteğe bağlıydı, bu yüzden BaseComponentherhangi biri olmayabilir. Ayrıca, bir bileşene giden iletiler de alt bileşenlere yönlendirildi.
Nic Foster,

1

Terimleriniz somut örneklerle çok belirsiz olduğu için bileşenlerden kastettiğiniz net değildir. Genellikle oyun varlıkları, mirastan ziyade kompozisyon kullanılarak inşa edilir. Böylece, işletmeye bir sağlık bileşeni ekleyerek zarar verebilecek bir şey haline getirebilir ya da canlı bir bileşen ekleyerek bunları canlandırabilirsiniz. Biri AI'yı böyle bir bileşene de yerleştirebilir. AI bileşeninizde karar verme mantığı olacaktır ve sistemdeki diğer kodların çoğuna bağlanma konusunda endişeleriniz varsa, bilgiyi AI mantığının erişebildiği bir kara tahtaya toplayabilirsiniz. AI sisteminin çıkışında da bağımlılıklar konusu var. Temel olarak AI'nız bir varlığı kontrol ediyor ve bu kontrolün bir arayüz gerektiriyor. Yararlı bir kavram, bir denetleyici veya gamepad olduğu. AI'nız, bir oyuncu gamepad'in dolduracağı benzer bir yapıyı doldurabilir (belirli yetenekler için bazı ekstra "düğmelere sahip olabilir). Şimdi bu yapı daha sonra yorumlayacak ve oynatılacak uygun animasyonları seçecek olan canlı bileşeninize aktarılabilir. Farklı AI alt bileşenleri yapının farklı alanlarına veya farklı önceliklere sahip aynı alanlara bile yazabilir. Örneğin nişan almak ve yürümek. Farklı AI alt bileşenleri yapının farklı alanlarına veya farklı önceliklere sahip aynı alanlara bile yazabilir. Örneğin nişan almak ve yürümek. Farklı AI alt bileşenleri yapının farklı alanlarına veya farklı önceliklere sahip aynı alanlara bile yazabilir. Örneğin nişan almak ve yürümek.

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.