iOS 플랫폼용 Unity 프로젝트를 빌드하는 경우 Unity는 Xcode 프로젝트가 포함된 폴더를 만듭니다. 이 프로젝트는 앱을 기기에 배포하기 전에 컴파일하고 서명하는 데 필요합니다. 또한 App Store에 게임을 배포할 수 있도록 게임을 준비하고 번들화할 때도 사용합니다. Xcode 프로젝트 구조는 Unity 2019.3부터 Unity as a Library를 통해 네이티브 iOS 애플리케이션으로의 Unity 통합을 지원하도록 변경되었습니다.
iOS용 프로젝트를 빌드하기 전에 iOS Player Settings** (메뉴: Edit > Project Settings > Player Settings)에서 Bundle Identifier를 설정해야 합니다. 또한 앱이 시뮬레이터 또는 실제 기기를 타게팅할지 여부도 선택할 수도 있습니다. 이렇게 하려면 SDK version** 필드를 변경하십시오.
모든 생성된 Unity iOS Xcode 프로젝트는 다음과 같은 구조와 타겟을 갖습니다.
Classes 폴더에는 Unity 런타임과 Objective-C를 통합하는 코드가 들어 있습니다. Unity는 애플리케이션의 엔트리 포인트를 이 폴더의 main.mm 및 UnityAppController.mm/h 파일에 저장합니다. UnityAppController에서 파생된 고유한 AppDelegate를 만들 수 있습니다. 또는 플러그인에 AppController.h 가 포함된 경우 대신에 UnityAppController.h 를 포함할 수 있습니다. Plugins/iOS 폴더에 AppController.mm/h 가 있으면 병합한 후 이름을 변경할 수 있습니다.
또한 InternalProfiler.h 파일은 컴파일러 조건을 정의하여 내부 프로파일러를 활성화합니다. 이 폴더의 코드는 대개 변경되지 않으며, 커스텀 클래스를 여기에 보관할 수 있습니다. Append 모드를 선택하면 Xcode는 이 폴더에 대한 변경 사항을 빌드 간에 보존합니다. 하지만 이 함수는 여러 빌드 타겟을 지원하지 않으며, 고정된 구조의 Libraries 폴더를 필요로 합니다.
Unity의 내부 프로파일러는 빠르고, 비간섭적이며, 다음과 같은 기본 정보를 제공합니다.
자세한 내용은 빌트인 프로파일러 문서를 참조하십시오.
이 폴더에는 애플리케이션의 직렬화된 에셋과 .NET 어셈블리(.dll 또는 .dat 파일)가 코드 스트리핑 설정에 따라 전체 코드 또는 메타데이터로 보관됩니다. machine.config 파일은 다양한 .NET 서비스(예: 보안, WebRequest)를 설정합니다. Xcode는 빌드마다 이 폴더의 콘텐츠를 새로 고칩니다. 이 폴더의 콘텐츠는 변경하지 않아야 합니다.
기본적으로 Data 폴더의 Target Membership은 Unity-iPhone 타겟이며, Unity 런타임은 mainBundle
에서 이를 검색합니다. Unity 런타임이 Data 폴더를 찾는 기본 번들을 변경하려면 run 함수 중 하나를 호출하기 전에 UnityFramework 인스턴스에서 setDataBundleId: "com.my.product"
를 호출하십시오. 예를 들어 UnityFramework 호출을 통해 Data 를 번들화하려면 setDataBundleId: "com.unity3d.framework"
를 사용하여 Target Membership을 UnityFramework로 설정하십시오.
참고: 온디맨드 리소스는 Data 폴더가 UnityFramework 타겟이 아니라 애플리케이션 타겟에 속해 있을 때에만 지원됩니다.
Libraries 폴더에는 IL2CPP용 libil2cpp.a 파일이 들어 있습니다. libiPhone-lib.a 파일은 Unity 런타임 정적 라이브러리이고, RegisterMonoModules.cpp 는 Unity 네이티브 코드를 .NET에 바인딩합니다. Xcode는 빌드마다 이 폴더의 콘텐츠를 새로 고칩니다. 이 폴더의 콘텐츠는 변경하지 않아야 합니다.
커스텀 파일을 여기에 보관할 수 있습니다.
아이콘과 스플래시 화면(.png 파일)은 Unity-iPhone 폴더의 에셋 카탈로그에 있습니다. Unity는 이 파일들을 자동으로 관리합니다. 실행 화면, XML 인터페이스 빌더(.xib 파일) 및 스토리보드 파일은 프로젝트의 루트 폴더에 보관됩니다. Unity에서 이를 설정하려면 Player Settings 창(메뉴: Edit > Project Settings > Player Settings)을 사용하십시오. 커스텀 실행 이미지를 만드는 경우 Apple 휴먼 인터페이스 가이드라인을 준수해야 합니다.
Unity의 Player Settings(메뉴: Edit > Project Settings > Player Settings로 이동한 후 Other 섹션을 선택하고 Identification 섹션으로 스크롤)를 사용하여 Unity-iPhone 타겟 내에 있는 /Info.plist 파일(mainBundle
을 통해 액세스)을 관리할 수 있습니다. 자세한 내용은 iOS 플레이어 설정 - 식별 문서를 참조하십시오. Unity는 플레이어를 빌드할 때 이 파일을 교체하지 않고 업데이트합니다. 필요한 경우를 제외하고 이 파일을 변경하지 마십시오.
/UnityFramework/Info.plist 파일(bundleWithIdentifier:@"com.unity3d.framework"
를 통해 액세스)은 UnityFramework의 일부입니다. mainBundle’s /Info.plist 파일 대신에 여기에 값을 보관하면, UnityFramework가 다른 애플리케이션으로 이동했을 때에도 이러한 값을 계속 가져올 수 있습니다.
여기에는 Xcode 프로젝트 파일(.xcodeproj file), 그리고 Project Navigator에서만 표시되는 프레임워크 링크가 포함됩니다.
커맨드 라인 인자를 사용하여 빌드 설정을 지정하면 모든 Xcode 프로젝트 타겟에 영향을 줍니다. 이런 문제를 방지하기 위해 일부 빌드 설정에는 접미사가 붙은 버전이 있습니다. 이 버전은 빌드 설정이 영향을 줄 타겟을 지정하는 데 사용됩니다. 이는 사용자 정의 설정(애플리케이션 타겟에 사용되는 *APP 접미사와 프레임워크 타겟에 사용되는 *FRAMEWORK 접미사)을 통해 구현할 수 있습니다.
xcodebuild를 사용하여 빌드할 경우 접미사가 붙은 버전을 다음에 사용하십시오.
PRODUCT_NAME -> PRODUCT_NAME_APP
PROVISIONING_PROFILE -> PROVISIONING_PROFILE_APP
PROVISIONING_PROFILE_SPECIFIER -> PROVISIONING_PROFILE_SPECIFIER_APP
OTHER_LDFLAGS -> OTHER_LDFLAGS_FRAMEWORK
커스텀 빌드 파이프라인에 따라 다른 설정을 포함하도록 이 리스트를 확장할 수 있습니다.
생성된 Xcode 프로젝트를 수정하려면 Xcode.PBXProject를 사용하십시오.
Unity 2019.3부터 PBXProject.GetUnityTargetName
와 pbxProject->TargetGuidByName("Unity-iPhone")
을 더 이상 사용하지 않습니다. 대신 pbxProject->GetUnityFrameworkTargetGuid()
, 또는 pbxProject->GetUnityMainTargetGuid()
를 사용하십시오.
// Obsolete
string targetGuid = proj.TargetGuidByName("Unity-iPhone");
string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());
// Instead call one of these
string targetGuid = proj.GetUnityFrameworkTargetGuid();
string targetGuid = proj.GetUnityMainTargetGuid();
패키지 또는 커스텀 빌드 포스트 프로세서에서 예전 코드 경로와 신규 코드 경로를 모두 지원해야 하는 경우 다음 절차를 따르십시오.
string mainTargetGuid;
string unityFrameworkTargetGuid;
var unityMainTargetGuidMethod = proj.GetType().GetMethod("GetUnityMainTargetGuid");
var unityFrameworkTargetGuidMethod = proj.GetType().GetMethod("GetUnityFrameworkTargetGuid");
if (unityMainTargetGuidMethod != null && unityFrameworkTargetGuidMethod != null)
{
mainTargetGuid = (string)unityMainTargetGuidMethod.Invoke(proj, null);
unityFrameworkTargetGuid = (string)unityFrameworkTargetGuidMethod.Invoke(proj, null);
}
else
{
mainTargetGuid = proj.TargetGuidByName ("Unity-iPhone");
unityFrameworkTargetGuid = mainTargetGuid;
}