News Activity Product Learning red Event Contact
Devblog top img

開発ブログ

2018-01-12

SoundCueで複数のサウンドをランダムに流し続ける方法!!

writer : yuga

1.はじめに

 

タイトル通りです.

ゲームを作るにあたって,複数のサウンドをSoundCue(以下Cue)内に配置したのは良いものの,以下のような現象が起こってしまいました.

一度ランダムにサウンドが流れ,もう一度サウンドをランダムに選択し流れてほしいにも関わらず、一度目にランダムで選択されたサウンドが何回も流れ続けてしまいました.

ノードの繋げ方を変えることで上記の動作が可能になったのでCueの注意点と共に紹介したいと思います!

 

2.やり方

 

オーディオがないと何の意味もないのでインポートからwaveファイルを保存しておきましょう.

それが出来たらまずはCueから作成していきます.

コンテンツブラウザ→サウンド→サウンドキューを選択します.今回は以下図のように二つのオーディオをいじるのでそれらに関した名前に変更しておきます.

続いてCueを開き,オーディオ動作させたい数だけCueの右側のパレットからドラッグ&ドロップしましょう.

そのノードを選択し,SoundWaveを対象のサウンドにしておきます.

ここで目的を再確認しましょう.

今回は二つ(複数)のサウンドがCue内で毎度ランダムに流れてほしいというものでした.

右のパレットには沢山のノードがありますが、今回必要そうなRandomノードとLoopingノードだけ引っ張りだしておきます(サウンドの切れ目が分かりにくい場合Delayノードも二つ用意しておきましょう,ここでは一応使用しています).

実は最初に定義したWavePlayer内にもLoopingがあることが確認できます(これのせいでややこしくなったと言っても過言ではない…())

それではノードを組んでいきます.

僕の使用したサウンドの場合,切れ目がわかりにくいのでWavePlayerの後にそれぞれDelayノードを挟みました.

不必要な方は読み飛ばしてくださいな.

CueのDelayノードは普通のBluePrintと少し違い,時間を範囲指定してランダムに発生させることができます.

 

そろそろ本筋に戻って必要なノードを組みます.

と言いたいところなのですが,ここで失敗例を二点紹介しようと思います.

-失敗例-  WavePlayer自体をループさせるやり方

(いちいちノードでループさせなくてもSoundWave自体をループさせてそれぞれRandomノードに繋げばええやん!!)

失敗.一つのSoundWaveだけが無限に再生されるかと思います.

まぁ当たり前といえば当たり前の事態でした.

 

ちなみに再生の仕方は,画面左上のキューを再生を押すだけです.楽で助かります.停止は停止です,そのままです.

それぞれのノードを選択した状態ならばそのノードを再生ボタンを押すと一度だけキュー内のノードが通ると思います.

 

 

-失敗例-  Random直前でループさせるやり方

(WavePlayer自体がループしてる訳じゃないしこれでいけるやろ!!!!)

失敗.先ほど同様,一つのSoundWaveだけが無限に再生されるかと思います.

UE4公式では

Looping ノードは、遅延の導入など、ロジカルなループまたはプロシージャルなループに対してのみ使用すべきです。

とあったのでDelayノードの後にLoopingノードを入れてみました.

それに,LoopingノードCue全体の処理が終わってからの処理として行われるならRandomノード手前だったら一度通った後にCueオード処理自体をループしてくれるかと期待しましたがそうはいきませんでした.

 

 

それではお待ちかねの成功例を発表しようと思います

-成功例-

デデン!

まぁ単純ですね.

再生してみてください.

 

 

..

何か異変に気付きましたか?

そう,実はこのプログラムだけでは毎回ランダム再生ではなく初めの再生だけランダムに再生され,そこからは毎回交互に再生されてしまうのです.

こんなの嘘つきだ!と思った方,落ち着いて見てください.

何故ランダム再生なのに交互に再生されてしまうのかと言うと,Randomノードにそういう指令がありまして,Randomノード内のRandomizeWithoutReplacementというもののせいのようです.これはTrue(チェックON)時に繰り返しを行う前(ループが行われる前)全てのサウンドを流しきるというプログラムのようです.

毎回サウンドが変わって欲しい今回の様な状況では邪魔になるので以下図のようにFalse(チェックOFF)にしておきましょう.

 

これで毎回ランダムに流れるようになったのではないでしょうか?

ちなみにRandomノードのWeightsではRandomノードに繋いだWavePlayerの発生確率を調整できます(上から順に0番,1番)

この結果を見るに,Loopingノードは今まで繋いできたノード全てをループさせる,という働きをしているといったところでしょうか.Randomノードの手前に入れるとランダム再生ができませんしね.

 

以上でCueについてのサウンドのランダム再生については終わります.