Help us understand the problem. What is going on with this article?

UE4 サウンドキュー作成例

概要

UnrealEngine のサウンドキュー(SoundCue)についてのメモ書きと作成例について記述しています。

環境

Windows10
Visual Studio 2017
UnrealEngine 4.22

参考

以下を参考にさせて頂きました、ありがとうございます。

公式 - サウンドキューリファレンス
UE4 Saitama 初心者向けハンズオン #6『サウンド再生』

サウンドキュー作成例

SEの順次再生

複数のサウンドウェーブデータを順次再生させる、途中で[Looping]にチェックを入れてしまうとそれ以降が再生されなくなってしまいます。

SoundCue_Concatenator.png

1番目と2番目のピンに接続したときの音のみ隙間なく再生されるようです。(3番目以降は継ぎ目に僅かに隙間があるとのことです)

SEのランダム再生

幾つかのサウンドウェーブデータからランダムで1つ再生させる。

SoundCue_Random.png

このランダムは FMath のランダムを使用しているため、例えば毎回同じ乱数にするためには FMathの乱数の初期化がいるようです。

イントロ付きループのBGM(その1)

waveファイルのループタグ情報は無視されるため、イントロ付ループBGMを実現するにはイントロとループのサウンドウェーブデータを自前で繋いであげる必要があります。

  1. イントロ、ループに分割したサウンドウェーブデータを用意する。
  2. [Concatenator]ノードで繋ぐ。
  3. ループデータの方の[WavePlayer]ノードの[Looping]にチェックを入れる。

サウンドキュー例
IntroLoop_SoundCue2.png

環境にもよるのかもしれませんが、イントロループの繋ぎ目にわずかに隙間があると思います。

イントロ付きループのBGM(その2)

イントロとループの繋ぎ目を目立たなくするためにやや強引な方法を使ってみます。

  1. イントロ、ループに分割したサウンドウェーブデータを用意する。(waveファイルのループタグ情報は無視されます)
  2. サウンドノード[Wave Player]を2つ用意し、それぞれイントロとループのサウンドウェーブデータを割り当てます。ループデータのほうには[Looping]にチェックを入れます。
  3. [Delay]ノードと[Mixer]ノードを用意し繋いでアウトプットへ。
  4. [Delay]ノードにはイントロサウンドの再生時間分のディレイ時間を設定します。

サウンドキュー例
IntroLoop_SoundCue.png

ディレイ時間はイントロウェーブデータの再生時間ピッタリではなく、わずかに短くするとマシになります。また、DelayMinとDelayMaxは同じ値を入れます。

足音

床の種類に対して幾つかランダムで再生するようにすると良いと思われます。

  1. 床タイプに基づいて足音種類を用意し、各床タイプでランダムで繋ぐ。
  2. 床タイプが入った外部パラメータ(FloorType)にて[Switch]ノードで分岐させる。
  3. [Modulator]ノードでピッチの変化を、[Countinuous Modulator]ノードで外部パラメータでボリュームをそれぞれ設定する。
  4. 対応するアクターBPなどからパラメータをオーディオコンポーネントに対し更新する。
  5. サウンドキューの再生はアニメ―ションシーケンスのAnimNotifySoundなどから行う。

サウンドキュー例
FootStep.png

ピッチの変化を入れています。
FootStep_0.png

ボリュームを外部パラメータから更新します。
FootStep_1.png

エンジン音などのパラメータ変化する音

スピードやエンジンの回転数を表す変数を用意し、その値に伴ってピッチの変化をつけることで表現をしていきます。

  1. 低速時エンジン音と高速時エンジン音を用意し、それぞれ[Looping]にチェックを入れ[Continuous Modulator]ノードにつなぎます。
  2. [Crossfade by Param]ノードで繋いでアウトプットへ。
  3. パラメータ名を決めて、[Continuous Modulator]ノードのピッチに設定します。
  4. 以下は[Speed]というパラメータ名で変化するピッチを設定しています。
  5. 設定したパラメータに入力するBPを書いてオーディオコンポーネントの[SetFloatParameter]へ設定します。この時[InName]には決めたパラメータ名を入れます。

低速時の設定例、速度パラメータは0~200を想定しています。
Modulator1.png

高速時の設定例、速度パラメータは20~4000を想定しています。
Modulator2.png

BP設定例:対象アクターのTick処理などでパラメータを更新します。
EngineBP.png

C++コードは以下の様になります。

.cpp
// オーディオコンポーネントに浮動小数パラメータを"Speed"という名前で設定する
AudioComponent->SetFloatParameter(FName(TEXT("Speed")), GetSpeed());

サウンドキュー例
SoundCue_Engine.png

その他

オーディオコンポーネントのサウンドキューへのパラメータ設定

サウンドキューへのパラメータ設定のメソッドは以下の様になります。それぞれBPノードもあります。

Components/AudioComponent.h
// サウンドキューへ浮動小数パラメータを設定する
UFUNCTION(BlueprintCallable, Category="Audio|Components|Audio")
void SetFloatParameter(FName InName, float InFloat);

// サウンドキューのWaveParamノードへサウンドウェーブデータをパラメータ設定する
UFUNCTION(BlueprintCallable, Category="Audio|Components|Audio")
void SetWaveParameter(FName InName, class USoundWave* InWave);

// サウンドキューへブール値パラメータを設定する
UFUNCTION(BlueprintCallable, Category="Audio|Components|Audio", meta=(DisplayName="Set Boolean Parameter"))
void SetBoolParameter(FName InName, bool InBool);

// サウンドキューへ整数型パラメータを設定する
UFUNCTION(BlueprintCallable, Category="Audio|Components|Audio", meta=(DisplayName="Set Integer Parameter"))
void SetIntParameter(FName InName, int32 InInt);

まとめ

[Branch][Random][Switch]などの本来サウンド再生を呼び出す側でプログラムコードに書いたであろう処理をサウンドキュー内で書くことができるため(変数を渡す必要はありますが)、どのような使い方をするかをサウンドデータ側に書けるのが良い部分かと思います。

記述したサウンドキュー例については、よりよい方法がありましたら教えて頂きたいです。

また、サウンドデータをストリームにするとループなどの繋ぎ部分が上手くつながらず、うまい方法が見当たりません、エンジン側でのサウンド機能修正を期待したいです。:warning:

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away