この記事は クラスター Advent Calendar 2021 16日目の記事です。
昨日は@194_alertさんの「ワールド紹介動画の撮影について」でした。
こんにちは。ソフトウェアエンジニアのizumiです。
クラスター社ではiOSとかUnityとか色々やっています。
今回は表題の通りUnityネイティブプラグインのM1 Mac対応についてのお話しです。
Unityネイティブプラグインとは
ネイティブプラグイン とは、C、C++、Objective-C、Javaなどで書かれたWindows、Mac、iOS、AndroidなどのプラットフォームのネイティブコードをライブラリとしてUnity側のC#から呼び出す仕組みです。
この仕組みによって、Unityには提供されていないネイティブの処理やデバイス依存の処理などを実装することができます。
メタバースプラットフォーム clusterは、Windows、MacOS、iOS、Android、Oculus Quest2のマルチプラットフォーム対応アプリケーションで、オーディオ処理などでネイティブプラグインを活用しています。
しかしながら、M1 Macでは主にこのネイティブプラグインが原因で正常動作ができず、開発機もIntel MacやWindowsを用いるようにしていました。
※M1 Macユーザー向けにはiOS版の利用を推奨していました1
(これは余談ですが、M1 MacではUnity Editorで実行した瞬間にUnityがクラッシュしてしまっていたため、原因の特定や調査が困難でした。)
M1 Mac対応
2021年10月のAppleのオンラインイベントでM1 Pro/M1 Max搭載の新型MacBook Pro発表と同時にIntel製のMacBook Proは販売を終了してしまいました。2
このままではMacBook Proでの開発が継続して行えなくなってしまうため、M1 Mac対応を行いました。
MacOS向けのネイティブプラグインはbundle形式で生成し、Xcodeを使ってbuildします。
M1 Macに対応するにはBuild Settingsで以下の設定をします。
- ArchitecturesをStandard Architectures (Apple Silicon, Intel)する
- Excluded Architecturesを空にする(x86_64/arm64が入ってなければ大丈夫だとは思います)
また、Build Active Architecture Onlyの設定の通りDebug実行時には対象のアーキテクチャのみしかビルドされないため、ネイティブプラグインとして出力する場合にはConfigurationをReleaseにしてビルドする必要があります。
Static Libraryの対応
基本的には上記設定でM1 Mac/Intel Mac共に動くBundleができるのですが、厄介なのがXcodeを介さずに書かれたStatic Libraryを参照しているケースで、参照しているライブラリについてもM1 Mac対応をする必要があります。
clusterではC++向けのライブラリなどを手元でbuildして利用しているケースがあるため、この手順が必要でした。
この場合、M1環境とIntel環境(Rosseta)それぞれでライブラリを作成し、lipoコマンドを用いてUniversal Static Libraryにすることで解決します。
lipo -create libintel.a libarm.a -output libuniversal.a
正しく生成できた場合は、lipo -infoで下記のようにx86_64とarm64の両方が対応されたことが分かります。
lipo -info libuniversal.a
# Architectures in the fat file: libuniversal.a are: x86_64 arm64
この対応をした後にもう一度Xcodeでbundleを生成してIntel/M1両対応のネイティブプラグインの完成です🎉
おわりに
ネイティブプラグインをM1 Macに対応したことで今後も安心してMacBook Proを使って行けるようになりました。
これにより会社の支給マシンもM1 Max/RAM64GBの特盛マシンになりました!!
エンジニア絶賛募集中ですので、M1 Max使って仕事したい人は是非来てください!3
以上。
明日は@Hashimoto_Mamiさんの「なんか書きます」です。
-
詳細なスペックは面談等で聞いてください ↩