🏊

UEとWwiseで水回りのサウンド表現

2024/01/04に公開

はじめに

Wwise使用したサウンド実装を学習中です。
一通り使い方が分かって来たところで、より実践的なことをしたいと思い、具体的なテーマを一つ決めて試行錯誤しながら実装してみることにしました。
この記事では水回りの音表現について、アイディア出しから実装が完了するまでの流れを順番に書いていきます。

開発環境

  • Unreal Engine 5.1
  • Wwise 2022.1.4
  • UEの実装はブループリントを使用

テーマ

【三人称視点で常にカメラが自由に動かせる状態での水回りのサウンド表現】

恐らく三人称視点で実装できれば一人称視点でもそのまま仕組みが使えるので、今回は三人称視点としました。
カメラ(リスナー)がどんな状況でも水中と水上(地上)を行き来できることになるので、柔軟な仕組みを考える必要がありそうです。
最終的に↓の動画が出来上がります。

https://youtu.be/jkrG7uViA80

発想

イメージしてみる

まずはプールや海で遊んだときの状況を思い出して、どんな音が鳴っているか想像してみました。

水面(地上)では

  • 波の音が聞こえる
  • 水深の浅いところを歩くと水の跳ねる音がする
  • 深いところを歩くと水をかき分ける音がする
  • 水中を誰かが泳いでいても音は聞こえない
  • 足音がする(プールサイドなら「ペタペタ」、浜辺なら「シャリシャリ」)

水中では

  • 物を叩くと固い音がする(音が伸びない)
  • 吐いた空気がゴボゴボ鳴る
  • 地上の音はよく聞こえないが完全に聞こえなくはない
  • 定位感(音がどこから鳴ってるか)が掴み難い気がする

ポイントは、耳(リスナー)が水中にある状態では、地上の音も水中の音も大きく変化するということです。
さらに地上の音と水中の音ではそれぞれ違った変化をしています。
また、キャラクターが発生源になっている音(足音や水の跳ねる音)は、キャラクターがどの程度水に浸っているかで変化していきます。

三人称視点なので、耳=リスナーではない

三人称視点ではカメラがリスナーとなり、自キャラから発生する音も客観的に聞き取ることになります。
さらに今回はカメラが常に自由に動かせる想定なので、大きく4つの状況が考えられます。

  1. カメラもキャラも水上

  2. カメラもキャラも水中

  3. カメラは水上キャラは水中

  4. カメラは水中キャラは水上

これら4つの状況をスムーズに切り替える必要がありそうです。

仕様

どうやって音を変化させるか

シンプルにローパスフィルタ、ハイパスフィルタ、ボリューム調整(クロスフェード等)を使って表現することにします。
またリスナーが水中にある時はパンを切ってステレオ感をなくしてみます。

  • 水中の固い音
    ハイパスかける
  • 水中から聞いた地上の音(こもってる)
    ローパスかける
  • 水関係の音の切り替え
    クロスフェード

とか

これらのボリュームやフィルタの値を、キャラとカメラが「どのくらい水に浸っているか」に連動させることでスムーズに変化させます(WwiseのRTPC機能を使用する)。

必要な音素材を考える

効果音ラボ様の音素材を使わせていただくことにしました。
https://soundeffect-lab.info/

カテゴリ どこで鳴ってるか 音源名1 音源名2 音源名3
浅瀬歩くときの音(パシャパシャ) 水上 海岸の波打ち際を走り回る
深みを歩くときの音(ジャブジャブ) 水上 水に浸かりながら歩く
水中を歩くときの音(ゴボゴボ) 水中 水中で息を吐く1(ブクッ) 水中で息を吐く2(水中のこもった音) 水中で息を吐く3(ゴボッ)
足音(地面の種類によって切り替えたい) 両方 砂の上を歩く アスファルトの上を歩く
NPCの声(距離によってセリフを切り替えたい) 水上 「やっほー」 「ハアーイ」 「いらっしゃい」
波の音 水上 山奥の池
周囲の環境音(時間経過によって切り替えたい) 水上 夏の山1(昼間) 夏の山2(夕方) 夏の田舎の夜

水中を歩くときの音は「水中で鳴る音」、それ以外は「水上で鳴る音」と大別できます。
ただし足音に関しては、水中と地上を行き来するので両方あり得ます。

変化のイメージを表にしてみる

混乱しそうなのでカメラと自キャラの位置による変化を表にしてみます。
これらの表に当てはまるように各カテゴリのパラメータをRTPCで変化させていきます。

  1. カメラもキャラも水上
カテゴリ Vol LowPass HighPass
自キャラが浅瀬歩くときの音(パシャパシャ) × ×
自キャラが深みを歩くときの音(ジャブジャブ) × ×
自キャラが水中を歩くときの音(ゴボゴボ) × × ×
自キャラの足音 × ×
NPCの声 × ×
波の音 × ×
周囲の環境音 × ×
  1. カメラもキャラも水中
カテゴリ Vol LowPass HighPass
自キャラが浅瀬歩くときの音(パシャパシャ) × × ×
自キャラが深みを歩くときの音(ジャブジャブ) × × ×
自キャラが水中を歩くときの音(ゴボゴボ) × ×
自キャラの足音 ×
NPCの声 ×
波の音 ×
周囲の環境音 ×
  1. カメラは水上キャラは水中
カテゴリ Vol LowPass HighPass
自キャラが浅瀬歩くときの音(パシャパシャ) × × ×
自キャラが深みを歩くときの音(ジャブジャブ) × × ×
※自キャラが水中を歩くときの音(ゴボゴボ) ×
※自キャラの足音 ×
NPCの声 × ×
波の音 × ×
周囲の環境音 × ×

※自キャラの歩行音が何もないと気持ち悪いので微かに音を鳴らすことにする

  1. カメラは水中キャラは水上
カテゴリ Vol LowPass HighPass
自キャラが浅瀬歩くときの音(パシャパシャ) ×
自キャラが深みを歩くときの音(ジャブジャブ) ×
自キャラが水中を歩くときの音(ゴボゴボ) ×
自キャラの足音 ×
NPCの声 ×
波の音 ×
周囲の環境音 ×

見た目

  • ベース
    サードパーソンプリセットを使用します。
  • 自キャラ
    自キャラもプリセットのものを使用し、必要に応じて修正します。
    今回は水中では泳ぎ動作に切り替えず、そのまま水底を歩く仕様にします。

  • WaterPluginというUE付属のプラグインを使うのが一番お手軽みたいだったのでそれを使うことにします。
    プラグインの機能で海、川、湖が配置できますが、波や流れがあるといろいろ面倒そうだったので今回は湖を配置することにします。

  • 環境音に虫の声が入っているので、湖の周りに木を生やします。
    フォリッジ機能を使えば大量の木も楽々配置できます。
  • NPC
    声の発生源が必要なので自キャラとは別に1体キャラを配置します。
    できれば手を振る等の動作も入れたい。
  • 昼と夜
    昼と夜が切り替わるようにして、環境音もそれに合わせて切り替えます。
    太陽の位置に連動して空の明るさが変わる機能があるのでそれを使います。

実装

何はともあれ見た目を作る

サウンド中心の記事なので具体的な実装は省略します。
パッと見雑ですが結構苦労しました。

水面までの距離を計測する

レイを飛ばして水面までの距離を測ります。
いろいろ実験したところ、水面以下はすべて「水」判定になるため、水中から上方向にレイを飛ばして水面までの距離を測ることはできませんでした。
自キャラがどれくらいの水深にいるかを判断するには別の方法を考える必要がありそうです。

今回は「どのくらい水に浸っているか」が計測できればいいので、自キャラの頭頂部から下方向にレイを飛ばせば何とかなりそうです(頭頂部から水面までの距離を測る)。
またカメラ(リスナー)からも同様にレイを飛ばします。

地上にいるときは「0」、完全水中に入ったときは「100」となるように補正します。
この0~100の数値が「浸水値」となり、Wwiseのゲームパラメータに反映させます。

自キャラが発生源の音を鳴らす

とりあえず足が地面につくタイミングですべて同時にイベントをコールし、
不自然な場合はそれぞれ細かく調整していくことにします。

自キャラが水上を歩くときの音(パシャ、ジャブ)

それぞれ発音のたびにランダムに音が切り替わるようにします(RandomCntainerを使用)。

「自キャラの浸水値」に連動して「パシャパシャ」と「ジャブジャブ」を、クロスフェードを使ってスムーズに切り替えていきます(BlendContainerを使用)。
また「カメラの浸水値」に連動してローパスフィルタをかけます。

自キャラが水中を歩くときの音(ゴボゴボ)

用意した素材はこもった音ですが、ハイパスフィルタを効かせると水を切るような音を表現することができたので活用してみます。
状況に応じてハイパスフィルタを効かせることで様々な効果が得られます。

  1. キャラが浅瀬に行くにつれてハイパスフィルタを掛ける
    カメラが水中にある状態を保ったままキャラが水中と浅瀬を行き来する際、スムーズに音をつなげることができます。

  2. カメラが水上にある時にハイパスフィルタを掛ける
    現実世界では地上から水中の音は聞こえませんが、微かに音を鳴らすことでキャラの動作状況をプレイヤーに伝えることができます。
    むしろ操作中に動作音が何もないと気持ち悪いです。

自キャラの足音

地面の種類に応じて「砂」と「石」の音を切り替えます(SwitchContainerを使用)。
地面にタグを付けて地面の種類を判別します。


水関係の音と同様に、それぞれ発音のたびにランダムに音が切り替わるようにします(RandomContainerを使用)。

NPCの声

自キャラからの距離に応じてセリフを切り替えます(SwitchContainerを使用)。

普通アニメーションをトリガーにしてボイスを再生することが多いと思いますが、今回はWwiseの機能を駆使してボイスをトリガーにしてアニメーションを再生させてみます。
まずスイッチグループで「UseGameParameter」にチェック入れて、パラメータに応じてステートが切り替わるようにします。
さらにゲームパラメータの「Bind to Built-In Parameter」で「Distance」を設定するとゲームオブジェクトとリスナーの距離を自動で反映してくれます。

またSwitchContainerの「Play 1st only」にチェックを入れるとステートが切り替わった後に一回だけ再生するようになり、UE側では適当な間隔でEventをコールするだけでいい感じにNPCが声をかけてくれるようになります。

最後にコールバック機能でUE側に各ボイスの発生を通知して、ボイスに対応した動作をさせます。
ボイスの開始にタグを付けてコールバック機能でアニメーションを再生します。
ついでにボイス再生直後に自キャラがNPCの方向を向くようにします。

波の音

オートメーションを使って水面の音を実装します。
ランダム設定も併用し、湖の範囲内どこにいても自然に音が鳴るように調整します。

周囲の環境音

時間経過(朝昼夕夜)に合わせて環境音を切り替えます(SwitchContainerを使用)。
「朝」は無音にするので音源を設定しません。
SwitchContainerの「PlayMode」を「Continuous」にするとステート切り替えるだけで対応した音を再生してくれます。
それぞれFade-in Time Fade-out Timeを設定しておけば、UE側は朝昼夕夜に合わせてステートを切り替えるだけでOKです。

最後に

変化具合を数値化して表示してみた

https://youtu.be/TbHfdi0tUCo

やはり見た目は大事

実装していて一番感じたのは見た目がサウンドに与える影響です。
当初もっと簡素な見た目でサクっと実装する予定でしたが、どうしても不自然になってしまいそうだったので見た目的な実装にも結構時間を取られました(水上を歩いたときの波紋等)。
当然かもしれませんが見た目的に存在しないものの音が鳴ってたりするとめちゃくちゃ不自然になります。
ただゲームにおいてサウンドは、ゲームの状況等をプレイヤーに伝える手段でもあるので、様々なことを考慮しバランスをとることが重要だと思いました。

Wwiseはとても良くできている

実践形式の実装をしてみて、Wwiseの利便性をとても強く感じました。
ゲーム制作におけるサウンド実装のノウハウが詰め込まれており、「こんな感じの表現したいけど、なんか便利機能ないかな~」と思って探すと大抵あります。
極小規模のデモ作成でも利便性を感じるので、大規模開発ではより大きな効果を発揮すると思われます。

今後の課題

まだまだ把握していないWwiseの機能が沢山あるので、引き続き研究していこうと思います。
今回の水表現に関しても「遮蔽」の制御をうまく使えばより良い実装ができるのではと考えているので、そのうち再チャレンジするつもりです。

Discussion