NativeAudioPluginをiOSプロジェクトで使えるようにするのに半年かかった

日本語記事が無かったのでメモ。

UnityのC#スクリプトでの音処理はやれることが限られているので、ネイティヴプラグインを自前で用意しそれらのコントロールC#で行ってね、というのがデファクト
色々難あれどunityで音響処理ができるだけありがたいしこれで音楽iPhoneアプリが手軽に作れたらと思ってた時期が俺にもありました。実際はチマチマ設定作業が必要。


以下の記事を参照

docs.unity3d.com

冒頭のダウンロードの節から落とせるSDKはサンプル付きでこれだけである程度のことはできる。
そして調子にのってiOS版をビルドしたらあれ音がでてなくね?となるので仕方なく上から読んでいく。
ヒントはいくつか載っているのだが日本語が壊滅的におかしいので「すべてのこれらのファイルは何だろう?」とか「含まれる他のシンプルなプラグイン」とか読んでてツラみを感じたら原文を読む。

https://forum.unity3d.com/threads/native-audio-plugin-bundle-import-settings-for-ios-build.315590/

フォーラムの記事。ここの中盤に書いてある内容で試したらなんとかworking on iOS as wellになった。

1. NativeAudioPluginのiOS向け静的ライブラリをつくる

最初にして最大の難関。「静的ライブラリ ios」でググって一番最初に出て来たやり方などを参照に作る。
Cocoa Touch Static Libraryを作るイメージでやっていけば問題なし。最初に作られるhとmファイルは捨てる。
次にSDK内のNativeCode直下のDemo以外のヘッダと実装をプロジェクトにコピペするのだが、
後々のビルドでspatial系がエラーを起こしうんこだったのでPlugin_SpatializerとPlugin_SpatializerReverbは除外、PluginList.hに書かれているDECLARE_EFFECTで該当しそうなところは削除した。
f:id:ovide:20170905170812p:plain
そしてこれをreleaseでビルド。できあがったaファイルはデフォルトだとへんぴなとこにある。
f:id:ovide:20170905170848p:plain
みんな大好きShow in finderで場所のアタリをつけておく。

2. Assets直下に"Plugins > iOS"のフォルダをつくり、その中にヘッダーファイルをぶちこむ

f:id:ovide:20170905170943p:plain
デフォルトでは作られないと思うので自分で作る。
iOSフォルダを作ったら、そこに先ほどの静的ライブラリビルドで用いたヘッダーファイル(今回は4種類あった)をイン。
f:id:ovide:20170905171126p:plain
ここら辺から何も考えてない。とりあえず4つぶちこみ終わったらFile>BuildSettingsからiOS向けにビルド。

3. Unityビルドで自動生成されたプロジェクトをXcodeで開いてaファイルをぶちこむ

まず、aファイルはsearch pathのスコープ内に収めたいので、生成されたプロジェクトのLibrariesなどに入れて置くとよいのだろう。なんか他のaファイルもここに入ってるし。
そして、そのaファイルをbuild phases>Link Binary with Librariesにドラッグアンドドロップする。

4. 生成されたコードを少しいじる

Classes>UnityAppController.h内に

 #import "AudioPluginInterface.h"

Classes>UnityAppController.mmの preStartUnity{} の中カッコを開いて以下を挿入

 UnityRegisterAudioPlugin(&UnityGetAudioEffectDefinitions);

これでクリーンビルド。MTLRoaderがどうちゃらエラーが出たら、iosビルドと関係なさそうな判定箇所は思い切って削除。