Unity iOS のネイティブプラグインを書くときに、OSS のライブラリを使いたいときがある。
ライブラリのソースを直接 Unity プロジェクトに取り込んでも良いが、どうせなら Carthage のようなパッケージマネージャを使いたい。
概要
- Unity からビルドした Xcode プロジェクトで…
- Carthage を使えるようにする
- Swift を使えるようにする
- 設定はスクリプトで自動的にできるようにする
- UnityEditor.iOS.PBXProject を使って Xcode プロジェクトを設定する
- Build Phases は、RubyGem の xcodeproj を使って設定する
環境
- Unity 5.3.4f1
- Xcode Version 7.3 (7D175)
- Carthage 0.15.2
- xcodeproj (1.0.0.beta.4)
基本的なこと
Unity からビルドした Xcode プロジェクトを設定する
Swift を使えるようにする
Xcode プロジェクトで Swift を使うフラグを立てる。
Assets/Editor/SwiftConfigurator.cs
Carthage を使う
通常の Xcode プロジェクトで Carthage を使うときの手順を再現する。
-
carthage update
コマンドを実行する
- Carthage がビルドした .framework を Xcode プロジェクトに追加する
- フレームワークへのパスを通す
- Build Phase に
carthage copy-frameworks
を設定する
Assets/Editor/CarthageConfigurator.cs
Assets/Editor/Carthage/Gemfile
Assets/Editor/Carthage/carthage_copy_frameworks.rb
手動で .framework をプロジェクトに追加 Drag & Drop するとき、
フレームワークがプロジェクトに追加されると同時に、Framework Search Paths が設定されるので、
スクリプトで同 Build Setting を設定している。
また、アプリ実行(Run)時に Library が見つからなくてクラッシュする問題を回避するために、
Build Phase に Run Script Phase を追加している。
詳しくは Carthage/README.md at master · Carthage/Carthage を参照する。
ただし、 UnityEditor.iOS.PBXProject だけでは Build Phase を設定できないので、
CocoaPods/Xcodeproj: Create and modify Xcode projects from Ruby. を使っている。
xcodeproj Gem のバージョンが古いと .pbxproj を XML 形式で上書きされてしまい、UnityEditor.iOS.PBXProject で読み込めなくなるので注意する
さらに、Unity からビルドした Xcode プロジェクトの場合、Runpath Search Paths も設定する必要があった。
Linker Error : Library not found · Issue #615 · Carthage/Carthage を見る限り、
古い Xcode で作ったプロジェクトだと同問題が発生するらしい。
これで、Xcode プロジェクトをビルドする度に、自動で設定が行われる
OSS のライブラリを使ってみる
試しに questbeat/QBImagePicker: A clone of UIImagePickerController with multiple selection support. を使ってみる。
いつもの iOS 開発のときと同じように Cartfile を書く。
Assets/Editor/Carthage/Cartfile
プラグインのコードでも、いつもの iOS 開発のときと同じように、Framework を #import
して使う。
QBImagePicker が Objective-C で書かれているので、Swift を使っていない。
Assets/Plugins/iOS/DDDImagePicker/DDDImagePickerPlugin.mm
Swift を使ったネイティブプラグインは、また別のポストで書いてみる。
ただし、Unity から叩くエントリポイントは C で書くので、Objective-C++ から一部 Swift を呼び出すという感じになるはず。
まとめ・感想
- Unity からビルドした Xcode プロジェクトで、Carthage を使えるようにした
- ついでに Swift も使えるようにした
- Swift の検証は、また別のポストで行う予定
- Xcode の設定はスクリプトで行い、Xcode プロジェクトビルドの度に自動で実行できるようにした
- Build Settings は UnityEditor.iOS.PBXProject を使って設定した
- Build Phases は、UnityEditor.iOS.PBXProject では設定できなかったので、RubyGem の xcodeproj を使って設定した
軽い興味で始めてみたら、結構大変だった。
UnityEditor.iOS.PBXProject で Embedded Binaries か Build Phases が設定できるようになると Gem 依存がなくなって嬉しいので応援している。
参考