Unityで使うマルチプラットフォーム対応PluginをRustで作るMacOSとiOS編
前回の記事
Unityで使うマルチプラットフォーム対応PluginをRustで作る
ではWindows+Androidをターゲットに設定して環境構築や動作確認をしました。
この記事では補足としてMacOSとiOSでも動くように追加で設定をします。
主な作業内容
主な作業内容はこのPRの通りです。
「思ったより変更点が少ないな…」と感じるとおり、主な作業内容はM1Mac上の環境構築や、後述するcargo lipo
を使ったライブラリビルドの話になります。
また、この記事で記述が省かれているところでハマりそうな場合、この記事が参考になりそうです。
let lots: fun = rust + unity;
開発環境
- M1 Mac(Ventura 13.2.1)
- Xcode 14.2
- (他AndroidStudioやUnityのバージョンは前の記事と同じです)
開発環境のセットアップ
Mac上でCLionのセットアップをします。
今回の僕の記事は対象をM1Macにしているので、Intel Macの方は適宜読み替える必要がある事に注意して下さい。
iOSの実機、iOSのシミュレータのツールチェインを追加
rustup target add aarch64-apple-ios x86_64-apple-ios
MacのUnityEditor向けにビルドするために同様に追加(Intelだけ、とかM1だけ、なら片方で良いです)
rustup target add x86_64-apple-darwin aarch64-apple-darwin
cargo-lipoを入れる
iOSのuniversal binaryを作る時や、Mac(及びMac Editor)向けのUnityPluginのbundleファイルを簡単に作るためにcargo-lipoをインストールします。
cargo install cargo-lipo
Cargo.tomlの変更
unity_rsgen_sampleのCargo.tomlに"staticlib"を追加します。(iOS向け)
crate-type = ["staticlib","cdylib","lib"]
同様に必要に応じてunity_rsgen_sample及びunity_rsgen_sample_cliのpackage targetを適宜追加して下さい(詳細は冒頭のPRを見てください)
MacOS向けライブラリビルド
ライブラリのディレクトリに移動して(IntelもM1もどちらのUnityEditorでも動かすなら)
普通のビルドをします。libunity_rsgen_sample.dylib というファイルが各アーキテクチャのtarget以下に生成されます。releaseビルドの必要がある場合は releaseフラグを付けて下さい。(例えばMacのUnityEditor上では動作確認だけして、メインターゲットはiOS、という場合はMacOS向けの生成はデバッグビルドの方が嬉しい事が多い気がします)
//intelならこう
cargo build --target x86_64-apple-darwin --package unity_rsgen_sample
//m1ならこっち
cargo build --target aarch64-apple-darwin --package unity_rsgen_sample
この生成された2個のdylibを組み合わせたbundleファイルをcargo-lipoを使って作ります。
unity_rsgen_sample.dylibではなくて接頭のlibがついてる のがポイントです!
lipo -create -output target/unity_rsgen_sample.bundle \
target/aarch64-apple-darwin/debug/libunity_rsgen_sample.dylib \
target/x86_64-apple-darwin/debug/libunity_rsgen_sample.dylib
出来上がったunity_rsgen_sample.bundleというファイルをUnityプロジェクトの
/Assets/Plugins/macOS/ 以下にコピーします。(UnityEditor上でMacのUnityEditor及びMac Standaloneでロードするように、設定を確認しましょう)
iOS向けライブラリビルド
iOSビルド時は
cargo lipo --release
をして、出来上がったlibunity_rsgen_sample.aファイルを同じように
/Assets/Plugins/iOS/ 以下にコピーします。
できた
こうしてWindows,MacOS,Android,iOS全てで動くUnity向けのRust製ネイティブプラグインが出来ました。
今後の課題としてはライブラリのファイルサイズ、特にiOSで使うstatic libraryのファイルサイズが容易に10MBを越えてしまう(四則演算だけなのに!!)というのを解決出来たら良いなと思っています。
実際に触ってみた感想として、C++で上記の全プラットフォームに対応したネイティブプラグインを書くより、ビルド環境が統一出来て嬉しいな…と思いました。
Discussion