つまり、サブ会話が終了したときに、何にどのように接続され、どのようにスピーチの行間を移動するのですか?
C#の基本的なダイアログツリーの例がある場合は、投稿してください。
つまり、サブ会話が終了したときに、何にどのように接続され、どのようにスピーチの行間を移動するのですか?
C#の基本的なダイアログツリーの例がある場合は、投稿してください。
回答:
「ダイアログツリー」という名前は少し誤解を招く恐れがあります。通常、ツリーだけでなく、単純な有向グラフです。このようなグラフの基本的なデータ構造は、通常、ノードが会話中にあるポイントを表し、ノードから他のノードへのリンクを表すノードの「データ」で構成されます。必要に応じて、可視性を制限するための条件や、さまざまな追加アクションを実行するためのスクリプトがあります。通常、ノードの1つはデフォルトの開始ノード(通常のラベルは「ROOT」、「START」、および「GREETING」)であり、それらからの有効なリンクを持たないノードは会話を終了します。
ほとんどの場合、グラフはメモリ内でNode
データ構造のリストとして表され、それぞれが少なくともIDと0..n Link
データ構造のリストを持っています。リストは、NPCに対してローカルにすることも、グローバルにリストすることもできます。情報を得るために話すことができる一般的なNPCがたくさんあるが、それ自体では特定の会話を提供しない場合、2番目のケースが優先されます。システム自体がNPCの開始会話ノードを見つけ、そのIDを現在の会話IDとして記憶し、プレーヤーが選択できる現在有効なリンク(または有効なリンクがない場合は「[会話終了]」)を提示し、待機します入力。プレーヤーがリンクを選択すると、関連するダイアログラインが表示され、関連するスクリプトが実行されます。
リンクに複雑なルールと条件を設定する代わりに、単純な「有効な」ブール変数を使用して取得できます。この変数は、他の会話リンクのスクリプト(開始ノードからのデフォルトを含む)または外部から変更できますメカニズム。一般に、このアプローチはより単純ですが、「この応答はいつ可能か」という論理を動かすため、このような会話が非常に少ないゲームにのみ適しています。応答データ自体から離れています。
ここで説明する構造は、ノードにダイアログラインが必要ないという点で、Byte56とは若干異なります。リンクにすべてを含めることができます。最も基本的なバリアントでは、これは次の構造に変換されます。
ダイアログツリーは、有向グラフ構造で作成されます。
グラフは、プレイヤーが行うダイアログの決定に基づいてトラバースされます。ユーザーに提供されるダイアログオプションは、他のダイアログノードへのパスを定義するエッジに由来します。
有向グラフは基本的なデータ構造です。それらは簡単に実装でき、おそらく自分で実装したいと思うでしょう。グラフをダイアログのニーズに合わせて調整する必要があるためです。
一部のノードは、表示されるために特別な条件を満たしている必要があります。たとえば、プレイヤーはXを超えるスピーチのスキルを必要とします。または、プレイヤーはダイアログの1つのブランチを進む前にミッションZを完了している必要があります。または、NPCが彼らと話し合う前に、彼らは何かを4回尋ねる必要があります。これらの機能は、ゲームに合わせてカスタマイズされます。ただし、ノードトラバーサルとエッジトラバーサルを実装する場合は、言及する価値があります。もちろん、最も簡単なフォームから始めて、そこから構築することが常に最善です。
http://iki.fi/sol/d3/という単純なダイアログツリーシステムを構築しました。 現在、「エンジン」自体は単純なcですが、エディターによって生成されるデータは、どの言語でも非常に簡単に使用できます。このツールは、XML、JSON、およびカスタムバイナリ形式を出力します。
主な概念は非常に単純です。
ダイアログの各ノード(上記のアナログのように「カード」と呼びます)は、質問テキストと0個以上の回答で構成されます。それぞれの答えは別のカードにつながります。
また、タグが設定されている(またはタグが設定されていない)場合にのみ特定の回答がユーザーに表示されるタグシステムもあります。カードを入力すると、指定したタグが設定(または設定解除)されます。
これは、ゲーム内のあらゆる種類のダイアログについて行う必要があるほぼすべてのことです。「質問テキスト」はプレーンテキストにすることも、アニメーションなどを駆動するスクリプトにすることもできます。
TreeSharpとビヘイビアツリーを使用して、対話システムをモデル化できます。TreeSharpは、シンプルなビヘイビアツリーの実装を提供するライブラリです。うわー、IAボットはこれで完了しているので、成熟しています... :)
私の実装には、回答から選択できるノードがあり、各回答は、ダイアログまたはアクション、アクションのシーケンス、または別のダイアログに移動できるノード...または必要なものに結合できます...
Brainiac Editorを使用して視覚的に作成しました...しかし、最終的にはtreeharpに基づいてc#コードを生成します...
有向(おそらく循環)グラフが必要です。
ノードをオブジェクトとしてモデル化し、グラフのノードのすべての外向き矢印も個別のオブジェクトとしてモデル化されます。ノードには外向きの矢印のリストがあり、各「矢印」オブジェクトには表示するテキストと宛先への参照があります。確かではありませんが、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();
}
最近Nodeを使用してこのようなものを開発する必要があり、会話ノードの有向グラフを表す非常に基本的なテキストファイル構造を選択しました。
結果のコードとテキスト形式は次の場所で確認できます。
https://github.com/scottbw/dialoguejs
条件やイベントトリガーは(まだ)サポートしていませんが、おそらく多くのゲーム開発者にとっては十分に簡単です。
(GPLのコード自体、ところで)
dialog-tree
タグがあればいいと思います。