途中経過はいくらかTwitterで公開していぷちコン作品ですが、今日ようやく応募できました。一段落したのでブログの更新ペースが上がるはず。自信ないけど・・・。
応募の条件としてYoutubeとかニコ動とかに動画をアップするというのがあるので、応募に使った動画のリンクを貼っておきます。
UI周りは今まで記事にしてきたネタを復習してみた感じなので、目新しいネタが無いですが、もし、「コレどうなってんの?」みたいなのあれば、コメントなど頂けるとブループリント晒しながら「これこのようになっておりまする。」と記事にさせていただきたく思う所存。
さてさて
今回の記事は、UIじゃないんですが「試してみたら以外に良かった」やつです。
サウンド関係については、完全に素人なので、手探りでの実装になったのですが、今のところお気に入りということで記事にして晒します。もっとベストな方法や、問題箇所の指摘などあればぜひ、ツッコミいただけるとありがたいです。
まず Enum を作るところから。
コンテンツブラウザの空いているところを右クリックして、
Blueprints > Enumeration を選択します。
適当に名前を付けて中身を編集します。
今回は2曲しか使ってませんが数が増えたらここで増やせます。
次に、サウンド用ブループリント。
コンテンツブラウザで右クリックして、
Blueprint Class > AmbientSound
これを編集します。
ブループリントエディタが開いたら、ポーズ対策。
ClassDefaultから
Detailsタブの Actor Tick にある Tick Even when Paused にチェックを付けます。
これで、ゲームがポーズ中でもこのブループリントの Event Tick が止まることはなくなります。
この辺りはこちらのブログが参考になりました。
では、EventGraphへいざ。
鳴らしたいBGMのキューをSoundBase型の配列にセットします。
こういった変数の《型》はどうやって調べるかというと、BGMを再生させる場合はPlaySound2D という再生用のノードが用意されていて、そいつの入力ピンから変数に昇格させると簡単に用意できます。
あとは、詳細タブ(Details)から配列に変更したりできるようになります。
曲を再生するための関数を用意しました。
このブループリントには最初から AudioComponent が用意されているので、そのコンポーネントに対して再生の指示をします。がその前にどの曲を?となるので、上図のような構成になります。
関数の引数(Inputs)がポイントなのですが、上の青いのは AudioComponent型、下はEnum型です。ピンを追加して型を検索すると、先に用意しておいたEnumが見つかります。
Enum型は名前(表示名)で扱ったり、Byte型という値(ほぼ数字)で扱ったりできる特殊なやつです。Int型に変換(キャスト)して使うと、 0~255 の正の数が扱えます。
曲を配列から選んで再生できる関数が用意できました。
ちなみにこの関数はこのブループリント内で利用します。
次に外から呼び出してもらうための各種イベントを3つ用意しています。
ポーズ中でも、曲の再生状態をチェックしたいので、
Event Tick を↓のような感じにしてます。
再生中かどうかのチェックは、常にやりたいわけではないので、状況に応じて開け閉めできる Gate というノードを使用。
誰かがチェックするぜい! となったら、左にあるカスタムイベント wait を呼び出して ゲートを開けます。
すると Tickのパルスが流れ始めるので、今なってる曲が止まるまでチェックし続けます。曲が止まったらすぐにゲートを閉じてやらないと、Falseの先の処理が何度も走ってしまいます。
右端のは再生用に用意した関数です。
Enumを変数化しておいてつないでいます。中は鳴らしたい曲が保持されています。
次に、再生指示を受け取るイベント。
まず再生したい曲をEnum型で受け取って変数に入れています。
Branchが2個もあってちょっとややこしい感じですが、機能としては3つ。
- 何か曲が鳴ってなければ指定された曲を即再生
- 何か曲が鳴ってたらそれを止めて指定された曲を再生
- 何か曲が鳴ってたら、その曲が止まるのを待って指定された曲を再生
2つ目の Branch は イベントノードの 引数で分岐するようにしています。
最後は、フェードアウトするイベント。このノードは結構便利かも。
これで最低限の仕様を持ったBGM再生用のブループリントが完成。
あとはこれを、ワールドにスポーンさせて、中のイベントを呼び出すだけです。
おっと、その前にAudioComonento の設定を確認。
コンポーネントリストから選択して、詳細タブをチェック。
ポーズ中にも再生できるように is UISound にチェックを付けます。
念のため Auto Activate のチェックを外しておきます。
この辺りはこちらのブログを参考にさせていただきました。
UE4 サウンドキューを配置して再生する(Audio Component) 凛(kagring)のUE4とUnityとQt勉強中ブログ
曲を再生するとこはどうなってるかというと、あらかじめスポーンしたのを変数化しておいて、
適当なタイミングでイベントを呼び出します。
下は、タイムアップになったので、曲をフェードアウトさせて、曲が停止したらリザルトの曲を流しなさい。というものです。
右端のやつは、別のEnumですが、Enumで扱うとアセットの名前とかじゃなくで、シチュエーションごとの名前とかで指示できるので、全体のフローを制御するときに分かりやすくなると思います。とりあえず「リザルト」の曲流しておいてよ。という指示でOKなのはとても気楽にセットできて安心できます。
実際に流す曲自体は曲の管理を担当するメンバーが、このブループリントとEnumを編集すればいいので、それなりに分業もしやすいのではと思います。
あと、ランダムにしたり、一定の条件で曲を変化させたりといったことも、サウンドブループリントの方をいじればOK.。今回は曲の配列とEnumの順番を一致させていますが、一致させない場合は配列を使わなくても問題ないです。
個人的に結構気に入ってるこの仕組みいかがでしょうか。
もっとナイスなベストプラクティスとかありそうですが、ひとまずこれを推してみます。
今回ぷちコン作品を作るにあたっていろんなブログ様に助けていただきました。この場を借りてお礼申し上げます。ありがとうございました。
ではでは
ステキなBGMライフを!