Diyalog ağaçları nasıl çalışır?


20

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.


Bence dialog-treeetiket sahibi olmak harika olurdu .
user1306322

Kod örnekleri istemek genellikle olumlu görünmez.
MichaelHouse

Paylaşmaya değer bazı iletişim ağacı 101 kod örnekleri varsa, zarar veremedi.
user1306322

Sorun, bu sitenin sorulara doğru cevaplar almasıdır. Kod örnekleri toplamak için değil.
MichaelHouse

Bu yüzden cümle "if" ile başlar. Ama istediğim, iletişim hatlarının birbirine koda verimli bir şekilde çevrilebilecek şekilde nasıl bağlandığına dair açıklama. Sonuçta ben C # yazacağım.
user1306322

Yanıtlar:


24

"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 Linkveri 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.

resim açıklamasını buraya girin


+1 Bağlantılardaki kurallardan ve koşullardan bahsetmek için, basit bir yönlendirilmiş grafik genellikle yeterli değildir ve bunlara ihtiyacınız olduğunda işler karmaşıklaşabilir.
Laurent Couvidou

+1 Bu yapıyı daha çok seviyorum. Yine de, ilk geçiş olarak tavsiye etmem. Daha basit bir şeyle başlardım. Kesinlikle ateş etmek daha iyi bir hedef.
MichaelHouse

+1 Çok ayrıntılı bir cevap için. Bu daha sonra benim için kullanışlı olabilir.
Marton

Bu görüntü benim için çok faydalı oldu, ama DialogueLine'ın Bağlantıdan neden ayrı olduğunu merak etmeliyim? Her bağlantının kendi yanıt metni olmaz mı? Ve NPC'nin metni nereye giderdi? Düğümde olması mantıklı değil mi?
Kyle Baran

@Danjen Bu yapıda, bir Bağlantı bir sonraki diyalog seçeneği görünene kadar muhtemelen farklı karakterlerden olmak üzere birden fazla DialogueLine içerebilir. Burası aynı zamanda NPC metninin de gittiği yerdir. Çizgiler tekrarlandığında, farklı Bağlantılar DialogueLines'ı paylaşabilir, muhtemelen listelerinde (Vector) yeniden sıralayabilir, parçalarını farklı çizgilerle değiştirebilir, kesitler ekleyebilir vb.
Martin Sojka

16

Diyalog ağaçları yönlendirilmiş bir grafik yapısıyla oluşturulur .

resim açıklamasını buraya girin

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.


Bu resimde "Newton-belası" gibi durumlarda ne yapacağımı anlayamıyorum. Koddaki bu satırların sırasını tekrar etmeden nasıl ayarlayacağınız gibi.
user1306322

Sık sık diyalog olduğunu göreceksiniz olabilir tekrarlanmalıdır. Genellikle sadece bir şekilde işaretlenir, böylece kullanıcı bu iletişim yolunu zaten seçtiğini bilir. Kenarlarınıza daha önce seçilip seçilmediğini gösteren bir bayrak koyabilirsiniz. Dolayısıyla, kullanıcıların tekrar seçmesine (kendilerini yenilemesine) izin vermek veya göstermemek size kalmış.
MichaelHouse

1
Normalde kod satırlarının sıralaması ile değil, veri yapısındaki referanslarla yapılır.
Kylotan

7

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:

Bükülmüş küçük pasajların labirentindesiniz, hepsi aynı

İ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.


4

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 ...

http://www.youtube.com/watch?v=6uGg6bUYyUU


2

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 currentNodedeğişkene koyarsınız, her şeyi bir şekilde görüntüler, ardından bir seçim yapıldığında rootNodeokun hedefine ayarlayın. Sözde kodda:

Node&    currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
    stage.displayNode( currentNode );
    currentNode = stage.waitForUserToChoose();
}

1

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)


Soru C # istiyor.
Seth Battin

D'oh - bunun için üzgünüm.
Scott Wilson
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.