Unityでインディゲームを作る!

Unityでのゲーム制作を目指し、それに関わる話題についてのブログ

FMOD(ミドルウェア・オーディオエンジン)について [初心者入門編]

 FMODというオーディオ・ソフトウェアについて、初心者視点から学んだことをまとめてみようと思います。 

FMOD_TopCover

 FMODというのはミドルウェアと呼ばれるタイプのソフトで、UnityやUnrealエンジンなどの既存のゲームエンジンや、何らかのソフトウェアに組み込まれる形で使用することが出来るオーディオ・エンジンです。 もちろん本ブログでは、Unityでの利用が前提になります。

 同様なオーディオ・ソフトとしてはWwiseも有名ですね。どちらもインディから大作ゲームまで広く使用されています。 

 以前の記事で少し触れたことはあったのですが、ようやく最近になって基本的な機能を理解することが出来た(気がする)ので、様々な機能や使い方について覚え書きをしていこう、という所存です。

 

ゲームにおけるオーディオの課題

 映画やアニメなどのリニアなメディアとの大きな違いは、ゲームはインタラクティヴなメディアであり、プレイヤーの操作によって(プログラムの範囲内で)臨機応変に変化し、進行していく、ということです。

 古いゲームや単純なゲームはともかく、最近のゲームではノンリニアで自由なゲームプレイを前提にしているものが増えているし、ゲームのインタラクティヴな特性をより活かすために、オーディオについてもそうした機能が求められます。また、単純な効果音再生にしても、ある程度のランダム性を持たせずに同じ音ばかり再生されると、特にリアル系のゲームでは不自然になってしまう恐れもあります。

 (3Dゲームの場合、3D空間における自然な音再生というのも考えなければいけないので、これもまた大きな課題の一つです)

 

 つまり、現代のゲームオーディオに求められているのは、ゲーム進行や状況に対して柔軟に変化したり、プレイヤーの入力にオーディオが対応する、というようなインタラクテイヴなコントロール機能や、よりリアルで自然な効果音を生成する機能です。これらの課題をFMODは解決してくれます。

 

Unityのオーディオ・コンポーネント

 Unity上でオーディオを扱う際には、通常オーディオ・コンポーネントを使うことになりますが、これには基本的な機能しかありません。なので、単純なワンショット再生やループ再生だけならまだしも、ゲームの進行に合わせたオーディオコントロールとなると、自分でプログラムしていく必要があります。

 

 例えば、再生する際に多少の変化をつけることでランダム性を持たせるというのは、ピッチをある程度の範囲で変化させたり、あるいは複数のオーディオクリップを再生する、などで実現できますが、それを行うにはスクリプトを書いて、自分でそうした機能を作る必要があるということです。 

 

 ランダム再生や、上記事にあるようなクロスフェード程度ならまだしも、さらに高度な機能を自分で作っていく、というのはかなり難しいことだと思います。

 

FMODがあれば・・・

 FMODをUnityに統合すると、トップ写真であるFMOD studioというソフトにおいて『イベント』を作成することで、Unity上では基本そのイベントを再生さえすれば良くなります。(どう再生するかの調整はありますが)

 細かい設定やランダム性を持たせるような機能やエフェクトはFMOD上にあるので、Unity上でオーディオ周りを細かく設定する必要がありません。つまり、オーディオに関する作業をUnityから大部分、分割出来ます。(リアルタイムでUnityとFMODstudioを同期して作業するLive Updateという機能もあります)

 

 イベント(Event)というのは、FMODにおけるオブジェクト単位です。イベントは複数のオーディオやエフェクト、オートメーションなどを含むことができ、オーディオは様々なインストゥルメント(Instrument)として、イベントのタイムラインやパラメータ(後述)ラインに並べることが出来ます。

 

 イベントさえ作ってしまえば、中身のオーディオはFMOD上で、いくらでも取り替えられるので効率的な制作を行うことが出来ます。

 

FMODの基本について

 まず、利用は条件ありで無料です。予算の規模ごとに指定がありますが、趣味や個人レベルの開発規模では超えることはまず無いので、気にする必要はないです。(500kドル以下の予算で無料)

FMOD_cite_top

 Fmod公式ページに登録後、Fmod StudioUnity統合用のパッケージをダウンロードします。まず、Fmod Studioでプロジェクトを作成。Unity上でパッケージをインポートし、そのプロジェクトをUnityに設定することで、UnityでFmodを利用することが出来るようになります。

 その後、音を出したいゲームオブジェクトにFmod Event Emitterというスクリプトをアタッチしてイベント設定し、カメラ等にFmod Listenerを設定すれば、準備は完了です。(UnityのAudio Listenerはオフにする)

 

 具体的なオーディオデータは取り込んだ後、Instrumentとしてイベント上に読み込むことが出来ます。通常の再生であれば、タイムライン(時間軸)上に並べて再生すればこと足りますが、パラメータ・ラインに並べるとパラメータを表す縦線が重なったインストを再生するという使い方も可能。

 パラメータに応じて、音を出したり出さなかったりということが出来るので、より」表現力が高まります。

 

 トラック単位、イベント単位でエフェクトやモジュレーション(音量やピッチの変調)、オートメーション(パラメータ変化に対する操作の自動化)を設定することができるので、ほんとに何でも出来ます。

 

 

パラメータ(Parameter)について

 インタラクティヴかつ、状況に適応するオーディオコントロールを欠かせない、『パラメータ』についてです。

f:id:miur-us:20190623183142p:plain

 FMODでは、入力や状況を表すデータとしてパラメータの変化を利用します。パラメータが増えるごとに音量が大きくなったり、ピッチが高くなったり、というような操作です。

 Distance(距離), Direction(聞き手から方向), Elevation(縦方向の角度), Event Cone Angle(音源からの角度), Event Orientation(音源と聞き手の向き)という5つの基本パラメータ以外については、自分で自由に設定することが出来ますが、そうしたパラメータの増減は、スクリプトを通して手動で行う必要があります。

 

 また、Fmod Studio上のパラメータ・ノブ横にあるパラメータ名をクリックすると、次の画像のような表示が下部に現れるので、そこで挙動を設定できます。

f:id:miur-us:20190623012330p:plain

 値が変更した際に実際にその値に移動するまでの速さ(Seek Speed)を設定できます。Instantだと変動の遅れが一切ありません。Asymmetric(非対称)をオンにすると、上昇下降で違う速度に設定できます。

 Velocityはまだ良く分かってないですが、パラメータが変更された値に到達した後、元の値に戻るスピードを設定できるようです。

 

FMODで何ができる?

 じゃあ、具体的にFMODで何が出来るのか?ということを簡単にまとめます。画像は公式のデモプロジェクトや、近年のインディゲームでも高い完成度を持つ、Celesteのプロジェクト(公式から公開されてます)から引用しています。

 

複数のオーディオからランダムに再生

f:id:miur-us:20190623021842p:plain

 マルチ・インストはプレイリストを持っており、複数のオーディオファイルを読み込むことが出来ます。そのプレイリストから順に再生したり、ランダム再生することが可能です。また、再生時にインスト単位から音程や音量にモジュレーションをかけることも出来るので、同じような音が繰り返されてる感を緩和できます。

モジュレーションにはランダム、AHDSR(アタック、ホールド、ディケイ、サスティン、リリースの略、時間軸上の音量変化)、サイドチェイン(他のトラックなどからの外部入力をつかって変調する)があり、様々な使い方ができるようです。 

 

ぶつかる衝撃度で音を変える

f:id:miur-us:20190623014759p:plain

 現実では当たり前ですが、当たった時のスピード、強さで音が大きくなったりします。ぶつかる衝撃やスピードなどをパラメータとして設定することで、それに応じた音設定を行うことができます。

 

 パラメータに応じて、音量を上げるだけでなく、EQで音の変化を強調したり、そもそもオーディオデータを追加することで音を増強したり、ということも可能です。

 

足音などを地面の材質によって変える

 足音などの効果音はインタラクティヴ性をより高める上で重要ですが、地面や床の材質によって音を変えていかないとリアリティは出ません。

f:id:miur-us:20190623020552p:plain

 地面ごとに番号(インデックス)を振り分けてパラメータ化することで、一つのイベント内で音を変えることが出来ます。

 

3D空間における音量の減衰

f:id:miur-us:20190623003428p:plain

 イベントを作成する際に2D3Dか選べますが、3Dイベントには自動でマスターにこのSpatializerがセットされています。これは要するにゲームシーンにおいて、リスナー(プレイヤーかカメラ)への距離に応じて音量を自動的に調整するという機能です。ただし、周波数的な減衰については、多少工夫する必要が出てきます。
 

イントロとループ部分を分ける

f:id:miur-us:20190623003316p:plain

 ゲーム音楽と言えば、ループされることが前提としてありますが、イントロはループ再生して欲しくないはずです。イントロ部とループ部を分けたり、ループ・リージョン(画像の青い長方形)をループ部分にのみ設定することで、ループを指定することが簡単に出来ます。

 

ループをゲームプレイに応じて終わらせる

f:id:miur-us:20190623004525p:plain

 ゲームプレイによって進行が変わる、というのは例えば『いつまで効果音を再生するべきか?』という問題を引き起こします。持続するタイプの効果音はプレイヤーの操作などに応じて終了します。つまり、きっかけ(トリガー)となることが起こらない間は、ずっとループ再生されていることになります。

 パラメータを変化させることで、ループ再生を終了させることが出来ます。

f:id:miur-us:20190623010916p:plain

プレイヤーが受話器を取るまで電話は鳴り続ける

 電話が鳴っているときに受話器を取ると、チンッと鳴って止まる、鳴っていない時に取ればそのまま静かに止まる。こうしたちょっとした音の挙動も再現することが可能になります。endというパラメータが1になるとそれぞれの終了部へジャンプします。

 

状況、天気や時間によって音を出したり、変えたり

f:id:miur-us:20190623011726p:plain

一日を四分割してそれぞれ異なる環境音を再生する

 例えば、時間や天気によって、環境音は変わります。夜はフクロウや狼が鳴いたり、日中は蝉が鳴いたり。

 単に違うオーディオを流せばいい場合もありますが、シームレスに状況が変わる場合は、当然オーディオもシームレスに変化する必要があります。

 

ゲーム進行に応じた音の変化

 当然、ゲームというのはプレイしていけば、何らかの進展があります。外から中に入ったり、中に入った後、さらに奥深く潜っていってボスの部屋に辿りついたり。

f:id:miur-us:20190623015837j:plain

 外から中に入れば、風や雨の音は静かになるだろうし、城やダンジョン内部の音が大きくなるかもしれない。また、楽曲をレイヤー分けすることで、進行度によってアレンジやミックスが変わっていく、ということも可能になります。

f:id:miur-us:20190623015729j:plain

 上画像では進行度(Progress)に合わせて、各レイヤーの音量を切り替えていくことで、一つの曲の複数のアレンジを切り替えていく、ということをやっています。

 

曲の進行をコントロールする

 通常のリニアな楽曲というのは進行が決まっており、一度始まったら決まった通りの進行がなされます。何回再生しても変わることはありません。

 しかし、ゲーム進行に合わせるとなると、時には展開をいくつかジャンプする、ということもありえますし、ゲームプレイのたびに進行や曲の長さが変わっていくのが普通です。

 

 FMODではこうした臨機応変な曲展開のコントロールも行えます。ループ・リージョントランジションあるいはトランジション・リージョンをパラメータと合わせて使うことで実現可能です。

f:id:miur-us:20190623015102p:plain

ジャンプするタイミングも決められる。緑線のポイントで移動する

 トランジション(リージョン)は、結びつけたパラメータが、指定した範囲内にある時に、設定した移動先マーカーにジャンプする、という風に使うことが出来ます。

 ループ・リージョンと合わせて使えば、ゲーム進行が変わらないなら、同じセグメントをループしつづける、というようにコントロールできますし、例えば、そのエリアにいる敵を全て倒したら、その時点でエンディングへ飛んで曲が終了する、というようなことも出来ます。

 セグメント同士の移行をより自然になるようにトランジション・トラックを挟み込む機能もありますが、ひとまず今回の記事では省きます。

 

その他の機能について

 他にもまだまだ機能はありますが、基本的な機能については触れることが出来たと思うので、とりあえずこれくらいにしておきます。

 

 その他の機能としてはミキサーの状態を記憶できるスナップショット、かつそれをイベントにおいて実行する、スナップショット・インストなんかもあるわけですが、ここら辺はまだまだよく分かっていません。

 ただ、メインBGMとサブエリアBGMのチャンネルを分けて、フェードクロスさせるというようなことは、スナップショット使って実現できているので、更に追及していきたい部分です。