Unity 5のサウンド機能をADX2 LEで強化する

# はじめに

本投稿では、ゲーム開発向けサウンドミドルウェア「ADX2 LE」の紹介と、プラグインの導入を紹介します。

**[2018/10/21追記]**
本投稿は古いバージョン向けの解説です。Unity 2018以降向けは次の投稿をご覧ください。
https://qiita.com/Takaaki_Ichijo/items/16e6501fc07f5b3b3377

### Unityにおけるサウンド事情

Unityでモバイルゲームを開発する際、サウンドの実装には以下の様なつまづきポイントがあります。

 * Android端末でサウンド再生の遅延が起きる
 * mp3やoggをたくさん鳴らすと処理が重い
 * アプリ容量の都合で、音質を落とさざるをえない
 * BGMのループ再生がきれいに繋がらない
 * フェード処理や音数の制御など、サウンド管理部分の開発が大変
 * サウンドデータが大量に存在し、取り回しが大変
 * ちょっとしたボリューム調整にもひと苦労

Unity標準のサウンドシステムはシンプルに音がさくっと鳴らせる反面、処理負荷の問題や、ゲーム的な演出を作りこんだり、大量データのハンドリングに弱いところがあります。

### 「ADX2 LE」を使おう
これらの問題は、「ADX2 LE」の導入で解決できます。
「ADX2 LE」は、ゲーム開発向けサウンドミドルウェア「ADX2」の無償バージョンです。

![LELOGO_256_w.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/096bd953-65e9-0cb8-20fb-7a44dae0f97d.jpeg)

個人アプリ開発者であれば、**無料・商用アプリ問わず**無償で使うことができます。（性能テストやプロトタイプ開発など、世にリリースしないアプリであれば法人利用もＯＫ）

「ADX2 LE」はUnity、Cocos2d-x、PC(Visual Studioでの開発用)に対応しています。
このエントリではUnityでのシンプルな使い方について紹介します。

###組込前の確認事項

~~UnityはFree版の機能制限に**ネイティブライブラリが動作しない**というものがあります。~~
~~「ADX2 LE」のコアはネイティブライブラリのため、動作にはProライセンスが必要です。~~

Unity 5から、無償版であるPersonalエディションでもネイティブライブラリが動作するようになり、**全てのUnityユーザーが「ADX2 LE」を使用できるようになりました！**素晴らしい！

ただし、webplayerビルドはProがあっても動作しません。(ブラウザでネイティブライブラリを動かす仕組みが無いため。）
これまでどおり、モバイル側はFreeのみで「ADX2 LE」が動作します。(iOS Pro, Android Proライセンスは必須ではありません。）

# 「ADX2 LE」の特徴
###任意のポイント（サンプル単位）でのループ再生が可能

![ギャップレスループ.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/d4e84fce-18db-498c-ab7c-5bb5baa88ee0.jpeg)

ギャップレスループ、イントロ付きループ再生が容易に設定できます。

###ゲーム専用の軽い音声コーデックを搭載
「HCA」という専用の圧縮コーデックが使用できます。
圧縮率はoggやmp3と同程度ですが、再生の負荷が比較的軽量です。
また、高圧縮時に高音域を復元するコーデック特性があり、女性の声の圧縮時に威力を発揮します。

Unityでは再生負荷の都合、効果音にはwavを使うことが多いそうですが
「HCA」を使えばすべてのサウンドを圧縮することができます。

また、「HCA-MX」という再生時のデコード処理の軽量化に特化したコーデックも使用できます。
アクションゲームなどでSEやボイスが大量になる際の処理負荷を大きく抑える技術です。

![HCAMX説明図.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/d87d63ab-a026-486e-faea-6e3ec49c7ae4.jpeg)

###Android専用　低遅延再生モード
Androidは再生リクエストをかけてから実際に音が出るまでのラグが大きく、タイミングが重要なアプリは作りづらい状況があります。
「ADX2 LE」は、低遅延再生モードという、なるべく早く鳴らすようにする仕組みを持っています。

## サウンド演出のコーディングをシンプルに

よくあるゲーム的なサウンドの演出は、「ADX2 LE」のライブラリ側に実装されています。
演出の設定は、スクリプトではなく音のデータ側に埋め込んでしまおう、というアプローチをとっています。
たとえば、

 * BGMのフェードイン・アウト
 * 効果音の同時再生数の制限
 * ピッチの変更、ランダム再生
 * エコーやディレイなどのフィルタ適用
 * ボイスが鳴ったら、BGMを自動的に下げる

などです。

# 「ADX2 LE」プラグインの導入
細かい設定は後回しに、まずは下記の基本機能だけを使用できるまでを紹介します。
・HCA、HCA-MXコーデックを使用する
・BGMのフェードイン・アウトを自動化する
・特定のSEに再生数上限を設定する

「ADX2 LE」の入手、「CRI Atom Craft」のセットアップ・音声データの作成手順については、[CRI Atom Craftで音声データを作成する](http://qiita.com/Takaaki_Ichijo/items/705f8d3447f7c869df9d)をご参照ください。

以下の手順は、このエントリのナレッジを前提にご紹介します。

#### プラグインのインポート
「ADX2 LE」SDK内の\unity\plugin\criware_unity_plugin.unitypackageをダブルクリックして、Unityのプロジェクトにインポートします。
メニューバーに"CRI"のメニューが増えます。

![criatomwindow.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/51c3322f-a32a-1f10-3b6e-c5983b33fa89.jpeg)

### 初期設定など

#### 必要なコンポーネントの生成
CRIメニューから"Create CRIWARE Library Initializer"、"Create CRIWARE Error Handler"をそれぞれクリックします。

![cricomponents.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/131ad95d-720a-76f3-55d5-a4b4bd3aade4.jpeg)

こうなります。

#### Unity側の設定
UnityのEdit→Project Settings→ AudioからAudioManagerを開いて、Inspector内の「Disable Audio」にチェックを入れます。
これで、Unityの標準オーディオ機能がオフになります。

#### Atom Craftで作成したデータの読み込み
[CRI Atom Craftで音声データを作成する](http://qiita.com/Takaaki_Ichijo/items/705f8d3447f7c869df9d)の手順に従って生成されたデータを読み込みます。

メニューの"CRI"から「Open CRI Atom Window」をクリックすると、ウィンドウ**「CRI Atom Window」**が表示されます。
まだ読み込みを行っていないので「CueSheetがないよ！」というエラーが出ています。

そこで、「Select Assets Root」をクリックして、Atom Craftから出力したデータの位置を指定します。

![SelectAssetFolder.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/9e81c34f-a8dc-e6d7-e0a1-0769a157f1cc.jpeg)

Atom Craftからビルドしたフォルダのうち、Publicフォルダ下の"Assets"を選択し、Update Asset of"CRI Atom Craft"をクリックします。

![LoadedCueSheet.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/17e6adc5-00f8-dff1-71dc-6ec1ec82f4a1.jpeg)

ビルドしたパックファイル内にある、キュー(Unityから呼び出す単位)の一覧が読み込まれました。

### とりあえず鳴らす
まずはサウンド１発再生用のオブジェクトを作ってみます。

![CreateGameObject.jpg](https://qiita-image-store.s3.amazonaws.com/0/19010/acc56f97-2e9d-cdad-7eeb-460da00b1954.jpeg)

CreateGameObjectをクリックすると、「キュー名(CriAtomSource)」というオブジェクトが生成されます。
つくられたオブジェクトを選択して、インスペクタ内の「Play On Start」にチェックを入れてから、エディタのPlayボタンを押すと、音が鳴ります。

# まずはここまで

ひとまずは、「ADX2 LE」でサウンドデータを生成して音が鳴るまで。
次回はサウンド管理用のスクリプトを作りつつ、クロスフェードの設定や、低負荷再生のHCA-MXの利用方法などを紹介します。