🤖

Unityで使うマルチプラットフォーム対応PluginをRustで作るMacOSとiOS編

2023/07/16に公開

前回の記事

Unityで使うマルチプラットフォーム対応PluginをRustで作る
https://zenn.dev/izm/articles/f900ba5671d722

ではWindows+Androidをターゲットに設定して環境構築や動作確認をしました。
この記事では補足としてMacOSとiOSでも動くように追加で設定をします。

主な作業内容

主な作業内容はこのPRの通りです。
「思ったより変更点が少ないな…」と感じるとおり、主な作業内容はM1Mac上の環境構築や、後述するcargo lipoを使ったライブラリビルドの話になります。

https://github.com/neon-izm/rust-sandbox/pull/4

また、この記事で記述が省かれているところでハマりそうな場合、この記事が参考になりそうです。

let lots: fun = rust + unity;
https://rjgameiro.medium.com/let-fun-rust-unity-f7f62609ba49

開発環境

  • 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