ゲームでよくある会話や、カットシーンを作れる「Dialogue System for Unity」というアセットを導入してみる記事です。
とにかく機能が豊富なアセットなんですが日本語での導入記事が少なく、これはどうやるんじゃ!と思ってもドキュメントを読み込むしか手段がなかったので、誰かの手助けになればと思い記事を書いた次第です。
自分のメモも兼ねています。
(すべての動作を把握しているわけではないので、間違いなどあるかもです。その場合はご指摘ください!)
環境
Unity:2021.2.0f1
Dialogue System for Unity:2.2.22
Dialog System for Unityアセットをお試し中です。
— asiram / unityゲーム開発 (@asiramasiram) November 4, 2021
なるほど、会話はグラフ的に作れて...
メッセージが出る部分は所定のコンポーネントを張り付けたオブジェクトを設定する感じですね。
組み込まれているものを改造して使う感じのようです。
もっとできることを調査せねばー#Unity pic.twitter.com/l6hDbHV5kx
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/Prefabs
にDialogue Manager
というプレハブがあります。
このプレハブをヒエラルキーにドラッグ&ドロップで配置しましょう。
(雑なスクショで申し訳なしです)
次に、追加されたオブジェクトのDialogueSystemController
のInitialiDatabase
横にあるCreate
ボタンを押してデータベースを作成しましょう。
どこに保存するか聞かれるので、適当な場所を指定しましょう。
とりあえず「DialogueSystemDatabases」というフォルダを作成、その下に「Dialogue Database.asset」(デフォルトの名前)で保存しました。
会話の作成
次に、新しいウィンドウ(Dialogueウィンドウ)が開いているはずなので、Conversations
タブに移動しましょう。
データベースが作られていると先ほどのCreate
のボタンがEdit
に変わるのでそこからも遷移できます。
作成したデータベースファイルからも遷移できます。
Conversations
タブに移動したら、「+」ボタンから会話を作成しましょう。
ここで作成される会話は、例えば「NPC1とプレイヤーの会話」のような、複数のセリフのまとまりです。
これだけだとさっぱりした説明ですが、このセリフ中に演出を挟んだり選択肢を追加したり様々なことができます。
会話が作成されると、自動的に開始ノードも作成されます。
開始ノードを右クリックして、Create Child Node
で子ノードを作ります。
ノードが一つ追加されたはずです。
このノード一つが、ひとつのセリフと考えればOKです。
追加されたノードを選択して、インスペクターのDialogue Text
にセリフを入れましょう。
ついでにもう一つセリフを追加しましょう。
先ほどと同様の手順で、今追加したノードの子ノードを追加しましょう。
そうすると青いノードが追加されたと思います。
これは「Player」のセリフで、灰色のノードは「NPC」のセリフとなっています。
この切り替えはノードの設定で逆にしたりすることができます。
同様にセリフも入力しておきます。
最後に、ヒエラルキーの「Dialogue Manager」を選択して、Initial database
に今作成したデータベースを割り当てておきましょう(ひょっとしたらもう割り当たっているかもしれないです)。
Auto-Backupなる同じ内容のファイルがありますが、直接作成したほうを指定しましょう。
会話する対象を追加する
ここまでできたら、会話データが完成したので、会話をしてもらうオブジェクトを作成しましょう。
まずはプレイヤーとなるオブジェクトを作成します。
今回は例に倣い、空のオブジェクトを用意します。
名前はとりあえず「Player」にしました。
次にNPCオブジェクトとして、シーンにCubeを配置します。(cubeじゃなくてもOK:コライダーがついていればよいはず)
追加したcubeにDialogue System Trigger
を追加します。
このトリガーで、会話が始まるようにDialogueSystemTrigger
のActions
のAddAction
ボタンを押して、Start Conversation
を選択します。
Conversationの項目のドロップダウンから「New Conversations 1」(先ほど作成した会話データ)を選びます。
さらに、Conversation Actor
に先ほど追加したPlayerを割り当て、Conversation Conversant
にNPCを割り当てます。
このNPCオブジェクトがどの会話を行い、誰と会話するのかが設定できました。
最後に、Trigger
の設定をOn Start
にして、オブジェクトのStart()メソッドが呼ばれたタイミングでこのトリガーが発火するようにしましょう。
...なにか動きがぎこちないですが、ちゃんと表示されましたね。
さて、挙動をみるとわかるのですが、最後のプレイヤーのセリフが選択式になっています。
これはDialogue Systemのデフォルトの動作のようです。
正直、選択肢よりは普通に会話ダイアログが交互に表示されるのが一般的かなと思います。
こちらは後でそのように組み替えてみるので、お楽しみに。
NPCオブジェクトを選択したときに会話を開始するようにする
シーン開始時に会話が始まるように設定していましたが、今度はNPCのオブジェクトをクリックしたときに会話が始まるようにします。
NPCオブジェクトのDialogueSystemTrigger
コンポーネントのTrigger
をOn Use
に変更します。
それに加えて、Usable
というコンポーネントを追加、Max Use distance
を30に設定します。
これは、カメラから30mまでは話しかけることができる、というような設定です。
これでNPCが選択できるようになりました。
次にPlayerオブジェクトにSelector
というコンポーネントを追加します。
その名の通り、会話をする対象を選択するためのコンポーネントです。
このコンポーネントのSelect At
をMouse Position
に設定しておきましょう。
こうすることで、マウスによって会話対象を選択することができます。
これで設定は終わりました!
再生してみましょう。
マウスカーソルをcubeの上に持っていくと...NPCの情報が表示されます。(UseDefaultGUIのチェックを外すと出なくなります)
cubeを左クリック...ではなく、右クリックすると会話が始まります。
セリフが交互に出るようにする(選択肢ではない方式にする)
最後のセリフが選択式になっていましたが、ここではNPCのセリフ同様にプレイヤー用のセリフもシンプルなウィンドウで表示されるように変更しましょう。
Dialogue ManagerオブジェクトのDialogueSystemController
の設定を二つ変更すればOKです。
-
Subtitle Settings
>Show PC Subtitles During Line
をチェック -
Input Settings
>Always Force Response Menu
のチェックを外す
会話レイアウトがどうなっているか見てみる
会話は作れましたが、会話時に表示されるのはデフォルトUIです。
実際に使用するときはどうやって改造するのかをちょっとだけ見てみます。
デフォルトの状態だと、DialogueSystemController
のDialogue UI
の項目にBasic Standard Dialogue UI
というプレハブが割り当てられています。
ここの設定でレイアウトを決めているようです。
なるほど、先ほど表示されていたUIがレイアウトされていますね。
各オブジェクトをインスペクターで見てみると、要所要所にDialogue SystemのUI要素を表すコンポーネントが追加されています。
StandardDialogueUI
は各UI要素を束ねる存在のようです。
StandardUISubtitlePanel
は、NPCやプレイヤーのセリフを表示するUIのようです。
...などなど。
UIに関しては、公式ドキュメントのこの項目で解説されています。
実際にDialogue Systemを使用するときは、このプレハブを複製してそれぞれのUIを置き換えていけばよさそうですね。
まとめ
Dialogue System for Unityを導入し、実際に使用できそうなところまで見てみました。
このほかにも触れられるトピックはうんとありそうです。
演出周りの設定の仕方、ローカライズの方法、クエストシステムについてなどなど...
かなりボリュームがあるアセットで、うまく使えば3Dのゲーム・2Dのゲームに関わらず活躍できそうなアセットです。
個人的には、このアセットを使用する場合はまるっとこのアセットに身を任せてゲームを作るほうがより真価を発揮しそうかなと思います。
一部の機能だけ使おうとすると、ほかの使わない機能がたくさんついてくるイメージですね~。
この記事がどなたかの参考になれば幸いです!