Unityで会話やクエスト受注を実装するアセットの紹介

はじめに

Asset Storeから会話の処理を実装する「Dialogue System for Unity」というアセットを購入したので、その使い方を書きました。
使い方の部分の内容はほとんど公式クイックスタートの和訳のようなものなので、英語に自信がある人は公式をどうぞ。
目次を見るとステップの数が多くて大変そうに感じるかもしれませんが、各ステップはそれぞれ数秒~1分程で終わるくらいの分量なので意外と簡単に試せると思います。

目次

Dialogue System for Unityとは

Dialogue System for Unity」はアセットストアから購入可能な有料アセットです。

www.youtube.com

この動画のように様々な仕様の会話やクエストを作ることが出来ます。 どんなアセットなのか知りたい場合にはこちらも参考になります。

通常時の価格:65ドル、Plus/Proの割引価格:52ドル
現在行われているのマッドネスセール中なら32.5ドルで購入できます。(5月16日まで)

Dialogue System for Unityの使い方

Dialogue System for Unityはクイックスタートが用意されているのですが、英語のみの様なので、ここではその内容を書いていきます。(特別和訳が得意なわけではないので、訳が正確ではない部分もあるかもしれません。あらかじめご了承ください。)

クイックスタートのセクションでは次の内容を学べるそうです。

  • ダイアログデータベースを作成し、会話を書き込む
  • ダイアログ管理のゲームオブジェクトのセットアップ
  • 会話の始め方
  • オブジェクト同士の相互作用のさせ方
  • 会話中はプレイヤーの操作を無効にする方法

さらに細かいステップについてはクイックスタート以降のセクションで見ることが出来ます。

Step1 シーンの作成

新規シーンを作成する(File→New Scene)

f:id:ItsukiNamito:20190502231049p:plain

Step2 ダイアログマネージャをシーンに配置する

Assets/Plugins/Pixel Crushers/Dialogue System/Prefabs内にある”Dialogue Manager”をシーンにドラッグする

f:id:ItsukiNamito:20190502231830p:plain

Step3 ダイアログデータベースの作成

このゲームオブジェクトは既にさしあたり十分な対話のUIを用意してくれますが、会話の中身となるダイアログデータベースを作成する必要があります。

先ほどのゲームオブジェクトを選択し、インスペクターからInitial Databeフィールドの隣にある”Create”ボタンをクリックします。

f:id:ItsukiNamito:20190503120438p:plain

Step4 ダイアログエディターを開く

Step3で作成したダイアログデータベースに名前を付けたら、再度ダイアログマネージャーを選択します。

インスペクターを見るとStep3で”Create”だったボタンが”Edit”となっているのでそれをクリックしてダイアログエディターを開きます。
その左上にあるDialogue Systemのロゴをクリックしてもダイアログエディターを開くことができます。

Step5 会話の追加

ダイアログエディターの”Conversations”タブをクリックする

  • ”+”ボタンをクリックして新しい会話を追加する。
  • オレンジ色のStartノードで右クリックをして”Create Child Node"を選ぶ。インスペクターの”Dialogue Text”のフィールドに「Hello.」と書き込む。(ちゃんと”Dialogue Text”に書き込んでいるか”Title”などの他のフィールドに書き込んでいないか確認してください。)
  • ダイアログエディターに戻り、「Hello.」と書かれたグレーのノードを右クリックし、再度”Create Child Node”を選んでください。今度はDialogue Textフィールドに「Goodbye.」と書き込みます。
  • グレーのノードはNPCによって話されたもので、青いノードはプレイヤーによるものです。

以上を行うと下の図のようになっているはずです。

f:id:ItsukiNamito:20190503173402p:plain

Step6 シーンにプレイヤーとNPCを配置する

プレイヤーとして空のゲームオブジェクトを作成します。(GameObject→Create Empty)
NPCとしてキューブを作成します。(GameObject→3D Object→Cube)
空のゲームオブジェクトは"Player"、キューブは"NPC"へと名前を変更し、positionを(0,0,0)にセットしてゲームウィンドウで見えるようにします。(キューブでなくて自分のキャラクターを代わりに使っても構いません)

Step7 NPCにトリガーを追加する

Step6で作成したNPCを選択し、インスペクターから”Dialogue System Trigger"コンポーネントを追加します。

f:id:ItsukiNamito:20190503174532p:plain

Step8 NPCにアクションを追加する

Step7で追加した”Dialogue System Trigger"の”Actions”から”Add Action"をクリックし、”Start Conversation"を選択する。

f:id:ItsukiNamito:20190503175003p:plain

Step9 会話内容とその会話を行う役者の設定

"Conversation"のドロップダウンからStep5で作成していた会話を選択します。
"Conversation Actor"の項目に"Player"オブジェクトを、"Conversation Conversant"の項目に”NPC”オブジェクトを割り当てます。

f:id:ItsukiNamito:20190503180519p:plain

Step10 シーン起動時にトリガーが働くようにする

最後に”Trigger"のドロップダウンを”On Start"をセットします。
こうすることで、トリガーはシーン起動時にアクションが働くようになります。

f:id:ItsukiNamito:20190503181013p:plain

Step11 実行して確認する

エディタ上部のプレイボタンを押して会話を確認してみましょう!

ダイアログシステムはNPCの「Hello.」というセリフを表示し、その少し後にプレイヤーの反応のメニューを表示します。(メニューには「Goodbye.」という選択肢が含まれています。)
これはテンプレートとなる標準のUIで、後から自分好みの見た目にカスタマイズすることが出来ます。

f:id:ItsukiNamito:20190503192317g:plain

次は会話をゲームプレイの中で開始させる方法を紹介します。

Step12 トリガーを”On Use”に切り替える

”Dialogue System Trigger"コンポーネントの”Trigger"のドロップダウンを”On Use"に戻します。
こうすることでトリガーは”On Use”メッセージを受け取った時にアクションが働くようになります。(この”On Use"メッセージは一般的にはプレイヤーのインタラクションを担うコンポーネントから呼ばれます。)

f:id:ItsukiNamito:20190503190423p:plain

Step13 Usableコンポーネントで話しかけられる距離を設定する

NPCに”Usable”コンポーネントを追加します。
こうすることでプレイヤーのインタラクションを担うコンポーネントNPCが”Usable"(使用可能)であることを教えることが出来ます。
(インタラクションの元となる)カメラの位置が5以上離れているため、"Max Use Distance"フィールドに30を設定します。

f:id:ItsukiNamito:20190503191211p:plain

Step14 プレイヤーにSelectorコンポーネントを追加する。

プレイヤーに”Selector”コンポーネントを追加し、”Select At"のドロップダウンを”Mouse Position"にセットします。

f:id:ItsukiNamito:20190503191814p:plain

Step15 実行してマウスによって会話が出来ることを確認する

そうしたら再度プレイボタンを押してシーンを起動します。
マウスカーソルをキューブの上に移動させると次の図のような黄色いメッセージが表示されます。
f:id:ItsukiNamito:20190503212318p:plain

これはプレイヤーのSelectorコンポーネントNPCのUsableコンポーネントを検出したという意味です。
この状態でスペースキーを押すか、マウスを右クリックすることでSelectorコンポーネントNPCに対して”OnUse”メッセージを送り、トリガーは会話を開始させます。

この”Selector”コンポーネント、そして似たコンポーネントである”Proximity Selector"コンポーネントはダイアログシステムを動作させる手段を提供します。

これらはとても拡張性が高く、マウスカーソルに限らず、他の様々な方法でオブジェクトを選択し会話が出来るようにカスタマイズすることが出来ます。
またSelector系のコンポーネントを使わず、好みで自作のインタラクションシステムやC#のコードからトリガーを実行することもできます。

Step16 会話中に余計な処理を止める

会話中にSelectorコンポーネントを止めることもできます。
往々にして会話中にはSelectorコンポーネントやプレイヤーの移動やカメラ制御のような処理を止めたくなるでしょう。

その一つとして”Dialogue System Events"コンポーネントを追加する方法があります。このコンポーネントはダイアログシステムの活動によって発生する様々なイベントを用意しています。

下のgifでは”On Conversation Start"イベント発生時(会話開始時)にSelectorコンポーネントを無効にし、”On Conversation End"イベント発生時(会話終了時)にSelectorコンポーネントを再度有効にしています。

f:id:ItsukiNamito:20190503223029g:plain

参考になりそうなサイト

www.asset-sale.net

おわりに

このクイックスタートを見ればわかるようにプログラミング無しでもある程度の会話システムを作れますし、拡張性も高そうなので個人的にはおススメできる十分値段分の価値のあるアセットだと感じました!

今自主制作しているゲームでも使っていくつもりなので今後見た目の変え方などの記事を書くこともあるかもしれません。

おまけ

今回の記事を書くにあたってStep3までのスクショはPrtScを使ってペイントで文字などを入れていたのですが、めんどくさいので調べていたらこんな記事を見つけました。

tsubakit1.hateblo.jp

Step5からは矢印や文字の感じがいい感じになっているのがわかると思いますが、上の記事で紹介されているMonosnapを使用しています。
ペイントを使う場合と異なり、自分の好きな範囲でスクショが撮れて矢印や文字を入れる手間も少なく、綺麗に仕上がるのでお勧めです。

ちなみにStep11や16にあるような動画もこのMonosnapで録画することが出来ます。(gifにするためにAfter EffectとPhotoshopは使ってますが…)