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. を使っている。

:warning: xcodeproj Gem のバージョンが古いと .pbxproj を XML 形式で上書きされてしまい、UnityEditor.iOS.PBXProject で読み込めなくなるので注意する

さらに、Unity からビルドした Xcode プロジェクトの場合、Runpath Search Paths も設定する必要があった。 Linker Error : Library not found · Issue #615 · Carthage/Carthage を見る限り、 古い Xcode で作ったプロジェクトだと同問題が発生するらしい。

これで、Xcode プロジェクトをビルドする度に、自動で設定が行われる :apple:

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 依存がなくなって嬉しいので応援している。

参考