ゲームの銃撃音バリエーションを増やしつつコード量を減らす

# ゲームのSEにバリエーションをもたせよう

みなさんは銃が登場するゲームを作るとき、銃の「発射音」はどのように作っていますか？
素材サイトからダウンロードしたり、有償の素材パックから入手した音声データをそのまま再生するパターンが一番多いかと思います。
素材のダウンロード後、波形編集ソフトを使ってエフェクトをかけたり、モノラル化したり等の加工をする場合もあるでしょう。プロフェッショナルな現場では、実銃や模型の銃の音を録音する場合もあります。

シューティングゲームや銃を使うアクションゲームにおいて、銃の音というのはプレイヤーが何万回と聞く音です。延々と同じ音を聞かせるより、可能であれば、鳴らすたびにバリエーションの異なる音が出せるとよいでしょう、
たとえば音の高さ（ピッチ）を少しランダムにしたり、音が聞こえてくる方向を少しランダムにするなどの再生時の設定によって、繰り返し感を減らすことができます。
加えて、「リロードの音」、「薬莢が地面に落ちる音」、こだわるなら「引き金の音」も入れるなど、こだわれるポイントはいくつもあります。

## 銃のSE再生制御を効率的に行う
「銃の発射音」「リロードの音」、「薬莢が地面に落ちる音」、「引き金の音」が手に入ったところで、実際の再生制御について考えてみます。

C++のネイティブ開発、あるいはUnityやUnreal Engineなどのゲームエンジンにおいては音の再生システムはプリミティブですので、再生制御にはコーディング（またはBlueprintでの制御）が必要です。
ゲーム内で弾丸を発射した瞬間に「銃発射音」を再生して、ほんの少し遅れて「引き金の音」を再生、続いて「薬莢が地面に落ちる音」と「リロードの音」などを順番に再生します。加えて、4つの効果音素材データのロード処理と、タイミングを合わせた再生制御、場面に応じたエフェクトの使い分けを自分で組む必要があり、なかなか大変です。

そこで、今回はサウンドミドルウェアである「ADX2」を使って、手間を減らしつつ演出をリッチにしていきます。

## CRI ADX2とは
CRI ADX2はゲーム向けの統合型サウンドミドルウェアです。各ハードウェアでの最適な音声再生と独自の圧縮コーデックに加え、「音』に対してさまざまな再生制御情報を埋め込むことができます。
このシステムでは、音声データファイルを直接指定して再生するのでははく、「キュー」と呼ばれる再生単位で管理します。
「キュー」は、音のピッチ変化やエフェクトのパラメータ、複数の波形ファイルを組み合わせた再生など、音の制御に関する設定が幅広くできます。
「CRI Atom Craft」と呼ばれる専用オーサリングツールが付属しており、このツール上で「キュー」を作成します。

ADX2は、Unity, Unreal Engine 4, Cocos2d-xなどで一緒に使えます。ネイティブ環境用のライブラリもあるので、自作エンジンや他のエンジンに対しては自分で組み込むことも可能です。
個人・小規模のチームでは、無償版の「ADX2 LE」が使用できます。

無償版：ADX2 LE
https://game.criware.jp/products/adx2-le/

無償版は、PC/Mac/iOS/Android向けのライブラリが付いています。また、サウンドの設定を行うツールはWindows版とMac版両方が同梱されています。

### ゲームエンジンへの組み込み
本投稿はCRI Atom Craftで音の設定を組んでいく部分を解説しますので、各エンジンへの導入は次の記事を参照ください。

Unity: Unityのサウンド機能をADX2で強化する
https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377

UE4：　ADX2 for UE4の導入で、一歩上のサウンド表現を（導入編）
https://qiita.com/SigRem/items/4250925f6d66a4fd287a

## 銃の音を手に入れよう

フリー効果音サイトの「[効果音ラボ](https://soundeffect-lab.info/)」さんで、ハイクオリティな銃の効果音が配布開始されています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">効果音ラボで、海外で収録した実銃の音を公開しました！拳銃から大型狙撃銃まで幅広くカバーし、ボルトアクション等の操作音も含め、ほぼすべて本物の音です。フリー効果音でここまで本格的な実銃の効果音は恐らく日本初となります。<a href="https://t.co/hFvdUKGMVo">https://t.co/hFvdUKGMVo</a></p>&mdash; 効果音ラボ (@soundeffect_lab) <a href="https://twitter.com/soundeffect_lab/status/1198481489026924544?ref_src=twsrc%5Etfw">November 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

とのことで、非常に品質が高いです。今回はこちらの音をゲームに実装することをベースに考えていきます。

- 効果音ラボ
https://soundeffect-lab.info/sound/battle/battle2.html

この記事の例では、
-「拳銃を撃つ」
-「拳銃の弾切れ」（引き金の音として使用）
-「拳銃をチャッと構える」（スライドが戻る音として使用）
-「狙撃銃発射」
-「大型狙撃銃のボルトアクション」
-「大型狙撃銃の薬莢が落ちる1～3」
を使います。

### WAVEファイルへの加工
ダウンロードしたデータはmp3に圧縮されているため、waveファイルに変換する必要があります。
[XRECODE](https://xrecode.com/)や、[TAudioCoverter](http://ozok.users.sourceforge.net/)などの一括変換ツールを使ってmp3からwavファイルへ変換しておくと良いでしょう。
またその際、モノラルデータに変換しておくことをおすすめします。ゲームでは効果音が聞こえる方向をプログラム的に加工するため（左から発生した音が左方向から聞こえるように）、ステレオデータである必要がないためです。

## 銃の音のバリエーションづくり
作業は主にADX2に同梱されているオーサリングツール「CRI Atom Craft」を使っていきます。本投稿ではADX2 LE SDKは2.10.05を使用します。
基本的なツール操作については上記のチュートリアル記事を参考にしてください。

### 再生シーケンスの作成
まずはハンドガンの音を使ってシーケンスを作ります。キュー「Handgun_Show」を作成し、トラックにファイル「_sound_battle_mp3_handgun-firing1.wav」を配置します。

![ハンドガン１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/95b2c40e-6b2e-748c-ff15-749eb5cb3c29.png)

つぎに、引き金を引く「カチッ」という音を再生する設定を行います。追加のトラックで「_sound_battle_mp3_handgun-out-bullets1.wav」を配置してください。

![ハンドガン２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/a913c329-8a7f-cea4-617f-33c4d2c98b46.png)

F5キーでキューのプレビュー再生を行います。このとき、それぞれの音のバランスを確認します。少し引き金の音が目立ちすぎる気がするので、ボリュームを1割ほど落としてバランスをとっています。

次に、スライドが戻る音を入れます。「Track__sound_battle_mp3_handgun-ready1.wav」を同じ用にトラックへ配置します。このトラックは再生開始位置を少し後ろに動かします。
F5キーでプレビュー再生を繰り返し行い、いい感じのタイミングでスライド音がなるように調整していきます。

![ハンドガン３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/47e8b1f9-568f-f68d-528d-9cf6a3aaf5d8.png)

このトラックも同様に音量調整を行います。例ではもとの３割程度にしています。
３種類の音が鳴る演出になりますが、ADX2を使うことでスクリプトでいちいち数値を入れながら再生位置やボリュームを試す必要なくなります。
ゲームに取り込む前に、ツール内で聞こえ方を繰り返し確認して調整ができるためです。
納得がいくまで調整していきましょう。Cmdキー(WindowsではCtrキー)を押しながらドラッグすることで、より細かい時間単位での変更ができます。
（先にCtrlキーを離してからマウスボタンを離すようにします。先にマウスボタンを離すとリージョンがコピーされてしまいます。）

### 発射されるごとに微妙に音の高さをランダムにする

これでリッチな銃の発射音ができましたが、現状では単一のWAVEファイルとして出力して、再生することとほぼ変わりません。せっかく３つの音データを使っているのですから、再生リクエストがかかるたびに音が微妙に変わる仕組みを入れてみましょう。

まずは音の高さを変えます。一番上のトラックを選択した状態で、インスペクター下部の「ボリューム/ピッチ」タブを選択します。
ピッチを変えるスライダーがあるのですが、これを左右に動かさずに、縦方向に動かします。

![ハンドガン４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/b172a563-6759-2e1f-9f84-8201819a094a.png)

すると、緑色の幅が現れます。これはランダム幅を示しており、この範囲内で再生されるたびにパラメーターのランダマイズがかかります。僅かな違いですが、全く同じ音を繰り返し鳴らしている、という感覚をやわらげることができます。

### 複数の音素材からランダムに再生する素材を変える

先程の例では音の再生パラメータをランダムにするものでしたが、複数の波形ファイルからランダムにどれかを選んで再生、といった仕掛けを作ることもできます。これを導入すれば、繰り返し感をより減らせます。

「スナイパーライフルの発射音と薬莢が落ちる音」を例に作っていきます。まずはキュー「SniperRifle_Shot」を作成し、ダウンロードした音素材から「_sound_battle_mp3_sniperrifle--firing1.wav」をトラックに配置します。

つぎに、薬莢が落ちる音を作っていきます。今回は３種類の薬莢落下音から、どれかがランダムに再生される設定をします。
キューに空のトラックを追加して「Shell」と名前をつけます。ワークユニットツリーの上でキューを選択して、右クリックから「新規オブジェクト -> トラックの作成」で新規作成できます。
トラックができたら、更にそのトラックの下に「SubSequence」を作ります。トラックの上で右クリックして、「新規オブジェクト => サブシーケンスの作成」を選択します。

![ライフル１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/70e7e68b-4af1-ae00-528b-df84435f34e6.png)

このSubSequenceの中で薬莢の音の設定をしていきます。３種類の波形ファイル（Track__sound_battle_mp3_sniperrifle-shell1から3）をトラックとして配置します。

![ライフル２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/454391fd-dde0-0d57-076b-5a32292e012f.png)

この状態でF5キーを押すと、３つの音が同時に鳴ります。SubSequenceの設定で、どれか一つをランダムに鳴らす設定に変えます。

![ライフル３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/24f035b6-03ba-32e3-911d-c59615982bf5.png)

ランダムでいずれかが再生される設定ができましたので、キューのタイムラインを表示して、再生位置の調整をします。

![ライフル４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/d4bf4d32-8d1c-a794-3c3e-0ae220b126ab.png)

キュー全体をプレビューしながら、再生位置を決めれば完成です。

### 発射されるごとに薬莢が落ちる場所を微妙にランダムにする
さきほどはピッチのランダマイズを行いましたが、こんどは薬莢落下位置をランダムにします。スピーカーからのボリュームを調整して音がどちらの方向から聞こえてくるか変えることを「パンニング」といいます。
ライフルの薬莢の場合は、右方向に飛んでいくと仮定して、右寄りの位置でランダムにしてみます。

トラック「Shell」を選択した状態で、インスペクターのタブ「パン[5.1]の設定を変更します。

![ライフル６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/566f7e64-c57a-91c4-8709-e91df26b07c8.png)

「角度」スライダーをまず右に少し動かしてから縦方向に動かし、ランダム幅を設定します。
これで薬莢の落ちる位置感が毎回ランダムに変わるように鳴りました。

## ゲームへの実装
さて、これまでツール上で銃の音をリッチにする加工をしてきたのですが、ゲーム側への実装についてですが。。。
実は、何もする必要がありません。UnityやUnreal Engine、その他の開発環境に置いても、いま設定した「キュー」を再生するだけで各種パラメータが適用された状態で鳴ります。
もちろん、プロジェクトへのADX2 SDKの導入は必要ですが、複雑なスクリプティングをすること無く、こうしたリッチな演出を組み込むことができます。
WAVEやOggを単純に鳴らすよりもバリエーションが遥かに豊かになり、また細かい音素材を使い回すことで、データ量をへらすことにも活用できます。

銃の音に関してできることはまだまだありますが、まずは入り口として、パラメータのランダマイズをぜひ取り入れてもらえればと思います。