Yani, bir alt konuşma sona erdiğinde konuşma çizgileri arasında neye ve nasıl hareket edileceğine bağlı olan nedir?
C # 'da temel bir iletişim ağacı örneği varsa, lütfen bunları gönderin.
Yani, bir alt konuşma sona erdiğinde konuşma çizgileri arasında neye ve nasıl hareket edileceğine bağlı olan nedir?
C # 'da temel bir iletişim ağacı örneği varsa, lütfen bunları gönderin.
Yanıtlar:
"Diyalog ağacı" adı biraz yanıltıcıdır - genellikle sadece ağaçlar değil , basit yönlendirilmiş grafiklerdir . Bu tür grafiklerin temel veri yapısı genellikle konuşmalar sırasında bulunduğumuz noktaları temsil eden düğümler için bir tür "verilerden" oluşur ve onlardan katılımcılar tarafından söylenen ve yapılanları temsil eden diğer düğümlere bağlanır. ve isteğe bağlı olarak çeşitli ek eylemler gerçekleştirmek için görünürlüklerini veya komut dosyalarını sınırlandırmak için koşullara sahip olabilirler. Genellikle düğümlerden biri varsayılan başlangıç düğümüdür (bunun için "ROOT", "START" ve "GREETING" olan tipik etiketler) ve onlardan önde gelen geçerli bağlantıları olmayan düğümler konuşmayı bitirir.
Çoğu durumda, grafik Node
, her biri en az bir ID'ye ve 0..n Link
veri yapılarının bir listesine sahip olan veri yapılarının bir listesi olarak bellekte temsil edilir . Liste NPC için yerel veya global bir liste olabilir; ikinci durum, bilgi için konuşulabilecek, ancak kendi başlarına belirli bir konuşma sunmayan çok sayıda genel NPC'niz varsa tercih edilir. Sistemin kendisi, NPC için başlangıç konuşma düğümünü bulur, kimliğini geçerli konuşma kimliği olarak hatırlar, oynatıcının seçebileceği geçerli bağlantıları sunar (veya geçerli bağlantı yoksa "[son konuşma]") ve bekler giriş. Oynatıcı bir bağlantı seçtiğinde, ilişkili diyalog satırları görüntülenir ve ilişkili komut dosyaları çalıştırılır.
Bağlantılarda karmaşık kurallara ve koşullara sahip olmak yerine, basit bir "geçerli" boole değişkeni ile başlayabilirsiniz; bu, daha sonra diğer konuşma bağlantılarının komut dosyalarından (başlangıç düğümünden varsayılan değer dahil) veya dışarıdan değiştirilebilir mekanizmaları. Genel olarak, bu yaklaşım daha basittir, ancak bu tür konuşmaları çok az olan oyunlar için uygundur, çünkü "Bu yanıt ne zaman mümkündür?" Mantığını taşır. yanıt verisinin kendisinden uzakta .
Burada tarif ettiğim yapının, düğümlerin herhangi bir diyalog çizgisine sahip olması gerekmediği için Byte56'dan biraz farklı olduğunu unutmayın; bağlantılar hepsine sahip olabilir. En temel varyantta, bu aşağıdaki yapıya dönüşür.
Diyalog ağaçları yönlendirilmiş bir grafik yapısıyla oluşturulur .
Grafik, oynatıcının aldığı diyalog kararlarına göre hareket ettirilir. Kullanıcıya sağlanan diyalog seçenekleri, diğer diyalog düğümlerine giden yolları tanımlayan kenarlardan gelir.
Yönlendirilmiş grafikler temel bir veri yapısıdır. Kolayca uygulanabilirler ve muhtemelen kendiniz uygulamak istersiniz. Grafiği diyalog ihtiyaçlarınıza göre ayarlamak isteyeceksiniz.
Bazı düğümlerin görünmesi için özel koşulların karşılanması gerekebilir. Örneğin, oyuncu X'in üzerinde konuşma becerisine ihtiyaç duyacaktır. Ya da oyuncunun bir diyalog dalında ilerleyebilmesi için Z görevini tamamlamış olması gerekir. Ya da NPC'nin onlarla tartışması için 4 kez bir şey sormaları gerekir. Bu özellikler oyununuza özel olacak. Ancak, düğüm ve kenar geçişini uygularken bahsetmeye değer. Tabii ki en basit formla başlamak ve oradan inşa etmek her zaman en iyisidir.
Ben basit bir iletişim sistemi inşa ettik: http://iki.fi/sol/d3/ "motor" kendisi şu anda düz c, ama editör tarafından üretilen veri herhangi bir dilde kullanımı oldukça basittir. Araç XML, JSON ve özel bir ikili biçim verir.
Ana konsept oldukça basit:
İletişim kutusunun her bir düğümü (yukarıdaki kartta olduğu gibi "kart" diyorum) soru metni ve sıfır veya daha fazla cevaptan oluşur. Cevapların her biri başka bir karta yönlendirir.
Ayrıca, yalnızca bir etiket ayarlandığında (veya bir etiket ayarlanmadığında) belirli yanıtların kullanıcıya gösterildiği bir etiket sistemi de vardır. Kart girme, belirtilen etiketleri ayarlar (veya gruplardan çıkarır).
Bu, bir oyunda hemen hemen her türlü iletişim kutusunu yapmak için gereken her şeydir. "Soru metni" düz metin olabilir veya animasyonu yönlendiren bir komut dosyası olabilir.
Bir diyalog sistemi modellemek için TreeSharp ve davranış ağaçlarını kullanabilirsiniz. TreeSharp basit bir davranış ağacı uygulaması sağlayan bir kütüphanedir. Vay için IA botları bununla yapılır, bu yüzden olgun ... :)
Uygulamamın cevaplar arasında seçim yapmasına izin veren düğümleri var ve her cevap başka bir diyaloga veya bir eyleme gitmeye izin veren bir düğüme veya bir dizi eyleme veya bir düğüme birleştirilebilir ...
Görsel yapmak için brainiac editörü kullandım ... ama sonunda treesharp dayalı c # kodu üretir ...
Yönlendirilmiş (muhtemelen döngüsel) bir grafik istiyorsunuz.
Düğümleri nesne olarak modellersiniz ve bir grafiğin düğümündeki tüm giden oklar da ayrı nesneler olarak modellenir. Düğümde giden okların bir listesi vardır ve her "ok" nesnesinin görüntülenecek bir metni ve hedefe bir referansı vardır. Emin değilim, ama C # nesnelerinde her zaman başvurulduğunu düşünüyorum, bu yüzden önce sadece nesneleri oluşturursunuz ve daha sonra ok nesnelerini oluşturduğunuzda, aynı nesneyi iki okun hedef alanına takın. (C ++ 'da bir referans veya işaretçi türü, Düğüm ve Düğüm * kullanırsınız)
Bunun gibi şeyleri diskten yüklemek için, genellikle her düğüme benzersiz bir kimlik numarası verilir, ardından tüm düğümleri dizinin o benzersiz sayı olduğu bir diziye yükler. Daha sonra oklar, gerçek nesne değil, sayı yazılarak serileştirilir.
Bir ok yüklediğinizde, işaret ettiği düğüme başvuru almak için dizi ve kimliği kullanırsınız. Nesneyi iki kez yazdıysanız, aynı görünen iki ayrı nesne elde edersiniz, bu muhtemelen istediğiniz şey değildir.
Bir iletişim ağacının işlenmesi çok basit hale gelir. Kök düğümü bir currentNode
değişkene koyarsınız, her şeyi bir şekilde görüntüler, ardından bir seçim yapıldığında rootNode
okun hedefine ayarlayın. Sözde kodda:
Node& currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
stage.displayNode( currentNode );
currentNode = stage.waitForUserToChoose();
}
Son zamanlarda Düğüm kullanarak böyle bir şey geliştirmek zorunda kaldı ve konuşma düğümleri yönlendirilmiş bir grafik temsil etmek için çok temel bir metin dosyası yapısını tercih etti.
Ortaya çıkan kodu ve metin biçimini şu adreste görebilirsiniz:
https://github.com/scottbw/dialoguejs
Koşulları veya olay tetikleyicilerini desteklemiyor (henüz), ancak muhtemelen birçok oyun geliştiricisi için başlayacak kadar basittir.
(Kodun kendisi GPL, btw)
dialog-tree
etiket sahibi olmak harika olurdu .