ダイアログツリーはどのように機能しますか?


20

つまり、サブ会話が終了したときに、何にどのように接続され、どのようにスピーチの行間を移動するのですか?

C#の基本的なダイアログツリーの例がある場合は、投稿してください。


dialog-treeタグがあればいいと思います。
user1306322

コードサンプルを要求することは通常好意的に見られません。
マイケルハウス

共有する価値のあるダイアログツリー101のコードサンプルがあれば、それは害になりません。
user1306322

問題は、このサイトは質問に対する正しい答えを得るためのものだということです。コードサンプルの収集用ではありません。
マイケルハウス

それが、文が「if」で始まる理由です。しかし、私が求めているのは、効率的にコードに変換できる方法でダイアログ行が互いに接続する方法についての説明です。結局、C#で記述します。
user1306322

回答:


24

「ダイアログツリー」という名前は少し誤解を招く恐れがあります。通常、ツリーだけでなく、単純な有向グラフです。このようなグラフの基本的なデータ構造は、通常、ノードが会話中にあるポイントを表し、ノードから他のノードへのリンクを表すノードの「データ」で構成されます。必要に応じて、可視性を制限するための条件や、さまざまな追加アクションを実行するためのスクリプトがあります。通常、ノードの1つはデフォルトの開始ノード(通常のラベルは「ROOT」、「START」、および「GREETING」)であり、それらからの有効なリンクを持たないノードは会話を終了します。

ほとんどの場合、グラフはメモリ内でNodeデータ構造のリストとして表され、それぞれが少なくともIDと0..n Linkデータ構造のリストを持っています。リストは、NPCに対してローカルにすることも、グローバルにリストすることもできます。情報を得るために話すことができる一般的なNPCがたくさんあるが、それ自体では特定の会話を提供しない場合、2番目のケースが優先されます。システム自体がNPCの開始会話ノードを見つけ、そのIDを現在の会話IDとして記憶し、プレーヤーが選択できる現在有効なリンク(または有効なリンクがない場合は「[会話終了]」)を提示し、待機します入力。プレーヤーがリンクを選択すると、関連するダイアログラインが表示され、関連するスクリプトが実行されます。

リンクに複雑なルールと条件を設定する代わりに、単純な「有効な」ブール変数を使用して取得できます。この変数は、他の会話リンクのスクリプト(開始ノードからのデフォルトを含む)または外部から変更できますメカニズム。一般に、このアプローチはより単純ですが、「この応答はいつ可能か」という論理を動かすため、このような会話が非常に少ないゲームにのみ適しています。応答データ自体から離れています。


ここで説明する構造は、ノードにダイアログラインが必要ないという点で、Byte56とは若干異なります。リンクにすべてを含めることができます。最も基本的なバリアントでは、これは次の構造に変換されます。

ここに画像の説明を入力してください


+1リンクのルールと条件について言及する場合、単純な有向グラフでは多くの場合十分ではなく、それらが必要になり始めると事態が複雑になる可能性があります。
ローランクーヴィドゥ

+1私はその構造が好きです。ただし、最初のパスとしてはお勧めしません。もっとシンプルなものから始めましょう。それは確かに撮影するのに適したターゲットです。
マイケルハウス

+1非常に詳細な回答。これは後で役に立つかもしれません。
マートン

この画像は私にとって非常に役立ちましたが、DialogueLineがリンクとはなぜ独立しているのか疑問に思う必要があります。各リンクには独自の応答テキストがありませんか?そして、NPCのテキストはどこに行くのでしょうか?ノードに含めることは意味がありませんか?
カイルバラン

@Danjenこの構造では、リンクは、次のダイアログの選択肢が表示されるまで、おそらく異なる文字からの複数のDialogueLineを持つことができます。これは、NPCのテキストが行く場所でもあります。行が繰り返されると、さまざまなリンクがDialogueLineを共有し、場合によってはリスト(ベクター)でそれらを並べ替え、それらの一部を別の行に置き換え、間投詞などを追加できます。
マーティンソイカ

16

ダイアログツリーは、有向グラフ構造で作成されます。

ここに画像の説明を入力してください

グラフは、プレイヤーが行うダイアログの決定に基づいてトラバースされます。ユーザーに提供されるダイアログオプションは、他のダイアログノードへのパスを定義するエッジに由来します。

有向グラフは基本的なデータ構造です。それらは簡単に実装でき、おそらく自分で実装したいと思うでしょう。グラフをダイアログのニーズに合わせて調整する必要があるためです。

一部のノードは、表示されるために特別な条件を満たしている必要があります。たとえば、プレイヤーはXを超えるスピーチのスキルを必要とします。または、プレイヤーはダイアログの1つのブランチを進む前にミッションZを完了している必要があります。または、NPCが彼らと話し合う前に、彼らは何かを4回尋ねる必要があります。これらの機能は、ゲームに合わせてカスタマイズされます。ただし、ノードトラバーサルとエッジトラバーサルを実装する場合は、言及する価値があります。もちろん、最も簡単なフォームから始めて、そこから構築することが常に最善です。


この写真の「Newton-trouble」のような場合にどうすればよいかわかりません。コード内のこれらの行の順序を、繰り返さずに設定する方法が好きです。
user1306322

多くの場合、ダイアログ繰り返すことできます。通常は何らかの方法でマークされているため、ユーザーはすでにそのダイアログパスを選択していることがわかります。エッジが選択されているかどうかを示すフラグをエッジに配置できます。そのため、ユーザーが再度選択できるようにする(自分自身を更新する)か、表示しないようにするかは、ユーザー次第です。
マイケルハウス

1
通常、コードの行の順序付けではなく、データ構造内の参照を介して行われます。
キロタン

7

http://iki.fi/sol/d3/という単純なダイアログツリーシステムを構築しました。 現在、「エンジン」自体は単純なcですが、エディターによって生成されるデータは、どの言語でも非常に簡単に使用できます。このツールは、XML、JSON、およびカスタムバイナリ形式を出力します。

主な概念は非常に単純です。

あなたはすべて同様に曲がりくねった小さな通路の迷路にいます

ダイアログの各ノード(上記のアナログのように「カード」と呼びます)は、質問テキストと0個以上の回答で構成されます。それぞれの答えは別のカードにつながります。

また、タグが設定されている(またはタグが設定されていない)場合にのみ特定の回答がユーザーに表示されるタグシステムもあります。カードを入力すると、指定したタグが設定(または設定解除)されます。

これは、ゲーム内のあらゆる種類のダイアログについて行う必要があるほぼすべてのことです。「質問テキスト」はプレーンテキストにすることも、アニメーションなどを駆動するスクリプトにすることもできます。


4

TreeSharpとビヘイビアツリーを使用して、対話システムをモデル化できます。TreeSharpは、シンプルなビヘイビアツリーの実装を提供するライブラリです。うわー、IAボットはこれで完了しているので、成熟しています... :)

私の実装には、回答から選択できるノードがあり、各回答は、ダイアログまたはアクション、アクションのシーケンス、または別のダイアログに移動できるノード...または必要なものに結合できます...

Brainiac Editorを使用して視覚的に作成しました...しかし、最終的にはtreeharpに基づいてc#コードを生成します...

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


2

有向(おそらく循環)グラフが必要です。

ノードをオブジェクトとしてモデル化し、グラフのノードのすべての外向き矢印も個別のオブジェクトとしてモデル化されます。ノードには外向きの矢印のリストがあり、各「矢印」オブジェクトには表示するテキストと宛先への参照があります。確かではありませんが、C#オブジェクトでは常に参照されるため、最初にオブジェクトを作成し、次に矢印オブジェクトを作成するときに、同じオブジェクトを2つの矢印の宛先フィールドに接続します。(C ++では、参照またはポインター型、Node&またはNode *を使用します)

このようなものをディスクからロードするには、通常、各ノードに一意のID番号を付与し、インデックスがその一意の番号である配列にすべてのノードをロードします。次に、実際のオブジェクトではなく、数字を書き込むことで矢印がシリアル化されます。

矢印をロードするとき、配列とIDを使用して、矢印が指すノードへの参照を取得します。オブジェクトを2回書き出すと、まったく同じに見える2つの別個のオブジェクトが得られますが、これはおそらく望んでいないものです。

ダイアログツリーの処理は非常に簡単になります。ルートノードをcurrentNode変数に入れて、なんとかして全体を表示し、選択が行われたらrootNode矢印の行き先に設定します。擬似コードで:

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

1

最近Nodeを使用してこのようなものを開発する必要があり、会話ノードの有向グラフを表す非常に基本的なテキストファイル構造を選択しました。

結果のコードとテキスト形式は次の場所で確認できます。

https://github.com/scottbw/dialoguejs

条件やイベントトリガーは(まだ)サポートしていませんが、おそらく多くのゲーム開発者にとっては十分に簡単です。

(GPLのコード自体、ところで)


質問はC#を要求します。
セスバティン

D'oh-ごめんなさい。
スコットウィルソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.