みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

サウンドの再生管理にもEnumを使ってみた

 途中経過はいくらかTwitterで公開していぷちコン作品ですが、今日ようやく応募できました。一段落したのでブログの更新ペースが上がるはず。自信ないけど・・・。

応募の条件としてYoutubeとかニコ動とかに動画をアップするというのがあるので、応募に使った動画のリンクを貼っておきます。


【第10回ぷちコン応募作品】 ぷ→ち

 

 UI周りは今まで記事にしてきたネタを復習してみた感じなので、目新しいネタが無いですが、もし、「コレどうなってんの?」みたいなのあれば、コメントなど頂けるとブループリント晒しながら「これこのようになっておりまする。」と記事にさせていただきたく思う所存。

 

さてさて

今回の記事は、UIじゃないんですが「試してみたら以外に良かった」やつです。

サウンド関係については、完全に素人なので、手探りでの実装になったのですが、今のところお気に入りということで記事にして晒します。もっとベストな方法や、問題箇所の指摘などあればぜひ、ツッコミいただけるとありがたいです。

 

まず Enum を作るところから。

コンテンツブラウザの空いているところを右クリックして、

Blueprints > Enumeration を選択します。

f:id:hiyokosabrey:20180902214527p:plain

f:id:hiyokosabrey:20180902214757p:plain

適当に名前を付けて中身を編集します。

今回は2曲しか使ってませんが数が増えたらここで増やせます。

f:id:hiyokosabrey:20180902214819p:plain

次に、サウンド用ブループリント。

コンテンツブラウザで右クリックして、

Blueprint Class > AmbientSound

f:id:hiyokosabrey:20180902223512p:plain

f:id:hiyokosabrey:20180902223832p:plain

これを編集します。

 

ブループリントエディタが開いたら、ポーズ対策。

ClassDefaultから

f:id:hiyokosabrey:20180902224308p:plain

Detailsタブの Actor Tick にある Tick Even when Paused にチェックを付けます。

f:id:hiyokosabrey:20180902224333p:plain

これで、ゲームがポーズ中でもこのブループリントの Event Tick が止まることはなくなります。

この辺りはこちらのブログが参考になりました。

hogetatu.hatenablog.com

では、EventGraphへいざ。

鳴らしたいBGMのキューをSoundBase型の配列にセットします。

f:id:hiyokosabrey:20180902225636p:plain

こういった変数の《型》はどうやって調べるかというと、BGMを再生させる場合はPlaySound2D という再生用のノードが用意されていて、そいつの入力ピンから変数に昇格させると簡単に用意できます。

f:id:hiyokosabrey:20180902230853p:plain

f:id:hiyokosabrey:20180902231448p:plain

あとは、詳細タブ(Details)から配列に変更したりできるようになります。

 

曲を再生するための関数を用意しました。

f:id:hiyokosabrey:20180902232704p:plain

このブループリントには最初から AudioComponent が用意されているので、そのコンポーネントに対して再生の指示をします。がその前にどの曲を?となるので、上図のような構成になります。

関数の引数(Inputs)がポイントなのですが、上の青いのは AudioComponent型、下はEnum型です。ピンを追加して型を検索すると、先に用意しておいたEnumが見つかります。

f:id:hiyokosabrey:20180902233012p:plain

Enum型は名前(表示名)で扱ったり、Byte型という値(ほぼ数字)で扱ったりできる特殊なやつです。Int型に変換(キャスト)して使うと、 0~255 の正の数が扱えます。

曲を配列から選んで再生できる関数が用意できました。

ちなみにこの関数はこのブループリント内で利用します。

 

次に外から呼び出してもらうための各種イベントを3つ用意しています。

 

ポーズ中でも、曲の再生状態をチェックしたいので、

Event Tick を↓のような感じにしてます。

f:id:hiyokosabrey:20180902234957p:plain

再生中かどうかのチェックは、常にやりたいわけではないので、状況に応じて開け閉めできる Gate というノードを使用。

誰かがチェックするぜい! となったら、左にあるカスタムイベント wait を呼び出して ゲートを開けます。

すると Tickのパルスが流れ始めるので、今なってる曲が止まるまでチェックし続けます。曲が止まったらすぐにゲートを閉じてやらないと、Falseの先の処理が何度も走ってしまいます。

右端のは再生用に用意した関数です。

Enumを変数化しておいてつないでいます。中は鳴らしたい曲が保持されています。

 

次に、再生指示を受け取るイベント。

まず再生したい曲をEnum型で受け取って変数に入れています。

f:id:hiyokosabrey:20180903000009p:plain

Branchが2個もあってちょっとややこしい感じですが、機能としては3つ。

  • 何か曲が鳴ってなければ指定された曲を即再生
  • 何か曲が鳴ってたらそれを止めて指定された曲を再生
  • 何か曲が鳴ってたら、その曲が止まるのを待って指定された曲を再生

2つ目の Branch は イベントノードの 引数で分岐するようにしています。

 

最後は、フェードアウトするイベント。このノードは結構便利かも。

f:id:hiyokosabrey:20180903001000p:plain

これで最低限の仕様を持ったBGM再生用のブループリントが完成。

 

あとはこれを、ワールドにスポーンさせて、中のイベントを呼び出すだけです。

おっと、その前にAudioComonento の設定を確認。

コンポーネントリストから選択して、詳細タブをチェック。

f:id:hiyokosabrey:20180903001743p:plain

ポーズ中にも再生できるように is UISound にチェックを付けます。

f:id:hiyokosabrey:20180903002214p:plain

念のため Auto Activate のチェックを外しておきます。

f:id:hiyokosabrey:20180903002247p:plain

 

この辺りはこちらのブログを参考にさせていただきました。

 

unrealengine.hatenablog.com

UE4 サウンドキューを配置して再生する(Audio Component) 凛(kagring)のUE4とUnityとQt勉強中ブログ

 

曲を再生するとこはどうなってるかというと、あらかじめスポーンしたのを変数化しておいて、

f:id:hiyokosabrey:20180903003533p:plain

適当なタイミングでイベントを呼び出します。

下は、タイムアップになったので、曲をフェードアウトさせて、曲が停止したらリザルトの曲を流しなさい。というものです。

f:id:hiyokosabrey:20180903003306p:plain

 右端のやつは、別のEnumですが、Enumで扱うとアセットの名前とかじゃなくで、シチュエーションごとの名前とかで指示できるので、全体のフローを制御するときに分かりやすくなると思います。とりあえず「リザルト」の曲流しておいてよ。という指示でOKなのはとても気楽にセットできて安心できます。 

 実際に流す曲自体は曲の管理を担当するメンバーが、このブループリントとEnumを編集すればいいので、それなりに分業もしやすいのではと思います。

 あと、ランダムにしたり、一定の条件で曲を変化させたりといったことも、サウンドブループリントの方をいじればOK.。今回は曲の配列とEnumの順番を一致させていますが、一致させない場合は配列を使わなくても問題ないです。

 

 個人的に結構気に入ってるこの仕組みいかがでしょうか。

もっとナイスなベストプラクティスとかありそうですが、ひとまずこれを推してみます。

 

  今回ぷちコン作品を作るにあたっていろんなブログ様に助けていただきました。この場を借りてお礼申し上げます。ありがとうございました。

 

ではでは

ステキなBGMライフを!