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

> Integrate the Unity Runtime Library into iOS applications.

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

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

## しくみ##how-it-works

Unity を iOS のライブラリとして使用するには、通常どおりに最初に Unity から Xcode プロジェクトをビルドします。詳細は、[iOS アプリケーションのビルド](/engine/6000.0/manual/platform-specific/iphone/ios-building-and-delivering/build-process.md) を参照してください。

すべての Unity iOS Xcode プロジェクトは以下の [構造](/engine/6000.0/manual/platform-specific/iphone/ios-introducing/structure-of-xcode-project.md) を持っています。

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

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

この [リポジトリ](https://github.com/Unity-Technologies/uaal-example/blob/master/docs/ios.md) には、Unity を Xcode プロジェクトに統合する方法を示すサンプルプロジェクトとプラグインや、詳しいドキュメントがあります。

## UnityFramework クラス##unityframework-class

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

| **方法**                                                                                                         | **説明**                                                                                                                                                                                                                                                   |
| -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `+ (UnityFramework*)getInstance;`                                                                              | インスタンスを `UnityFramework` に返すシングルトンクラスのメソッド。                                                                                                                                                                                                              |
| `- (UnityAppController*)appController;`                                                                        | `UIApplicationDelegate` の `UnityAppController` サブクラスを返します。これは、ネイティブ側のルートの Unity クラスであり、`UIView`、`UIViewControllers`、`CADisplayLink`、`DisplayConnection` など、アプリケーションのビュー関連オブジェクトにアクセスできます。                                                                |
| `- (void)setDataBundleId:(const char*)bundleId;`                                                               | Unity ランタイムが *Data* フォルダーを探すバンドルを設定します。詳細は、[Data フォルダー](/engine/6000.0/manual/platform-specific/iphone/ios-introducing/structure-of-xcode-project.md) に関するドキュメントを参照してください。`runUIApplicationMainWithArgc` または `runEmbeddedWithArgc` を呼び出す前にこのメソッドを呼び出します。 |
| `- (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](/engine/6000.0/manual/platform-specific/iphone/ios-developing/plugins-for-ios.md) のプロキシです。名前でゲームオブジェクトを検索し、文字列 1 つのメッセージパラメーターで functionName を呼び出します。                                                                         |
| `(void)quitApplication:(int)exitCode;`                                                                         | これを呼び出して Unity を完全にアンロードし、Unity 終了時に `UnityFrameworkListener` へのコールバックを受け取ります。Unity はすべてのメモリを解放します。**注意**この呼び出しの後には、同じプロセスで Unity を再度実行することはできません。`AppController` に `quitHandler` を設定して、デフォルトのプロセス kill をオーバーライドできます。                                    |

## 制限##limitations

Unity はランタイムのライフサイクルを制御しないため、ライブラリとしての Unity は、考え得るあらゆるユースケースに有効であるとは限りません。以下のような既知の制限があります。

* Unity はライブラリとしてフル画面レンダリングのみをサポートし、画面の一部でのレンダリングはサポートしていません。

* Unity ランタイムの複数のインスタンスをロードすることはできません。

* サードパーティのプラグイン ([ネイティブ](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/native.md) と [マネージ](/engine/6000.0/manual/scripting/compilation-and-code-reload/plug-ins/managed.md) の両方) が Unity ランタイムで動作するように、調整が必要な場合があります。

* ネイティブ iOS アプリケーションで Unity をライブラリとして使用する場合に、[iOS Player 設定](/engine/6000.0/manual/platform-specific/iphone/getting-started/class-player-settings-ios.md#Status) でデバイスのステータスバーの可視性を調整することはできません。その目的には、以下のいずれかのオプションを使用することを検討してください。

  * プロジェクトの info.plist ファイルで、[`UIStatusBarHidden`](https://developer.apple.com/documentation/bundleresources/information_property_list/uistatusbarhidden?language=objc) または [`UIViewControllerBasedStatusBarAppearance`](https://developer.apple.com/documentation/bundleresources/information_property_list/uiviewcontrollerbasedstatusbarappearance?language=objc) キーを設定します。
  * ビューコントローラーのプロパティ [`prefersStatusBarHidden`](https://developer.apple.com/documentation/swiftui/uihostingcontroller/prefersstatusbarhidden/) を設定し、[`setNeedsStatusBarAppearanceUpdate`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621354-setneedsstatusbarappearanceupdat?language=objc) メソッドを呼び出します。
  * ビューコントローラーのプロパティ [`childViewControllerForStatusBarHidden`](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621451-childviewcontrollerforstatusbarh?language=objc) を設定します。

***

*
