Version: 2020.1
iOS
iOS 用ゲームの開発について

Unity をネイティブ iOS アプリケーションに統合

このページでは、Unity Runtime Library をライブラリ機能としてネイティブの iOS アプリケーションに統合する方法を説明します。

この機能を使用して、3D/2D リアルタイムレンダリング、AR 体験、 3D モデルの相互作用、2D ミニゲームなどの Unity 搭載の機能をアプリケーションに組み込むことができます。Unity Runtime Library は、ネイティブのアプリケーション内でコンテンツをロード、アクティブ化、アンロードするタイミングと方法を管理するための制御へのアクセスを可能にします。

仕組み

iOS 用ライブラリとして Unity を使うには、いつものようにまず、Xcode プロジェクトを Unity でビルドします。詳しくは、iOS 用ビルド設定 を参照してください。

すべての Unity iOS Xcode プロジェクトは以下の構造 を持っています。

  • UnityFramework ターゲットのライブラリ部分。ソース 、プラグイン、依存フレームワークが含まれます。また、UnityFramework.framork ファイルも作成します。
  • Unity-iPhone の薄いランチャー部分。アプリケーションを示すデータを含み、ライブラリを実行します。Unity-iPhone ターゲットは、UnityFramework ターゲット上に 1 つの依存関係を持ちます。

Unity を別の Xcode プロジェクトに統合するには、両方の Xcode プロジェクト( ネイティブのものとUnityが生成するもの) を1つの Xcode ワークスペースに集め、 UnityFramework.framework ファイルをネイティブの Xcode プロジェクトの Application ターゲットの Embedded Binaries セクションに加える必要があります。これを行うと、UnityFramework クラスを使用して、Unity ランタイムを制御できます。

この リポジトリ には、Unity を Xcode プロジェクトに統合する方法を示すサンプルプロジェクトとプラグイン、詳しいドキュメントが含まれています。

UnityFramework クラス

UnityFramework.framework の主要クラスである UnityFramework Objective-C クラスのインスタンスを通して、Unity ランタイムを制御できます。

メソッド 説明
+ (UnityFramework*)getInstance; インスタンスを UnityFramework に返すシングルトンクラスのメソッドです。
- (UnityAppController*)appController; UIApplicationDelegateUnityAppController サブクラスを返します。これは、ネイティブ側のルートの Unity クラスであり、UIViewUIViewControllersCADisplayLinkDisplayConnection などのアプリケーションの表示関連オブジェクトにアクセスすることができます。
- (void)setDataBundleId:(const char*)bundleId; Unity ランタイムが Data フォルダーを探すバンドルを設定します。詳細については、Data フォルダー を参照してください。runUIApplicationMainWithArgcrunEmbeddedWithArgc を呼び出す前にこの方法を呼び出します。
- (void)runUIApplicationMainWithArgc:(int)argc argv:(char*[])argv; 他のビューがない場合に、main メソッドから Unity を実行するデフォルトの方法です。
- (void)runEmbeddedWithArgc:(int)argc argv:(char*[])argv appLaunchOpts:(NSDictionary*)appLaunchOpts; 他のビューが存在するときに Unity を実行する必要がある場合は、この方法を呼び出します。
- (void)unloadApplication; これを呼び出すと、Unity をアンロードし、それが完了した後に UnityFrameworkListener へのコールバックを受け取ります。Unity は維持しているメモリのほとんどを解放しますが、すべてをリリースするわけではありません。Unity を再度実行できます。
- (void)registerFrameworkListener:(id<UnityFrameworkListener>)obj; UnityFramework ライフサイクル関連イベントのコールバックを受け取るリスナーオブジェクトを登録します。
- (void)unregisterFrameworkListener:(id<UnityFrameworkListener>)obj; リスナーオブジェクトの登録を解除します。
- (void)showUnityWindow; Unity 以外のビューが表示されているときにこの方法を呼び出すと、すでに実行中の Unity ビューも表示されます。
- (void)pause:(bool)pause; Unity を一時停止します。
- (void)setExecuteHeader:(const MachHeader*)header; CrashReporter が正しく動作するためには、Unity を実行する前にこれを呼び出す必要があります。
- (void)sendMessageToGOWithName:(const char*)goName functionName:(const char*)name message:(const char*)msg; この方法は UnitySendMessage のプロキシです。名前でゲームオブジェクトを検索し、文字列 1 つのメッセージパラメーターで functionName を呼び出します。
(void)quitApplication:(int)exitCode; これを呼び出すと Unity を完全にアンロードし、Unity 終了時に UnityFrameworkListener へのコールバックを受け取ります。Unity はすべてのメモリを解放します。

ノート: この呼び出しの後、同じ手順で Unity を再度実行することはできません。AppControllerquitHandler を設定して、デフォルトの処理 kill をオーバーライドできます。

制限

Unityはランタイムのライフサイクルをコントロールするわけではないため、ライブラリとしてのUnityはすべての可能なユースケースで機能するわけではありません。既知の制限には以下が含まれます。

  • Unity はライブラリとしてフル画面レンダリングのみをサポートし、画面の一部でのレンダリングはサポートしていません。
  • Unity ランタイムの複数のインスタンスをロードすることはできません。
  • Unity ランタイムで動作するようにサードパーティのプラグイン (ネイティブマネージ の両方) を適応させる必要があるかもしれません。

  • iOS ライブラリとしてのUnity は 2019.3 で追加NewIn20193
iOS
iOS 用ゲームの開発について