Bileşen / Varlık tabanlı tasarım + Davranış Ağaçları => nasıl entegre edilir?


9

Mevcut projem için, bileşen / varlık tabanlı bir sistem uyguladım , temelde bu oldukça tanımlanmamış alanda en iyi uygulamanın çoğunu takip ediyorum .

(Hafifçe genişletilmiş) var ben Yani Varlıkları temelde bir olan, intkimliği, bir insan tarafından okunabilir ismi, bir std::mapbileşenlerin ve longbileşenleri mevcut ne göstermek için kullanılır "tipi göstergesi" (İki kişilik bir güce sahip enumbileşenler herkes için Varlığa her bileşen eklendiğinde, otomatik olarak bu uzun bit işlemlerle değiştiririm, bu cevabı karşılaştırın ).

Sonra Bileşenler de var, oldukça basit: intID, enumbileşen türü, üst Entity pointer ve std::mapbu bileşenin sahip olduğu tüm özelliklerin bir.

Son olarak , gerçek mantık işlemeyi gerçekleştiren bazı Sistemler / Yöneticiler . Önce o anda işlenen Varlığın eşleşen bir long"tip göstergesi" olup olmadığını kontrol ederler = bu sistem için gerekli tüm bileşenler mevcut. Daha sonra gerekirse bazı özelliklere erişir ve ilgili bileşendeki bazı işlevleri doğrudan çağırır veya bazı iletiler gönderir (bir ileti dağıtıcısı aracılığıyla).

Alt satır: Buraya kadar, veri odaklı bir yaklaşımla birleştirilen oldukça standart bir olay güdümlü bileşen / varlık tabanlı sistem (karşılaştırın, bileşenlerin sabit kodlanmış veri değişkenleri değil, bunun yerine (bazı) bileşenler olarak genel bir harita / bileşenlerin arketipleri daha sonra gerçek bileşen kodunun bir parçası olmayan ek veri ekleme seçeneğiyle dosyalardan okunacaktır.

Şimdi de bu projeye Davranış Ağaçları ( AiGameDev BTSK tabanlı) tanıtmak istiyorum , ancak zaten var olan bileşenlere nasıl bağlanacakları ve nasıl bağlanmaları veya bu tasarımın genel olarak nasıl entegre edileceğinden emin değilim.

İlgili birkaç fikir / nokta / soru akla geliyor:

  1. BT'lerim dosyalardan okunacak (tekrar). Şu anda en iyi nasıl BT Actionbu ağaçtaki bir ve benim uygulama gerçek kodlama arasındaki bağlantıyı görmek zor bir zaman var . BT dosyalarında kullanılan eylem adları ile gerçek mantık uygulamasının bir işlev işaretçisi arasında bir tür harita oluşturmalı mıyım? Bunu çözmek için olağan yaklaşım nedir?

  2. Tüm farklı tiplerim için BT'ler oluşturmak zorunda olacağımı varsayıyorum Entity(bu yüzden, birden fazla kez bahsedilen uzun "tip göstergesi" ile gösterildiği gibi her oyun-mantık / AI ile ilgili bileşen kombinasyonu için). Sonuç BT Actionolarak, eylem başına birçok bileşenin dahil edileceği için uygulamaları bileşenlere koymak mantıklı değil , değil mi?

  3. Peki, BT Actionmantık bir / birden fazla ayrı sistemde oturmalıdır (1 numaralı fikirden gelen haritayı kimin işaret ettiği)? Sistem daha sonra BT'nin şu anda kontrol edildiği ve belirli bir eylemi yürütmesi söylenen (sistemdeki = yöntem) gerçekten buna izin longverilip Entityverilmediğini (= gerekli bileşenlere sahip) benim "tip göstergeme" göre kontrol eder. Ancak, değilse, (örneğin BT yaratıcısı, gerekli bir bileşenin çalışma zamanında artık Varlığa eklenemeyeceği belirli bir durumu göz ardı ettiği için) hiçbir şey olmaz.

Sorular:

  • Bu tür bir entegrasyon için kanıtlanmış kavramlar var mı?
  • Yukarıdaki 3 puanımı nasıl alıyorsunuz?
  • Genel olarak bileşen / varlık tabanlı tasarımımla ilgili akla gelen başka şeyler var mı?

Konu 1: Davranış ağaçları, çoğunlukla karakter davranışı oluşturmak için kullanılan görsel bir DSL'den başka bir şey değildir. Bir BehaviorTree bileşeni, bir Komut Dosyası bileşeninden daha fazla veya daha az bir şey yapmamalıdır. 3. nokta: Bir haritanın normal alanlar üzerinde kullanılmasının nedeni nedir?
Eric

# 1: "DSL" bu bağlamda ne anlama geliyor? # 3: Üzgünüm, ama seni bu konuda takip edemem. Ne demek istediğini açıklamak ister misin?
Philip Allgaier

1
muhtemelen Etki Alanına Özel Dil, yani. çok özel bir sorunla çalışmak için özel bir sözdizimi.
Patrick Hughes

Anlambilim de bir parçası olmasına rağmen bu tanımdan "çok" çıkarılabilir. - Re 3: Özür dilerim şunu okumalı: "Bir haritayı bileşenlerde normal alanlar üzerinde kullanmanın nedeni nedir ?"
Eric

Re 3: Daha sonra dinamik olarak C ++ kodu (buzzword: veri odaklı) dışında ek özellikler belirtmek istiyorum. Basitlik uğruna ben (en azından şimdilik) tüm özellikleri bu genel çerçeveye koyarız (haritaları kullanarak), hatta kodda düzeltilmiş olanlar ve dolayısıyla gerçek C ++ alanları olabilir. Bir performans sorunu haline gelirse, daha sonra tekrar ziyaret etmek gerekebilir ...
Philip Allgaier

Yanıtlar:


2

Şu anda en iyi nasıl bu ağaçtaki bir BT Eylem ve benim uygulama gerçek kodlama arasındaki bağlantıyı görmek zor bir zaman var. BT dosyalarında kullanılan eylem adları ile gerçek mantık uygulamasının bir işlev işaretçisi arasında bir tür harita oluşturmalı mıyım? Bunu çözmek için olağan yaklaşım nedir?

İşlev işaretlerini unutun ve nesneleri düşünün. Davranış ağacındaki her düğüm (bu noktadan itibaren BT) ideal olarak kodunuzdaki bir nesneye karşılık gelir. Bu nesneler, onları bir ağaç olarak düzenlemenize ve onları gezdirmenize izin veren standart bir arayüze sahip olacaktır. Bir dizi işlev işaretçisi davranış için iyidir, ancak ağacınızın yapısını hiç yakalamaz.

Sonuç olarak, BT Eylem uygulamalarını bileşenlere koymak mantıklı değildir, çünkü her işlem için büyük olasılıkla birçok bileşen dahil edilecektir, değil mi?

Varlıkların, BT'nin ilgili verilerini depolayan tek bir BehaviorTree bileşenine sahip olmasını beklerim. BT'nin yürütülmesi, sisteminizdeki bileşenleri nasıl ele aldığınıza bağlı olarak BT Bileşeni veya BT Alt Sistemi tarafından gerçekleştirilir. Bileşenleri kullanan hemen hemen her şeyde olduğu gibi, işi yapmak için diğer bileşenlere başvurmaları gerekecek, ancak bu diğer bileşenlerin BT'ler hakkında hiçbir şey bilmeleri gerekmeyecek.

Mevcut farklı eylemler, en basit seviyede, çeşitli BT düğümü nesnelerine kodlanacaktır. Bileşenleri gerektiği gibi manipüle ederek ilgili tüzel kişiyi harekete geçirebilmelidir, örn. hareket etmek için hareket bileşenine erişme.


Paragraf # 1: Evet, BT'nin kendisi bir nesne olacak (AiGameDev'in sürümü gibi dediğim gibi). Sadece eylemlerin kendileri için functors düşünüyordum, ama 2. Paragrafınız bunu değiştirdi. Nedense bu gerçekten basit yaklaşım hiç aklıma gelmedi. Muhtemelen tüm yeni bileşen şey nedeniyle, artık düz ve basit düşünmedim, bu yüzden bileşenleri BT şeyleriyle karıştırmanın bir yolunu arıyordum, ama bu gerçekten gerekli değil.
Philip Allgaier

Daha önce kaybettiğim en önemli şey, eylemin varlıkla nasıl ilişkilendirileceği idi. Şimdi açıktır: Eylemler hangi varlığı kendi ağacı aracılığıyla bilir ve karşılığında hangi varlığı ait olduğunu bilir.
Philip Allgaier

@Philip Allgaier Merak ediyorum, nihayet BT düğümü oluşturdunuz? 1 davranış düğümü = 1 varlık (1 oyun nesnesi başına çok fazla varlık olurdu) olarak mı oluşturdunuz, yoksa normal sınıf olarak (ECS ile ilgili değil) düğüm mü oluşturdunuz veya başka yaklaşımlar mı kullandınız? Teşekkür!
cppBeginner
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.