12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Dialogue System for Unityを導入してみる

Posted at

ゲームでよくある会話や、カットシーンを作れる「Dialogue System for Unity」というアセットを導入してみる記事です。

とにかく機能が豊富なアセットなんですが日本語での導入記事が少なく、これはどうやるんじゃ!と思ってもドキュメントを読み込むしか手段がなかったので、誰かの手助けになればと思い記事を書いた次第です。
自分のメモも兼ねています。
(すべての動作を把握しているわけではないので、間違いなどあるかもです。その場合はご指摘ください!)

環境
Unity:2021.2.0f1
Dialogue System for Unity:2.2.22

Dialogue System for Unityとは

会話ウィンドウの仕組みや、クエストシステムなどが作れるアセットです。

公式ドキュメント:http://www.pixelcrushers.com/dialogue_system/manual2x/html/

いいところ

  • 専用エディタで会話を作成可能
  • 会話の任意のタイミングで、カメラ操作やフェードイン/アウトなど演出に便利な様々な操作が可能
  • ローカライズにも対応
  • サードパーティ製のアセットやライブラリとの連携あり(程度は様々な模様)
    • TextMeshProやI2Localizationなど、かなりの数のアセットに対応しています。
  • Luaで挙動を制御可能(ぜんぜん把握していません)

微妙なところ

  • スクリプトの量がかなり多い
    • 人によるとは思いますが、やりたいことに対して余分な機能が多くなる可能性が高いです
  • すべて使いこなそうとすると、学習コストがある程度かかる(ほかのアセットに比べて)
  • 日本語の解説がありません!(そりゃそうだ)

Dialogue System for Unityを導入してみる

簡単な会話ができるようにしてみましょう。
基本的には、本家のGetting Startedに従う形になります。
最初はなぜかデフォルト動作である選択肢が出てくる会話パターンです。

アセットのインポート手順は省略します。
いつも通り、Package Managerから選択、ダウンロード後にインポートしてください。

データベースを用意する

まずは会話データを格納するDialog System専用のデータベースを作成します。
一つのデータベースの中に複数の会話を格納することができます。
データベースを作成する前に、シーンにDialogue Systemの動作を管理するオブジェクトを配置しましょう。

Dialogue Systemをインポート後にフォルダ構造を変えていなければ、Plugins/Pixel Crushers/Dialogue System/PrefabsDialogue Managerというプレハブがあります。
このプレハブをヒエラルキーにドラッグ&ドロップで配置しましょう。
(雑なスクショで申し訳なしです)
スクリーンショット 2021-11-05 164727.png

次に、追加されたオブジェクトのDialogueSystemControllerInitialiDatabase横にあるCreateボタンを押してデータベースを作成しましょう。
スクリーンショット 2021-11-05 170129.png

どこに保存するか聞かれるので、適当な場所を指定しましょう。
とりあえず「DialogueSystemDatabases」というフォルダを作成、その下に「Dialogue Database.asset」(デフォルトの名前)で保存しました。

会話の作成

次に、新しいウィンドウ(Dialogueウィンドウ)が開いているはずなので、Conversationsタブに移動しましょう。
データベースが作られていると先ほどのCreateのボタンがEditに変わるのでそこからも遷移できます。
作成したデータベースファイルからも遷移できます。

Conversationsタブに移動したら、「+」ボタンから会話を作成しましょう。
ここで作成される会話は、例えば「NPC1とプレイヤーの会話」のような、複数のセリフのまとまりです。
これだけだとさっぱりした説明ですが、このセリフ中に演出を挟んだり選択肢を追加したり様々なことができます。
スクリーンショット 2021-11-05 170803.png

会話が作成されると、自動的に開始ノードも作成されます。
開始ノードを右クリックして、Create Child Nodeで子ノードを作ります。
スクリーンショット 2021-11-05 171307.png

ノードが一つ追加されたはずです。
このノード一つが、ひとつのセリフと考えればOKです。
追加されたノードを選択して、インスペクターのDialogue Textにセリフを入れましょう。
スクリーンショット 2021-11-05 172323.png

ついでにもう一つセリフを追加しましょう。
先ほどと同様の手順で、今追加したノードの子ノードを追加しましょう。
そうすると青いノードが追加されたと思います。
これは「Player」のセリフで、灰色のノードは「NPC」のセリフとなっています。
この切り替えはノードの設定で逆にしたりすることができます。
同様にセリフも入力しておきます。
スクリーンショット 2021-11-05 172819.png

最後に、ヒエラルキーの「Dialogue Manager」を選択して、Initial databaseに今作成したデータベースを割り当てておきましょう(ひょっとしたらもう割り当たっているかもしれないです)。
Auto-Backupなる同じ内容のファイルがありますが、直接作成したほうを指定しましょう。スクリーンショット 2021-11-05 174138.png

会話する対象を追加する

ここまでできたら、会話データが完成したので、会話をしてもらうオブジェクトを作成しましょう。

まずはプレイヤーとなるオブジェクトを作成します。
今回は例に倣い、空のオブジェクトを用意します。
名前はとりあえず「Player」にしました。

次にNPCオブジェクトとして、シーンにCubeを配置します。(cubeじゃなくてもOK:コライダーがついていればよいはず)
追加したcubeにDialogue System Triggerを追加します。
スクリーンショット 2021-11-05 174540.png

このトリガーで、会話が始まるようにDialogueSystemTriggerActionsAddActionボタンを押して、Start Conversationを選択します。
Conversationの項目のドロップダウンから「New Conversations 1」(先ほど作成した会話データ)を選びます。
さらに、Conversation Actorに先ほど追加したPlayerを割り当て、Conversation ConversantにNPCを割り当てます。

このNPCオブジェクトがどの会話を行い、誰と会話するのかが設定できました。スクリーンショット 2021-11-05 175012.png

最後に、Triggerの設定をOn Startにして、オブジェクトのStart()メソッドが呼ばれたタイミングでこのトリガーが発火するようにしましょう。
スクリーンショット 2021-11-05 175448.png

ここまでできたら再生してみましょう。
ezgif.com-gif-maker.gif

...なにか動きがぎこちないですが、ちゃんと表示されましたね。

さて、挙動をみるとわかるのですが、最後のプレイヤーのセリフが選択式になっています。
これはDialogue Systemのデフォルトの動作のようです。
正直、選択肢よりは普通に会話ダイアログが交互に表示されるのが一般的かなと思います。
こちらは後でそのように組み替えてみるので、お楽しみに。

NPCオブジェクトを選択したときに会話を開始するようにする

シーン開始時に会話が始まるように設定していましたが、今度はNPCのオブジェクトをクリックしたときに会話が始まるようにします。

NPCオブジェクトのDialogueSystemTriggerコンポーネントのTriggerOn Useに変更します。
それに加えて、Usableというコンポーネントを追加、Max Use distanceを30に設定します。
これは、カメラから30mまでは話しかけることができる、というような設定です。
これでNPCが選択できるようになりました。
スクリーンショット 2021-11-05 182520.png

次にPlayerオブジェクトにSelectorというコンポーネントを追加します。
その名の通り、会話をする対象を選択するためのコンポーネントです。
このコンポーネントのSelect AtMouse Positionに設定しておきましょう。
こうすることで、マウスによって会話対象を選択することができます。
スクリーンショット 2021-11-05 182930.png

これで設定は終わりました!
再生してみましょう。
マウスカーソルをcubeの上に持っていくと...NPCの情報が表示されます。(UseDefaultGUIのチェックを外すと出なくなります)
cubeを左クリック...ではなく、右クリックすると会話が始まります。
ezgif.com-gif-make3.gif

セリフが交互に出るようにする(選択肢ではない方式にする)

最後のセリフが選択式になっていましたが、ここではNPCのセリフ同様にプレイヤー用のセリフもシンプルなウィンドウで表示されるように変更しましょう。

Dialogue ManagerオブジェクトのDialogueSystemControllerの設定を二つ変更すればOKです。

  • Subtitle Settings >Show PC Subtitles During Line をチェック
  • Input Settings > Always Force Response Menuのチェックを外す
    スクリーンショット 2021-11-05 184728.png

これで再生してみましょう。
ezgif.com-gif-maker4.gif

会話レイアウトがどうなっているか見てみる

会話は作れましたが、会話時に表示されるのはデフォルトUIです。
実際に使用するときはどうやって改造するのかをちょっとだけ見てみます。

デフォルトの状態だと、DialogueSystemControllerDialogue UIの項目にBasic Standard Dialogue UIというプレハブが割り当てられています。
ここの設定でレイアウトを決めているようです。
スクリーンショット 2021-11-05 185940.png

このプレハブの内容を見てみましょう。
image.png

なるほど、先ほど表示されていたUIがレイアウトされていますね。
各オブジェクトをインスペクターで見てみると、要所要所にDialogue SystemのUI要素を表すコンポーネントが追加されています。
StandardDialogueUIは各UI要素を束ねる存在のようです。
StandardUISubtitlePanelは、NPCやプレイヤーのセリフを表示するUIのようです。
...などなど。
UIに関しては、公式ドキュメントのこの項目で解説されています。

実際にDialogue Systemを使用するときは、このプレハブを複製してそれぞれのUIを置き換えていけばよさそうですね。

まとめ

Dialogue System for Unityを導入し、実際に使用できそうなところまで見てみました。
このほかにも触れられるトピックはうんとありそうです。
演出周りの設定の仕方、ローカライズの方法、クエストシステムについてなどなど...

かなりボリュームがあるアセットで、うまく使えば3Dのゲーム・2Dのゲームに関わらず活躍できそうなアセットです。
個人的には、このアセットを使用する場合はまるっとこのアセットに身を任せてゲームを作るほうがより真価を発揮しそうかなと思います。
一部の機能だけ使おうとすると、ほかの使わない機能がたくさんついてくるイメージですね~。

この記事がどなたかの参考になれば幸いです!

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?