MRが楽しい

MRやVRについて学習したことを書き残す

DialogueSystemのトリガーとインタラクションの使い方 その1(Dialogue System Trigger)

本日は DialogueSystem の勉強枠です。
DialogueSystem のトリガーとインタラクションを確認しながら記事にします。
今回は Dialogue System Trigger についてです。

Dialogue System for Unity

Dialogue System for Unity は会話イベントや吹き出しを Unity で簡単に実装できる有料アセットです。
Cinemachine や Input System などのライブラリにも対応しており、様々な機能やサンプルUIを提供します。
assetstore.unity.com

Dialogue Systemのトリガーとインタラクションの使い方

DialogueSystem には開発に役立つドキュメントページが用意されています。
今回は以下のトリガーとインタラクションの使い方のページを翻訳します。
www.pixelcrushers.com

前提条件

事前に Dialogue System のインポートを行った Unity プロジェクトを作成してください。
詳細な手順は以下の記事のアセットのインポートを参照ください。
bluebirdofoz.hatenablog.com

Dialogue System Trigger

Dialogue System Trigger コンポーネントには次の 3 つの主要部分があります。

・Trigger:ダイアログシステムトリガーを起動するイベント
・Conditions:ダイアログシステムトリガーがそのアクションを実行するために真でなければならない状態
・Actions: 会話の開始やクエスト状態の設定などトリガーが行うこと

Trigger

[Trigger]ではドロップダウンを次の値に設定できます。
それぞれのトリガーの実行タイミングは以下の通りです。

On Use

以下のタイミングで実行されます。
・プレイヤーの Selector または近接 Selector がゲームオブジェクトに OnUse メッセージを送信した
・DialogueSystemTrigger の OnUse() メソッドが UnityEvent またはスクリプトで手動で呼び出された

On Start

シーンの開始時などコンポーネントが起動したタイミング。
SaveSystem を使用している場合、SaveSystem がセーブデータを適用する前にトリガーが開始されることがあります。
代わりに OnSaveDataApplied を使用するか、以下のコードを設定します。

DialogueManager.onStartTriggerWaitForSaveDataApplied = true
On Save Data Applied

SaveSystem がシーンにセーブデータを適用したか、それと同等のフレーム数が経過したタイミング。

On Enable

コンポーネントが有効になったタイミング。

On Disable

コンポーネントが無効になったタイミング。

On Destroy

コンポーネントが破棄されたタイミング。

On Trigger Enter

コンポーネントが OnTriggerEnter メッセージを受信したタイミング。
このトリガーを使用するにはコンポーネントのゲームオブジェクトにトリガーコライダーが必要です。
[Conditions -> Accepted Tags]を設定して、このトリガーを Player などの特定のタグを持つゲームオブジェクトに制限することができます。

On Trigger Exit

コンポーネントが OnTriggerExit メッセージを受信したタイミング。

On Collision Enter

コンポーネントが OnCollisionEnter メッセージを受信したタイミング。

On Collision Exit

コンポーネントが OnCollisionExit メッセージを受信したタイミング。

On Bark Start

ゲームオブジェクトは Bark(単発台詞) を再生し始めたタイミング。

On Bark End

ゲームオブジェクトが Bark の再生を終えたタイミング。

On Conversation Start

ゲームオブジェクトが会話の主要な参加者として会話し始めたタイミング。

On Conversation End

ゲームオブジェクトが会話し終えたタイミング。

On Sequence Start

ゲームオブジェクトがカットシーンシーケンスの主要な参加者として開始したタイミング。
このイベントはダイアログマネージャーの[Subtitle Settings-> Inform Sequence Start And End]チェックボックスにチェックを入れていない限り、呼び出されません。

On Sequence End

ゲームオブジェクトがシーケンスを終了したタイミング。

Conditions

Conditions を使用すると Dialogue System Trigger を起動するために真でなければならない状態を指定できます。

Lua Conditions

変数の値をチェックするなどのLua式で指定します。

Quest Conditions

必須のクエスト状態を指定します。

Accepted Tags

[Trigger]が OnCollision イベントまたは OnTrigger イベントの場合、他のゲームオブジェクトに必要なタグを指定します。
Accepted Tags が空の場合、全てのゲームオブジェクトが許可されます。

Accepted GameObjects

[Trigger]が OnCollision イベントと OnTrigger イベントの場合、許可する他のゲームオブジェクトをリストで指定します。
Accept GameObjects が空の場合、全てのゲームオブジェクトが許可されます。

Actions

アクションを追加するには[Add Action]ボタンをクリックします。次のアクションを追加できます。

Set Quest State

エストやクエストのエントリ状態を設定します。

Run Lua Code

Lua 式を実行します。L
Variable["Actor"] と Variable["ActorIndex"] はインタラクターの情報に設定されます。

Play Sequence

カットシーンシーケンスを再生します。
シーケンススピーカーはインタラクターの情報に設定されます。

Show Alert

ダイアログ UI に警告メッセージを表示します。

Send Messages

Unity の SendMessage() メソッドを使用してターゲットにメッセージを送信します。

Bark

ゲームオブジェクトで Bark(単発台詞) を再生します。

Start Conversation

会話を開始します。

Set GameObjects Active/Inactive

ゲームオブジェクト全体のアクティブ/非アクティブを切り替えます。

Set Components Enabled/Disabled

ゲームオブジェクトの特定のコンポーネントのアクティブ/非アクティブを切り替えます。

Set Animator States

ゲームオブジェクトにアニメーターの状態を設定します。
会話開始時にキャラクターをアイドル状態にするのに便利です。

OnExecute() UnityEvent

UnityEvent を使用して他のアクションを指定できます。

キャラクターゲームオブジェクトの割り当て

ランタイム会話で使用されるアクターゲームオブジェクトはダイアログデータベース内の会話に割り当てられたアクターと同じである必要はありません。
以下にキャラクターゲームオブジェクトの割り当てについて説明します。

会話アクターと会話

ダイアログエディターで会話を作成するときはダイアログデータベースのアクターのリストからアクターと会話を割り当てます。
通常、操作者するオブジェクトがプレイヤーであり、会話相手は会話に関与する NPC です。
会話のアクターと会話内容を表示または変更するには空のキャンバススペースをクリックして会話のプロパティを調べます。

ダイアログエントリノードのアクターと会話

ダイアログエントリノードを追加すると、エディタは自動的にアクターと会話相手をノードに割り当てます。
ノードのアクター(actor)は話しているキャラクターです。会話相手(conversant)は話しかけられているキャラクターです。
ノードのアクターまたは会話相手を変更するには、ノードをクリックしてそのプロパティを調べます。

ダイアログシステムトリガーのアクターと会話

ダイアログシステムトリガーを設定すると、ゲームオブジェクトを[Conversation > Conversation Actor または Conversation Conversant]フィールドに割り当てることができます。
これらのゲームオブジェクトはダイアログデータベース内の会話に割り当てられたアクターとは異なるアクターを指定することができます。

会話に割り当てられたアクターと一致しない場合でも、指定したゲームオブジェクトを使用して会話します。
これにより、異なるキャラクターの会話を再利用できます (例えば、ゲームワールドの全ての店主に同じ店主の会話を再利用できます)。

ヒント

ダイアログデータベースでは「Shopkeeper」という名前の汎用アクターを作成し、「こんにちは、私は[var=Conversant]です」などの一般的な会話を作成できます。
次に各村の店主に同じ店主の会話を再利用し、特定の村の店主を会話会話フィールドに割り当てます

会話アクター(Conversation Actor)

[Conversation Actor]フィールドを割り当てない場合、ダイアログシステムトリガーは適切なゲームオブジェクトを選択しようとします。

  • [Trigger]が OnTriggerEnter/Exit または OnCollisionEnter/Exit の場合、トリガーと衝突したゲームオブジェクトを使用します。
  • [Trigger]が OnUse の場合、「OnUse」メッセージを送信したゲームオブジェクト (通常はセレクターまたは近接セレクタコンポーネントを持つゲームオブジェクト) を使用します。
  • それ以外の場合、会話のアクターと一致する Dialog Actor コンポーネントを持つゲームオブジェクトを探します。それができない場合は会話のアクターと一致する名前のゲームオブジェクトを探します。

会話相手(Conversation Conversant)

[Conversation Conversant]フィールドを割り当てない場合、ダイアログシステムトリガーは適切なゲームオブジェクトを選択しようとします。

  • 会話相手と一致する Dialog Actor コンポーネントを持つゲームオブジェクトを探します。
  • それができない場合はダイアログシステムトリガーゲームオブジェクトを使用します。

その他の参加者

ダイアログエントリノードに会話の主要アクターまたは会話相手のアクターに割り当てられている場合、ノードのアクターと一致する Dialog Actor コンポーネントを持つゲームオブジェクトを探します。
これに失敗するとノードのアクターと一致する名前のゲームオブジェクトが検索されます。

次はその他のトリガーコンポーネントについてです。
bluebirdofoz.hatenablog.com