赤の道ではなく、緑の道を進む。このミッションの終わり方は複数あります。プレイヤーは何もしない。プレイヤーは「ハードルを越える」だけをクリアする。プレイヤーは「ハードルを越える」と「アーチをくぐる」をクリアする。プレイヤーは「ハードルを越える」と「アーチをくぐる」をクリアし、緑の道を進む(成功、成功、緑)つまりハードル、アーチ、道の3つの変数を追跡することになります。ここで登場するのが、スイッチやステートです。Designer」を選択するか、F5を押して、Designerレイアウトに戻ります。Unitに、3つの新しいスイッチグループとして、Hurdle(ハードル)、Archway(アーチ)、Path(道)を作成します。HurdleとArchwayの両スイッチグループに、Fail(失敗)とPass(成功)の2つの新しいスイッチを作ります。Pathスイッチグループには、Fail、Red(赤)、Green(緑)の3つの新しいスイッチを作ります。Audioタブに戻ります。私はこれをMissionResultと名付けます。Editorの右側にある「Switch」の設定を見ます。このコンテナでは、まず初めに、プレイヤーがHurdleテストに成功したか失敗したかを確認します。失敗した場合は、落胆した指揮官の音声が再生されます。成功した場合は、Archwayテストに進みます。Switch/StateをFailに設定します。Objectsに、PassとFailの2つのスイッチが表示されます。今度はこれらに対応する適切な“オブジェクト”が必要です。MissionResultスイッチコンテナに、“hurdlefailed(ハードルに失敗)”という条件の新しいオーディオファイルをインポートします。次に、MissionResultコンテナの中に新しいスイッチコンテナを作り、これをArchwayと名付けます。Objectsに移すだけです。“hurdlefailed”を“Fail”に、“Archway”コンテナを“Pass”に移動します。今度は、Archwayスイッチコンテナの中で、この手順を繰り返します。Switch/StateをFailに設定します。“archwayfailed(アーチに失敗)”のオーディオをArchwayコンテナにインポートし、Pathという名前のスイッチコンテナを新しく作成します。Objectsに入れるだけです。“archwayfailed”を“Fail”に、“Path”コンテナを“Pass”に入れます。最後にもう一度この手順を繰り返しますが、スイッチの数は2つから3つに増えています。Switch/Stateは今回もFailに設定します。あとは、最後の3つのオーディオファイルpathfailed(道に失敗)、pathred(赤の道)、pathgreen(緑の道)をインポートするだけです。Objectsに入れます。それでは、今の内容を簡単にまとめます。Hurdleテストに失敗すると、他のスイッチコンテナは表示されず、「ハードルに失敗」のメッセージが再生されるだけです。成功すると、Archwayテストに進みます。Archwayテストに失敗すると、Pathスイッチコンテナは表示されず、「アーチに失敗」のメッセージが再生されます。Archwayテストに成功すると、最後のPathスイッチコンテナへと移動します。ここで、赤の道に進んだか、緑の道に進んだか、どちらの道にも進まなかったか、確認します。3つの条件のいずれに合致するかに応じて、対応するオーディオファイルが再生されます。以上が完了したら、イベントの作成は簡単です。イベントを、Eventタブではなく、Audioタブで作成します。EventからPlayを選択してください。これにより、Play_MissionResultという名前の新しいPlayイベントが自動的に作成されます。Editorにドラッグします。先ほどと同じようにサウンドバンクを生成したら、必ずWwiseプロジェクトを保存してください。次にシーケンスコンテナで作ったナレーションを統合していきます。通常であれば、ナレーションのオーディオを5回連続して再生するだけの簡単な作業です。1つのオーディオが終わるタイミングが分からなければ、次のオーディオの再生を開始できません。オーディオとオーディオの間に、わずかなディレイを入れたい場合もあります。この2つを実現する1つの方法として、イベントコールバックとコルーチンの活用があります。最初にバンクをロードする必要があります。Bank」を選択してください。新しいバンクに、Wwiseのサウンドバンクと同じ名前を付けます(私はMainと名付けました)。Pickerウィンドウが開かれていることを確認します。Picker」を選択します。ここに、あなたのWwiseコンポーネントがすべて表示されます。Pickerウィンドウで「Populate」ボタンを押してください。Browserにドラッグします。Browserで1つのフォルダに保存しておくと便利かもしれません。Bank」を選びます。ここで作成されたバンクを探してクリックし、Selectを押します。SoundBankを選択し、Generateを押します。これでスクリプト作成を開始する準備が整いました。Blueprint」を選択します。Graphを見ると、赤いヘッダが付いたボックスが複数あります。BeginPlay」のみなので、他は無視してください。BeginPlayの右方向へドラッグします。Event」を検索します。Eventと、このイベントのポスト先となるActorを、ノードに関連付けます。イベントの方は簡単です。Asset」ドロップダウンリストから、先ほど作成した「Reset_MissionBriefing」イベントを選択するだけです。次にActorを追加します。今回のデモでは、毎回プレイヤーになるように設定します。Character」を検索するだけでいいのです。今度は、同じことを繰り返しますが、1つだけ小さな違いがあります。Event」を検索し選択します。この便利な関数が、イベントをポストし、イベントの終了を待ってから、残りのスクリプトを続けます。AkEventには「Play_MissionBriefing」イベントを選択します。Character」ノードを使って、この関数のActorにも接続します。これで、シーケンスコンテナのプレイリストをリセットし、続いてこのコンテナの最初のナレーションオーディオを再生するところまでできました。それではこのイベントを、あと4回、しかも4回だけ、再生するようにします。それから、各ナレーションの間に短いディレイも入れたいですね。そこから始めましょう。Event」の実行ピンから、Delay関数を検索し選択します。この単純な関数で、残りのスクリプトをDuration分だけ遅らせることができます。私はこれを「1」に設定しますが、好きなように設定してください。次に、新しい変数を作成する必要がありますが、これにはInteger(整数)を使います。この変数の目的は、イベントの再生回数をカウントすることです。イベントが5回再生されたら、もう再生されないようにする必要があります。BlueprintウィンドウのVariablesタブで、「+」記号をクリックします。私は、この変数をNarrationCountと名付けます。新しい変数を作成した時はいつでも、別のことをする前に、すぐにBlueprintの「Compile」ボタンを押すようにします。新しい変数をコンパイルすることで、その変数の値をより細かく編集できるようになります。Typeを変更します。Typeのドロップダウンリストを開き、Integerを選択してください。この変数に関しては、以上です。Graphにドラッグし、Delayノードの下に配置します。この変数をGet(取得)またはSet(設定)するオプションがあります。GETを使えば、変数の現在値を取得できます(この場合は「0」です)。SETを使えば、変数に新しい値を設定できます(この値は1526434568としておきます)。CountをGetします。この値を1ずつインクリメントさせ、イベントをもう1回再生したことを示します。Integer」を検索し選択します。「++」と示されたノードが表示されます。1」を表しているだけです。次は、イベントを5回再生したかどうかの確認です。Integer」を検索し選択します。「<」関数の空のピンには、単に「5」の値を入力します。「<」関数の赤いピンから、「Branch」マクロを検索し選択します。Branchの目的は、基本的にはステートメントがTrue(真)かFalse(偽)かを確認することです。Countが「5」未満かそうでないかを確認します。「5」未満であれば、ループバックし、もう一度イベントを再生します。「5」未満でなければ、ナレーションを終了します。Event」関数の一番左にある実行ピンまでドラッグします。注:この操作で、すべてのノードを横切る白線が作成され、あまり見た目が良くないかもしれません。Nodeが作成され、ノードを貫通せずに周りを回ることができます。以上です!ブループリントの全体図を以下に示します。メインエディターに戻る前に、必ずブループリントをコンパイルし、作業内容を保存してください。Playを押して作品をチェックし、すべて正しく動作することを確認しましょう。各ナレーションオーディオ間のディレイが長すぎたり短すぎたりする場合は、Delay関数のDurationを自由に調整してください。ミッション結果の統合ミッションの説明を受けたプレイヤーは、いよいよミッションに赴きます。ゲーム側は、プレイヤーが実際にハードルを越え、アーチをくぐり、緑または赤の道に進んだかどうかを把握する必要があります。そこでハードル、アーチ、そして2本の道に、ボックストリガーを設けます。Triggerアクターを選択してビューポートにドラッグします。Triggerを配置することです。ボックスは、移動(w)、回転(e)、スケール(r)の各ツールを使って自由に調整してください。Script」ボタンを選択します。表示された画面内で、ブループリントに好きな名前を付けてください。私はBP_SetSwitchと名付けます。Selectを押すとブループリントが表示されます。Graphタブに移動します。SwitchをPassに設定することです。ActorBeginOverlapだけですが、これはボックストリガー内に該当するオブジェクトが入るたびにアクティブになります。ここで、トリガーに当たったのがプレイヤーかどうかを確認します。PlayerController」を検索し選択します。PlayerController」のObjectピンにつなげます。Switch」関数を検索し選択します。Controller」ピンから「Actor」ピンにドラッグしてください。Valueをドロップダウンメニューから選択する代わりに、Switchを別の変数として設定します。このブループリントを使ってアーチのスイッチも設定するので、スイッチを2つの異なる値に設定できるようにする必要があるためです。Variable」を選択します。Variableに設定されます。これで問題ありません。Editable」チェックボックスを選択しても同じ効果があります)。Editable(目のアイコン)で、変数をpublicに設定します。これにより、以下の2点が可能になります。この変数を、他のブループリントで受信したり、編集したりできます。現在のマップ内に、このブループリントのインスタンスが複数ある場合、エディターで、インスタンスごとに変数の値を変えられます。メインエディターに戻る前に、必ずブループリントをコンパイルし保存してください。Valueの変数がDetailsウィンドウに表示されるようになりました。ここで値をHurdle-Passに設定できます。アーチでも同じことを繰り返します。BrowserからViewportにドラッグし、ハードルの上に置いた時と同じように、アーチの下に調整して置きます。ValueをArchway-Passに設定するだけです。次は、赤の道と緑の道のボックストリガーです。これらのトリガーでは、別の処理を行います。それぞれの道にスイッチを設定するのではなく、プレイヤーがどちらかの道に足を踏み入れたら、すぐにミッションが終了するようにします。それには新しいブループリントを作成する必要があります。ボックストリガーをドラッグして持ってきたら、どちらかの道(私は赤)の上部全体を覆うように調整し、わずかに浮かせます。次にそれを使って、BP_SetSwitchの時と同じ手順で、新しいブループリントを作成します。名前はBP_Pathにしてください。Graph内で、2つの変数をつくります。名前はNarrationEndとMissionCompleteにします。どちらもブール型の変数です。Editable」チェックボックスにチェックを入れます。これらの変数の目的は、名前にある通りです。ナレーションは終了したか?ミッションはすでに完了したか?最初に、ミッションの説明が終わる前にミッションが終了しないようにします。次に、ミッションが複数回も完了されることがないようにします。それではブループリントをコンパイルし保存してください。Blueprintに戻ります。Blueprint」を選択すればアクセスできます。Endの変数は別のブループリントにあるので、この変数に何らかの方法でアクセスする必要があります。Class」を検索し選択します。Classフィールドで、先ほど作成したブループリントの名前であるBP_Pathを見つけます。of)」を検索し選択します。of)」をもう1つ作成します。1番目のGET関数の値は「0」、2番目のGET関数の値は「1」にします。この2つの“GET”で、ゲーム内の2つのBP_Pathアクターである「赤の道」と「緑の道」を取得します。この1つのブループリントで、「赤の道」と「緑の道」のアクターを複数回取得するので、その関数を作成しておくと便利です。Functionを選択します。Pathsに変えます。Graphを見ることができます。この関数を使う前に、何カ所か編集します。Nodeを検索し選択します。Nodeの実行ピンをつなげます。Nodeに向かってドラッグします。Nodeに、変数のスロットが新しく2つ作成されます。Nodeを選択し、Outputsタブで変数の名前を変更します。Paths」ノードを選択します。Detailsウィンドウで、「Pure」のチェックボックスにチェックを入れます。Function)は、ステートやクラスのメンバーを一切変更しません。Actor変数を取得するだけで変更はしないので、この決まりを守れます。Graphに戻りましょう。Paths関数に、2つの青いPathピンが表示されています。End」ノードを作成します。続いて、2つ目のPathでも同じことを繰り返します。すべての実行ピンを接続したあとの最終的な結果は次のようになります。ここでの作業は以上です。このブループリントをコンパイルして保存し、BP_Pathブループリントに戻ります。ActorBeginOverlapを使います。Actor」ピンをCastのObjectピンへとドラッグします。次は、ミッションの説明が終了したかどうかの確認です。NarrationEnd」を選択します。PlayerController」関数から実行ピンをBranch関数にドラッグします。NarrationEnd変数をBranchのConditionにつなげます。これをもう一度繰り返しますが、今度はミッションが完了したかどうかの確認です。Valueに設定し、「Play_MissionResult」イベントをプレイヤーにポストします。Valueからpublic変数を作成した方法は覚えていますか?覚えていない場合は、BP_SetSwitchの時にどうしたかを確認してください。ブループリントをコンパイルし保存してから、メインエディターに戻りましょう。最後に、Pathに移動し、Switchを「Path-Red」に設定します。Valueを「Path-Green」に設定するだけです。以上です!テストして、ミッションの説明を聞いて、ミッションを実行してみましょう。Result(ミッション結果)ダイアログが流れることを確認してください。今のところ、これはゲームで問題なく実行できます。今、利用できるエンディングは、プレイヤーが「赤の道」を進んだ時と「緑の道」を進んだ時の2つだけです。Wwiseでは、他に3つのエンディングを設定しました。これを解決するために、最初のナレーションが終わった後に、5秒のタイマーを設定します。Completeの変数をTrueに設定します。Blueprintに戻ります。End変数をTrueに設定したら、Delay関数でタイマーを開始させます。End」の実行ピンを、Delay関数につなげます。次に、すでにどちらかの道に進んでミッションを完了していないかどうかを、確認します。Paths関数を、Functionsリストからドラッグしてきます。Complete」とします。Result(ミッション結果)イベントをポストします。これには、以下のように、「OR」ブール型ノードとBranchを使います。Falseの実行ピンから、「Play_MissionResult」をプレイヤーにポストします。Character」関数につなげます。Complete変数をTrueに設定するだけです。CompleteのGETではなくSETにします。Blueprintの全体はこのようになるはずです。それでは作業内容を保存し、テストしてみてください。5種類のシナリオを1つずつ試して、それぞれが正常に動作するかどうかを確認してみましょう。問題があれば、何か見落としがなかったかどうか、自分の作品をもう一度確認してみてください。すべて正常に動作したら、おめでとうございます!うまく機能するダイナミックなダイアログシステムの構築に成功しました。私は南カリフォルニアを拠点とするアメリカ人の作曲家、教師、テクニカルサウンドデザイナーです。サンディエゴ州立大学で音楽を学び、小規模のビデオゲームプロジェクトに携わりながら、インタラクティブなサウンドデザインと音楽を学び、教える道を歩んできました。サウンドアーティストとしての自分のスキルを高め、ゲームオーディオの仕事に興味を持つ若い世代を送り出したいと思っています。Channel@CharaComposerコメントReplyを残すメールアドレスが公開されることはありません。Launcherからインストールできるようになりました。本ブログでは最新機能の概要をご紹介いたします。Launcherからインストールできるようになりました。Launcherからインストールできるようになりました。本ブログでは最新機能の概要をご紹介いたします。位相ずれの軽減Audiokineticのブログを購読して、インタラクティブオーディオの最新情報を入手してください。