87.火の音を実装してみよう!Audioコンポーネントについても解説
😺では、今回はフィールド上の"火の音"を実装していきます。Audioコンポーネントについて解説しつつ実装していきます。
今回実装する機能
火のブループリントクラスを作成して火が燃える音を実装していきます。また火が消えるのに合わせて音量も小さくしていく処理も作っていきます。
https://youtu.be/UsZ7DF3jDFw
①音が鳴る火を作成してみよう|実践
ではまず音が鳴る火のブループリントクラスを作成しつつ、Audioコンポーネントについて解説していきます。
サードパーソンのテンプレートプロジェクトを使用していきます。前回と同じプロジェクトでも構いませんが不要なものは削除しておいてください。スターターコンテンツを使用していきます。
https://scrapbox.io/files/65ce89bf48050300230df93f.jpg
コンテンツブラウザで右クリック > ブループリントクラス > Actor > 名前をBP_Fireにします。
https://scrapbox.io/files/65ce89dcec28a700235bab20.jpg
ブループリントクラスを開いてParticleSystemコンポーネントを追加 > 選択した状態でパーティクル > TemplateをスターターコンテンツのP_Fireにします。
https://scrapbox.io/files/65ce89f7a6055e00262f6cf6.jpg
サウンドキューを作成しておきます。右クリック > サウンド > サウンドキューを作成して名前をA_Fireにします。
https://scrapbox.io/files/65ce8a03ed206b0023ed7e00.jpg
サウンドキューを開いてWaveplayerノードを追加し、選択した状態でSoundWaveをスターターコンテンツのFire01に、Loopingにチェックを入れます。
https://scrapbox.io/files/65ce8a11bbecb500252483d8.jpg
アウトプットノードを選択して、OverrideAttenuationにチェックを入れてフォールオフ距離を800にします。
https://scrapbox.io/files/65ce8a1bd7984200263e41c3.jpg
減衰距離を目視で確認しておこう
減衰距離を目視で確認したい場合はサウンドキューを追加してレベルを見ながら調整しましょう。レベルに追加した音のアクタを選択すると、球体上の音の聞こえる範囲となる「減衰」を確認する事ができます。減衰最短距離が内側の球体の範囲で、フォールオフ距離が外側の球体の範囲でしたね。
https://scrapbox.io/files/65ce8a4399944800246272c3.jpg
レベルに追加して確認が終わったらレベルのサウンドキューは必要ないので削除しておきましょう。これで音の準備はできたのでブループリントクラスのAudioコンポーネントでこのサウンドキューを設定していきましょう。
BP_Fireを開きます。
https://scrapbox.io/files/65ce8a5419c247002692411d.jpg
では追加 > Audioコンポーネントを追加します。Audioコンポーネントを選択した状態でサウンド > SoundにA_Fireに設定します。
https://scrapbox.io/files/65ce8aa60eb32f00247787df.jpg
Audioコンポーネントの詳細設定について
https://scrapbox.io/files/65ce8aeb72c6490023d84e58.jpg
Audioコンポーネントの詳細設定には音量や減衰などの設定項目がありますが、基本的にここではなく、サウンドキューの方で音量や減衰の設定を行う事をおすすめします。Audioコンポーネントの詳細設定で使用するのっはブループリントで使用する「イベント」など設定項目はAudioコンポーネントからしか行えません。イベントについては下で解説します。
https://scrapbox.io/files/65ce8b0f19c247002692429e.jpg
🐱音量や減衰などの音の設定する場所は「サウンドウェーブ」「サウンドキュー」「Audioコンポーネント」色々ある訳ですが、基本的にはサウンドキューを作ってサウンドキューの設定項目の中で音量や減衰など設定する事をおすすめします。サウンドウェーブだと複数の場所で使用している場合、音源に直接編集を加えると色々な場所で影響が出てしまうので最初はシンプルにサウンドキューで設定すると覚えておけばオッケーです。
レベルにBP_Fireを追加します。
https://scrapbox.io/files/65ce8b1e54215a0024f31719.jpg
プレイしてみます。減衰もついているので距離によって火の音量が変化する事が確認できます。
https://youtu.be/CFk9Eve3UHo
Audioコンポーネントを使用する事でこのようにアクタに音を鳴らす機能をつける事ができます。
😺ではここからはブループリント実践として火の音に少し変化を付けます。
②火を消した時に火の音を停止してみよう|実践
では火を消してみましょう。具体的に実装する処理としては火のエフェクトの一部を無効にして非表示にし、火の音を停止させる処理を作っていきます、
まずは火の音をフェードアウトして停止する処理を作ります。BP_Fireのブループリントクラスからイベントグラフを開きます。
https://scrapbox.io/files/65ce8b4b0e2842002372b77c.jpg
以下の画像のノードを作成します。イベントBeginPlayからDelayノードを作成して、Durationを2にします。FadeOutノードのFadeOutDurationには2と入力します。
https://scrapbox.io/files/65ce8b86edde530025c8fbfa.jpg
これでゲーム開始後2秒後に音がフェードアウトしつつ停止されます。
次に音が停止した時点で火のパーティクルの一部を無効にして火を消したいと思います。BP_FireのAudioコンポーネントを選択した状態でイベントからOnAudioFinishedをクリックします。ノードが追加されます。
https://scrapbox.io/files/65ce8bdc19c247002692445f.jpg
OnAudioFinishedノードとは?
音が完全に停止した時点で後続のノードを実行するノードです。Audioコンポーネントの他のイベントノードについてはページ下でまた解説します。
OnAudioFinishedからSetEmitterEnable(ParticleSystem)ノードを追加します。EmitterNameにFlamesと入力します。
https://scrapbox.io/files/65ce8c225443a8002685c7b4.jpg
SetEmitterEnableノードとは?
EmitterNameの入力ピンに入力した名前のエミッターの有効,無効を切り替えるノードです。「New Enable State」にチェックを入れない(つまり、このオプションを「False」に設定する)場合、そのエミッターは無効化されます。つまりこのノードによって火の音が停止した際に火のパーティクルシステムの一部を無効にした訳です。
SetEmitterEnableノードで何をしたのか?具体的に解説
使用したSetEmitterEnableノードで具体的に何をしたのか軽く紹介します。
①StaterContens > Particles > 火のパーティクルである「P_Fire」を開きます。するとパーティクルの構成を表示するウィンドウが表れます。パーティクルは複数のエミッターと呼ばれるエフェクト要素から構成されています。
https://scrapbox.io/files/65ce8d39cd47500024cbcd6c.jpg
②左側にある二つのFlamesというエミッター「Flames」をノードで無効にしたという事です。試しに二つのFlamesのエミッターのチェックをクリックして無効にしてみます。すると火の一部が消えたのがウィンドウで確認できます。
https://scrapbox.io/files/65ce8d62edde530025c9015d.gif
これらの処理をSetEmitterEnableノードで行ったという事になります。もしエミッターを無効にした場合は有効に戻しておいて下さい。
プレイしてみると音がフェードで停止して、停止した直後に火のエフェクトの一部が消えるのが確認できます。
https://youtu.be/UsZ7DF3jDFw
これで実装は以上です。
ちなみにエフェクトを完全に消したい場合はOnAudioFinishedノードから代わりにSetActiveノードを接続する事で..
https://scrapbox.io/files/65ce8d8285da9a0024aa8562.jpg
完全にパーティクルを消す事ができます↓
https://scrapbox.io/files/65ce8e3c0eb32f0024778f6b.gif
😺フィールド上で永続的に鳴らす環境音(電球の音や、火の音や、車や電車の音、滝の音)などはこのようにブループリントクラスにAudioコンポーネントで音を鳴らしていいきます。減衰も付ければアクタの場所に応じて聞こえる範囲も決定する事ができます。
では最後にAudioコンポーネントのイベントについて軽く解説していきます。
Audioコンポーネントのイベントについて紹介!
ではAudioコンポーネントのイベントノードどんなものがあるのか主なものを三つ紹介していきます。
https://scrapbox.io/files/65ce8e61b251240028898ef0.jpg
Audioコンポーネントのイベントでは、Audioコンポーネントの再生する音の状態に合わせた様々なイベントを呼ぶ事ができます。では最初に先ほど使用したOnAudioFinishedから紹介していきます。
①OnAudioFinished (オーディオが終了した時点で実行)
OnAudioFinishedはオーディオが終了または停止した時点で呼ばれるノードです。
https://scrapbox.io/files/65ce8ee2b02de60024fb0a6b.jpg
なので上記のノードだと火の音を停止した時に上に下画像のようにAudio Finishedと表示されます。
https://scrapbox.io/files/65ce8eeee9f5100024db3c06.jpg
音を終了させたタイミングで処理を実行したい場合にこのノードは使用します。
②OnAudioPlayStateChanged (オーディオの状態を返す)
OnAudioPlayStateChangedノードはオーディオの状態をEnum型で返すノードです。Enum型とは複数の値をまとめたデータの事です。例えば以下の様にPrintStringに繋げるとオーディオの状態を表示する事ができます。
上記ノードを試してみると。再生されたタイミングで「Playing」,フェードアウトされたタイミングで「FadingOut」,停止したタイミングで「Stopped」とテキスト表示されます。
状態を表すテキストはイベントのOnAudioPlayStateChangedにカーソルを合わせると説明が表示されます。
https://scrapbox.io/files/65ce90542645dd0025a22c09.jpg
上記ノードを試してみると。再生されたタイミングで「Playing」,フェードアウトされたタイミングで「FadingOut」,停止したタイミングで「Stopped」とテキスト表示されます。
https://scrapbox.io/files/65ce907b2cd3630025a95c36.jpg
状態を表すテキストはイベントのOnAudioPlayStateChangedにカーソルを合わせると説明が表示されます。
https://scrapbox.io/files/65ce909fcb9c1d00276a2f53.jpg
③OnAudioPlaybackPercent (オーディオの進行度を取得)
OnAudioPlaybackPercentノードはサウンドウェーブの進行度合いを0~1(0が0%で1が100%の状態)で取得する事ができます。
例えば上記ノードにすると音声の進行度合いを表示します。0.5と表示されれば、オーディオが50%進行した状態を示します。
https://scrapbox.io/files/65ce90b2832e620024bb8cdd.jpg
例えば上記ノードにすると音声の進行度合いを表示します。0.5と表示されれば、オーディオが50%進行した状態を示します。
https://scrapbox.io/files/65ce90d40b539d0025c2da6f.jpg
これで主なAudioコンポーネントについての解説は以上です。
😺フィールド上で永続的に音を出す火や車などの音は、コンポーネントを追加して音を鳴らしていきましょう。またコンポーネントのイベントからオーディオの状態に合わせて処理を実行させる事ができます。