今回のテーマは、「Dialogue System for Unityの使い方 第二回 会話条件編」です。
前回は、「Dialogue System for Unity」のチュートリアルのクイックスタートで、簡単なダイアログの表示方法を紹介しました。
今回は会話条件を設定して選択肢によって結果が変わるような設定方法を紹介します。
最後までやると以下のような表示ができるようになります。
前回の記事
以前の記事をまだ見ていないという方はそちらもよければ確認して下さい!
開発環境
Unity 2020.3.30f1 を利用して説明しています。
有料アセット「Dialogue System for Unity」を利用します。
前準備
- 3Dのプロジェクトを作成します。
- Dialogue System for Unityをインポートします。
チュートリアル 会話条件編
このチュートリアルでは、会話に条件を追加する方法を示します。NPC(探偵)が殺人についてプレイヤーに質問する会話を書きます。プレーヤーは、自宅または職場にいると返信できます。探偵はプレイヤーの答えに基づいてフォローアップします。
この記事は公式の動画と一緒に確認するとよりわかりやすい内容になっています。
データベースの作成
Assets>Plugins>Pxel Crushers>dialogue System>Prefabsの 「Dialogue Manager」プレハブをHierarchyにドラッグアンドドロップします。
「Dialogue Manager」のインスペクターからCreateを押して任意の名前でAssets直下にデータベースを作成します。
Dialogueエディタ アクターの設定
Dialogueエディタが開くので、Actorsタブをクリックします。 +マークを押して新しいアクターを追加します。
追加した行のNameに「Detective」(探偵)と名付けます。
その後、プレイヤーをクリックしてインスペクターを確認します。 そして、Use Display Nameにチェックを入れ、 Display Nameに「Mr.Smith」と入力します。
DialogueエディタのVariableタブを開き、 +からBooleanを追加します。
追加した行のNameを「AtWork」として、Descriptionに「プレイヤーは仕事中とのこと。」入力します。
会話の作成
次に、会話タブへ移動します。「Conversations」タブをクリックします。 +マークで新しい会話を作成し、インスペクターからTitleを「Questioning」と入力します。
「START」ノードの上で右クリックし、「Creaate Child Node」をクリックします。 ActorはPlayerでConversant(会話者)はDetective(探偵)になっています。
Dialogue Textに「ちょっと待った, [var=Actor]?」と入力します。 [var=Actor]とすることで、自動で表示名を置き換えることができます。
最終的にこんな感じになります。
さらに、この会話に対して子の会話を右クリックの「Creaate Child Node」から作成します。
会話者を反転ボタンを使って反転させます。
Dialogue Textに「午後9時にはどこにいたのですか?」と入力します。
さらに、会話の子ノードを右クリックの「Creaate Child Node」から作成します。 プレイヤーに「家です」と回答させます。
「家です」からさらに子ノードを作成し、「Lacy Devineがあなたの店で死んでいるのが発見されました。死亡時刻は午後9時です。」と入力します。
さらに、「午後9時にはどこにいたのですか?」からもう一つ子ノードを作成し、そちらは「仕事中でした」と回答させます。
Make Link で同じ回答につなげる
「仕事中でした」から右クリック「Make Link」をクリックすることで、同じ回答に繋げます。
そして最後の回答からさらに子ノードを追加して、 「私は家で寝ていました。」とDialogue Textに入力しましょう。
さらにその下のノードに、 「チェックアウトする。お帰りになって結構です。」とDialogue Textに入力しましょう。
「私は家で寝ていました。」から追加で子のノードを作成します 「仕事中じゃなかったのか?」とDialogue Textに入力しましょう。
「仕事中じゃなかったのか?」からさらに子のノードを2つ追加します。片方のDiaalogue Textに「弁護士を呼んでくれ!」を入力し、 もう一つのノードには「[走る]」を入力します。
Arrange Nodes で整列させる
最後にできあがったノードを整列します。 何もないところで右クリックして、「Arrange Nodes…」をクリックします。
そして、Verticallyを選択すると以下の画像のようにノードが整列します。
変数を設定し、フラグによって会話条件を設定する
次に「家です」ノードに条件付きロジックを追加します。 「家です」のノードをクリックして、インスペクターのScript の[…]をクリックして詳細を表示し、+マークで行を追加します。
Setの「Variable」を指定します。 そしてその横の項目で「AtHome」を選択してFalseを選択します。
入力が完了したら、Applyを押します。
同様に、「仕事中でした。」のScpritにもVariable、AtWorkを設定して、最後をTrueにします。 これで、プレイヤーの回答に応じて、変数にfalseまたはtrueを設定できます。
この変数の値に基づいて何を言うかを決定します。「チェックアウトする。お帰りになって結構です。」ノードのインスペクターを開きます。「Conditions」の値をVariable、AtWork,Is,Falseに設定します。
もう片方の「仕事中じゃなかったのか?」のConditionsにはTrueを設定します。
会話に強調タグを適用する
さらに走るを強調してみましょう。 [em1][/em1]で括るとその文字を強調する設定をDatabaseタブで設定することができます。
最終的にはこのような会話条件になりました。
Databaseタブに移動して強調設定をしてみましょう。 強調時に赤色日設定し、Italicを設定して斜体にしています。
会話用のオブジェクトを作成しトリガー設定する
これで会話条件の設定が完了したので、Hierarchyに空のオブジェクトを作成してこれを設定します。
空のオブジェクトにAdd Compornentで「Dialogue System Trigger」を追加します。 そして、Actionsから「Start Conversation」を選択します。
Triggerを起動時に実行する「On Start」に設定します。 ConversationにQuestioningを設定し、 Skip If No Valid Entiries(有効なエントリーがない場合はスキップ)にチェックを入れます。
これで設定完了です!再生して確認してみましょう。
条件やスクリプトで扱えるのは、変数だけではありません。
クエストの状態、アクターフィールド、そしてダイアログシステムに登録した独自のC#メソッドなども扱うことができます。
まとめ
今回、「Dialogue System for Unityの使い方 第二回 会話条件編」を紹介しました。
- Dialogueエディタ アクターの設定
- 会話の作成
- Make Link で同じ回答につなげる
- Arrange Nodes で整列させる
- 変数を設定し、フラグによって会話条件を設定する
- 会話に強調タグを適用する
- 会話用のオブジェクトを作成しトリガー設定する
ノーコードで会話条件を設定し、選択肢によって違う結果の会話を表示することができました。こういった分岐をプログラムで書いてしまうとあとからみたときに分かりづらくなることが多いと思いますが、ノードでイメージとして見れることによって慣れるとわかりやすいのではないかなと思います。
今後もDialogue Systemのチュートリアルを紹介していこうと思いますので、ぜひ一緒にやってみましょう。
今回の記事が、皆さんの技術力向上につながると嬉しいです。
もしこの記事が気に入りましたら、ぜひテクリエイトへのブックマーク登録をして頂けると喜びます。
以上、おつかれさまでした!