UnityAudioからCRI ADX2に乗り換えて簡単にリッチな音響体験を作ろう！　Part1

# はじめに
この記事ではこれから3回に分けて実際にFPSのサンプルを改良しつつ、Unityのデフォルト機能を使って制作されたサウンドシステムをCRI ADX2で実装したものに差し替える方法を紹介しようと思います。今回はコンセプトの説明、CRI ADX2の紹介、サンプルプロジェクトの解説などをやっていこうと思います。

- 1.**コンセプト紹介・CRI ADX2チュートリアル編←ココ！**
- 2.サンプルプロジェクトのシステムをADX2で置き換えてみよう！編
- 3.ADX2を用いた便利表現紹介編

# 今回のコンセプト
ゲームを作る際に重要なもののひとつが音声です。最初はUnity標準の音響機能で事足りるような気がしていても、こだわる点が増えれば増えるほど手の届かない点や、一つの音響効果のために多くのプログラミングが必要になる点、場合によっては高い信号処理やIOの知識が必要となる点などが気になってくることもあるかもしれません。そこで便利なのがCRIWARE社が提供するCRI ADX2です。Qiitaなどに投稿されているADX2の紹介記事は「インタラクティブミュージックができる」といった高度な音楽リソースを前提にしたものが多いですが、実はADX2はちょっとした音響のこだわりをゲームに盛り込む際にも非常に有用なのです。本企画ではそんなADX2を、「実際のFPSにおける音響システムをADX2で置き換える」というシチュエーションを通して紹介してみようと思います。



# ゲームにおける「音声」の重要性について
人間が与えられる情報の8割は視覚によるものであるといわれています（注釈：諸説あり）。もちろんゲームにおいてもグラフィックは体験を左右するきわめて重要な要素の一つになっています。

では、ほかの感覚が不要であるかというとそうではなく、人間は他の感覚器官を用いて視覚では得られないような情報を得て、様々な活動に利用しています。これはゲームでも同様で、例えばレンダリングすることはできない環境の要素を音声で表現したり、壁の裏側や視界の外側で起こっている事象、インタラクションなどを感知したりすることができます。また、VRゲームやコントローラを前提としたゲームの中には多彩な強弱やパターンを持った振動を利用してゲーム内の様子を表現する、といったことを行っているコンテンツもあります。Nintendo Switchはこのハプティクス機能に力を入れており、HD振動と呼ばれる高性能なコントローラ振動機能を実装していました。

このような理由から、ゲームによる体験の質を向上させるためには、視覚以外の情報にも十分な注意を払う必要があります。現在五感のうち、一般に普及したディスプレイシステムを持つのは「視覚」「聴覚」の二つなので（もちろん嗅覚呈示デバイス、触覚呈示デバイス、味覚呈示デバイスも市場に出回ってはいたり、研究段階では存在していたりしますが、残念ながら現在では「普及」と呼ぶほどには至っていません。）、必然的に音声の占める重要性が大きくなります。

ここではそんな音声が持つ性質についていくつか考えてみることにしましょう。

## インタラクション性
ゲーム内で生じる音の多くはプレイヤーが起こしたアクションに伴います。例えばキャラクターを操作することでボタンを押すことでUIのセレクト音が鳴ったりします。インタラクションに伴う音声にはインタラクションの結果を表す役割も持っており、例えば実行不可能なUIが選択された場合はビープ音を鳴らす、といった風に選択が失敗したことをプレイヤー側に通知することができます。逆に言えばプレイヤーは音を以て操作が正常に行われたことやインタラクションの結果を確認するので、インタラクションに応じて適切な音を鳴らすことが重要であると考えられます。

## ランダム性
世界の多くのものは多かれ少なかれランダム性を持っています。例えば銃から弾丸を発射するプロセスにおいて、「火薬を燃焼させ、そのエネルギーを用いて弾丸を飛翔させる」、という一般的な特性があるためその音は「バン！」という爆発音になりますが、火薬の量、爆発のタイミングなどには一定のばらつきが存在するためその音の詳細は一定にはなりません。これらのレンダリングされないような内部特性を考えたランダム性を与えると音がよりリアルに感じられます。また、同じ「銃から弾丸を発射する」という動作でも、マガジンに残った弾の数などによっては音が変化するかもしれません。


## 環境からの作用
音は光同様外部の環境からの影響を受けます。光は太陽のような直接光が壁によって遮られ、その逆側に影が出来たり、直接光が壁に反射し、さらにその反射光が別の壁を照らす、といったように、我々の目に届く前に様々な周辺環境の影響を受けます。それと同様に音声に関しても閉所なら音が何重にも反射してくぐもった感じになる、反射によって壁を迂回した音は小さく聞こえる、などの環境による影響があるでしょう。

![Reverb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/37ffa0c3-0d92-9bf9-23a8-f8a457a7cb57.png)



# 音声周りの制御、共有の難しさ
通常、音響周りの制御には「音響」と呼ばれるものが周囲環境の多くの要素やプレイヤーの挙動に大きく依存するため、Unity上の多くのパラメータを考慮したたくさんのプログラミングが必要となります。銃の音にランダム性を持たせるといったことを実装するために、例えば`UnityEngine.Random.Range()`を用いる、といったことが必要となるでしょう。また、キャラクターの挙動に応じて再生するBGMをインタラクティブに変更する、といったシステムを作りたいと考えた場合Unity上で入力を受け音響システム側でイベントを発火する、次の拍まで待ってから再生、といった実装をする必要が出てきます。

ここでゲーム制作のチーム内で、プログラミングを行う人と音響周りの制作を行う人が異なる例を考えてみます。音響周りの人がこの銃の音のランダム性に重みをつけたいと考えるような場合、上のような実装をしてしまっているとサウンドデザイナー側がC#Scriptを直接編集する必要が出てしまう場合があります。もしそれらの確率などのパラメータを`[SerializeField]`などを用いて外出ししていたとしても、結局ある程度は音響担当の人にUnity操作の学習を強いる必要が出てきてしまいます。また、BGMの変化における「次の拍を待つ」といったシステムに関しても、音楽のジャンルやBPMに合わせてパラメータの再設定などを行う必要が出てきてしまいます。音響担当の人とUnity上でのエンジニアリングを担当する人の間で生じる様々な面倒ごとに気を取られて肝心のゲームのクオリティが落ちてしまうことを避けるためにはもっと音響制作とUnityエンジン上での開発を独立させて、その間をうまく取り持ってくれるようなシステムが存在しているとよさそうです。

この「間をうまく取り持ってくれるシステム」がCRIWAREが提供するミドルウェア、CRI ADX2です。

![Separation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/4c2f30d1-64b5-a25b-e84e-36998476c6bd.png)


# CRI ADX2について

CRI ADX2はCRIWARE社が提供する統合型サウンドミドルウェアで、音響に関する制御・デザイン作業をUnity側から分離し、音響の設計に特化したGUIエディタ上で取り扱えるようにしたり、Unityから送信されるシグナルを受けてサウンドをADX2上で設定したパラメータに基づいて再生するといった仕組みを提供するシステムです。CRI ADX2は主に企業向けのミドルウェアですが、CRI ADX2 LEと呼ばれるインディーゲーム開発者/小規模なチーム向けのバージョンが存在し、インディーズを含む小規模な開発チームでも高品質なサウンドミドルウェアを用いたゲームの開発を行うことができます。今回は多くの人がサンプルを触れるように、ADX2 LEバージョンを触っていこうと思います。


#Unity AudioとCRI ADX2の違いって？
Unity AudioがUnity内での音響制御をUnity内で完結させることを重視したツールであるとするならば、CRI ADX2はゲームロジックを実装するUnity側から音響制御の役割を分離することによってサウンドクリエイターの幅広い要望に応えられるようにしたツールであるといえます。下の画像はUnityのAudioSourceとADX2の再生用Componentを比較したものです。

**↓AudioSource**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/737a8384-0ab2-1c8c-d16f-d38d65b502af.png)
**↓ADX2の再生用Component**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/23877168-a02d-60ed-b398-6fa6d96c5ff1.png)


一見UnityのAudioSourceの方がADX2よりも多彩な設定ができるように見えますが、ADX2では音響に関するパラメータの編集などを全てADX2側で用意されたAtom Craftと呼ばれるGUIツールで行います。このAtom CraftはUnityとは独立したツールなので、覚える必要の操作の数は増えますがUnity Audioをはるかに上回る自由度、簡潔さで音響の制御を行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/0237e414-ee02-bc06-464c-2db841ebb0b7.png)


# CRI ADX2 LEのインストール
まずはCRI ADX2 LEをインストールします。
 https://game.criware.jp/products/adx2-le/ にアクセスしてCRI ADX2 LEをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/2a61db4f-a462-7491-877d-bdeab4bb579c.png)

ここからUnity用のSDKとツールをインストールします。zipファイルのダウンロードが終わったら、好きな場所でこれらを解凍します。
解凍した後のファイルを見てみると以下のようになっていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/8b4e6df4-328a-80d9-1850-c63901b9db1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/7e6d25d1-2cc8-d074-20da-f848b12ba21d.png)

# AtomCraftの起動
次はサウンドクリエイター側が用いるUIエディタを起動してみましょう。
解凍したフォルダの`tools/ADX2LE/ver.3/`に入っている`CriAtomCraft.exe`を開いてみると、次のような画面が出てくると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/3ba962e0-d418-8ed7-0f0f-ac9a72866dc8.png)
初回はライセンス登録が必要になると思います。「新規作成」を押してみましょう。以下のような画面が出てくるので適当な名前を入れてプロジェクトを作成してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/7215e7ed-eaa0-5623-85c3-a762ca4904b8.png)


すると次のようなウィンドウが出てきました。今後サウンドクリエイターの側はこのUIを用いて音声の制御を行っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/12e2c21a-2eb7-ea76-0ab4-98717557f3c5.png)


# CRI ADX2 UnitySDKの導入
次にCRI ADX2とUnityを連携させるためのSDKをUnity側に導入していきます。展開したSDKフォルダの中、`unity/plugin/`の中にある`with_asmdef/criware_unity_plugin_le_ja.unitypackage`をUnityのプロジェクトに導入してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/2e99729f-58bc-df3f-c047-26873bf9f064.png)


なお、上述のファイルはUnityのAssemblyDefinitionに対応したバージョンのSDKとなっています。もし何らかの事情でAssemblyDefinitionを用いたくない、といった場合は`unity/plugin/`直下の`criware_unity_plugin_le_ja.unitypackage`を利用しましょう。

# 試しに使ってみる
試しにCRI ADX2を用いて再生システムを作って、Unity側で鳴らすチュートリアルをやってみます。
### CRI ADX2 Atom Craftに音源を登録する
wavファイルをマテリアルツリーにドラッグアンドドロップします。素材はプロジェクトに紐づけられ、キューシートで使えるようになります。
マテリアルツリー内にはディレクトリも作ることができるのでデータの種類ごとに分類して音源を管理することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/b64a93cd-f698-8ebf-7d1d-87ec909d7813.png)
すると音源はキューシートに登録されます。キューシート直下にある丸い
### 音源をキューシートに登録する
ワークユニットツリー上にキューシートを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/660bb639-a9f8-4c8a-3614-d49b440e21df.png)
Unity上で再生するのは、このキューシートをUnity向けのフォーマットに書き出したものとなります。それでは、先ほど登録した音源をキューシートにドラッグアンドドロップしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/3d0fdb1c-1bd0-d94b-31d8-42980091accf.png)
音源と同じ名前で、丸いアイコンの「キュー」が生成されるので、それをクリックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/fb612dd3-0305-e319-30a1-fcc8baedc514.png)
タイムラインが表示されました。先ほど登録したwavファイルの波形が見えます。この「キュー」がUnityで再生する音の１単位となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/4ca2b909-60d5-c6e2-27ec-3f23cb87dec6.png)
上部バーにある再生ボタンを押してみましょう。登録した音源がなるはずです。これで音源をAtomCraft上で編集する準備が出来ました。
### キューシートをUnity向けにエクスポートする
ここでは、特に編集などせずに生成したキューをUnity側で使えるようにしてみましょう。
Atom Craftで生成したキューをUnitySDK経由で使えるようにするためには、一旦キューシートごとUnity向けのフォーマットでエクスポートする必要があります。作成したキューシートを右クリックして、Atomキューシートバイナリのビルドをクリックします。ビルドに関する設定ウィンドウが出てくるので、Unity向けAssetsフォルダを出力にチェックを入れてビルドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/52ca3eea-f0c7-67d6-8358-b1ed17e790f0.png)

ビルド完了を示すウィンドウから出力先のフォルダを開くことができます。生成されたAssetのPathはUnity側で使うので把握しておいてください。

### キューシートをUnity側に読みこむ
では、先ほどビルドしたキューシートをUnity側で読みこんで、再生してみましょう。ADX2のUnitySDKが正常にインポートされていれば、
Window/CRIWARE/AtomBrowserからAtomBrowserウィンドウを開くことができます。AtomBrowserにはキューシートを探索するためのパスを指定する入力欄があるので、そこに先ほどビルドしたAssets内にあるStreamingAssetsを指定します。Reload Infoボタンを押し、先ほど登録したキューシート内に存在するキューが表示されれば読み込みは成功です。試しにCueNameの左にある再生ボタンを押すと、AtomCraftで作成した音声が再生されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/10709d8f-596c-f160-210e-82f45de8eed3.png)



### Unity側で音声を再生する

上の手順で登録したキューをゲーム内で再生してみましょう。AtomBrowser内にあるCreateGameObjectボタンやAddComponentボタンを押すと、下のようなコンポーネントが作成されます。これが従来のAudioSourceの代わりになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/edfb6d48-bb41-7bd2-01ac-93e1a58d9d5d.png)
Play On Startにチェックを入れてプレイモードに入ると、指定したキューシート名、キュー名を持つ音源が再生されます。これで、Atom Craft経由で音源を再生することが出来ました。スクリプトから再生するには以下のようなコマンドになります。`AudioSource`コンポーネントの`PlayOneShot(AudioClip clip)`と同じような感じですが、AudioClipに相当するのは事前にAtom Craftで設定したキューとなります。

```C#
public class Test : MonoBehaviour
{
    [SerializeField] private CriAtomSource source;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //キューIDかキュー名、どっちでも再生可能
            source.Play(0);
        }
    }
}
```

ADX2のキューはAudioClipよりも多くの情報を持っていて、もっと複雑なことが可能なシステムです。次回からはこのADX2とUnityの連携を生かして様々な機能を実装してみようと思います。


# サンプルプロジェクト


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/4412d85e-04ef-1834-75df-ee8aee72ad1d.png)



環境と音声の関係性を説明するために、次のような簡単なFPS風の射的ゲームのプロジェクトを用意しました。音声を除くすべては本記事のために作成したものであるため、再利用、再配布を行っても問題ありません。音声はTsugi-Studioの開発する DSPシリーズにて開発しています。


次回からこのプロジェクトを用いて開発を進めるので、[こちら](https://github.com/Hirai0827/ADX2FPSSample/tree/implement-with-unity-audio)からプロジェクトをダウンロードしておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/cad90987-98e0-224c-718c-fae7570eb391.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256231/83594bd2-f2c7-1b76-5005-af54b89fc9b8.png)


# まとめ
今回は導入がほとんどになっていましたが、次回からはこれをCRI ADX2を用いた実装に書き換えてサウンドクリエイターとの共同作業を行いやすい環境を作っていこうと思います。