# Unity를 네이티브 iOS 애플리케이션에 통합

> Integrate the Unity Runtime Library into iOS applications.

이 페이지에서는 Unity as a Library 기능을 사용하여 Unity 런타임 라이브러리를 iOS 기본 애플리케이션에 통합하는 방법을 설명합니다.

이 기능을 사용하여 3D/2D 실시간 렌더링, AR 경험, 3D 모델 상호 작용, 2D 미니 게임 등 Unity 기반 기능을 기본 애플리케이션에 포함할 수 있습니다. Unity 런타임 라이브러리는 컨트롤을 노출하여 기본 애플리케이션에 콘텐츠를 로드하고, 활성화하고, 언로드하는 시기와 방법을 관리합니다.

## 작동 방식##how-it-works

iOS용 Unity as a Library 기능을 사용하려면 먼저 일반적으로 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** 타겟에 대한 단일 종속성이 있습니다.

Unity를 다른 Xcode 프로젝트에 통합하려면 Xcode 프로젝트(네이티브 Xcode 프로젝트와 Unity에서 생성하는 Xcode 프로젝트 모두)를 단일 Xcode 작업 공간에 결합하고, `UnityFramework.framework` 파일을 네이티브 Xcode 프로젝트에 대한 **Application** 타겟의 **Embedded Binaries** 섹션에 추가해야 합니다. 이렇게 하면 `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;`                                           | 다른 뷰가 없는 메인 메서드에서 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;`                                                          | Unity를 실행하기 전에 이 메서드를 호출해야 CrashReporter가 제대로 동작합니다.                                                                                                                                                                                                  |
| `- (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)의 프록시입니다. 이름을 기준으로 게임 오브젝트를 찾고, 단일 문자열 메시지 파라미터를 사용하여 functionName을 호출합니다.                                                                 |
| `(void)quitApplication:(int)exitCode;`                                                                         | 이를 호출하여 Unity를 완전히 언로드하고 Unity가 종료되면 `UnityFrameworkListener`에 대한 콜백을 수신합니다. Unity가 모든 메모리를 해제합니다.**참고:** 이 호출 후 동일한 프로세스에서 Unity를 다시 실행할 수 없습니다. 기본 프로세스 종료를 오버라이드하도록 `AppController`의 `quitHandler`를 설정할 수 있습니다.                                    |

## 제한 사항##limitations

Unity는 런타임 라이프사이클을 제어하지 않으므로 Unity as a Library 기능이 일부 사례에서 작동하지 않을 수 있습니다. 알려진 제한 사항은 다음과 같습니다.

* 라이브러리로서의 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 as a Library를 사용하는 경우 [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)을 설정합니다.

***

*
