Unity의 Platform Dependent Compilation 기능은 지원되는 플랫폼 중 하나를 위해 작성된 코드 섹션을 컴파일 및 실행할 수 있게 하고, 스크립트를 파티션화할 수 있는 전처리 명령으로 구성됩니다.
코드를 Unity 에디터에서 실행할 수 있기 때문에 타겟 플랫폼에 필요한 코드를 컴파일하고 에디터에서 테스트할 수 있습니다.
Unity가 스크립트를 지원하는 플랫폼 #define 지시어는 다음과 같습니다.
Define | 기능 |
---|---|
UNITY_EDITOR | 게임 코드에서 Unity 에디터 스크립트를 호출하는 #define 지시어 |
UNITY_EDITOR_WIN | Windows에서의 에디터 코드용 #define 지시어 |
UNITY_EDITOR_OSX | Mac OS X에서의 에디터 코드용 #define 지시어 |
UNITY_EDITOR_LINUX | Linux에서의 에디터 코드용 #define 지시어 |
UNITY_STANDALONE_OSX | (Universal 아키텍처, PPC 아키텍처와 Intel 아키텍처를 포함한) Mac OS X 전용 컴파일링/실행 코드용 #define 지시어 |
UNITY_STANDALONE_WIN | Windows 스탠드얼론 애플리케이션 전용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_STANDALONE_LINUX | Linux 스탠드얼론 애플리케이션 전용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_STANDALONE | 스탠드얼론 플랫폼(Mac OS X, Windows 또는 Linux) 전용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_WII | Wii 콘솔용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_IOS | iOS 플랫폼용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_IPHONE | 권장하지 않음. 대신 UNITY_IOS 를 사용해야 합니다. |
UNITY_ANDROID | Android 플랫폼을 위한 #define 지시어 |
UNITY_PS4 | PlayStation 4 실행 코드를 위한 #define 지시어 |
UNITY_XBOXONE | Xbox One 실행 코드를 위한 #define 지시어 |
UNITY_LUMIN | Magic Leap OS 플랫폼용 #define 지시어. PLATFORM_LUMIN 도 사용할 수 있습니다. |
UNITY_TIZEN | Tizen 플랫폼을 위한 #define 지시어 |
UNITY_TVOS | Apple TV 플랫폼을 위한 #define 지시어 |
UNITY_WSA | 유니버설 Windows 플랫폼을 위한 #define 지시어. C# 파일을 .NET Core에 컴파일링하고 .NET 스크립팅 백엔드를 사용할 때 NETFX_CORE 가 정의됩니다. |
UNITY_WSA_10_0 | 유니버설 Windows 플랫폼을 위한 #define 지시어. C# 파일을 .NET Core에 컴파일링할 때 WINDOWS_UWP 가 정의됩니다. |
UNITY_WINRT | UNITY_WSA 와 동일함 |
UNITY_WINRT_10_0 | UNITY_WSA_10_0 와 동등함 |
UNITY_WEBGL | WebGL을 위한 #define 지시어 |
UNITY_FACEBOOK | Facebook 플랫폼을 위한 #define 지시어(WebGL 또는 Windows 스탠드얼론) |
UNITY_FACEBOOK | Facebook 플랫폼을 위한 #define 지시어(WebGL 또는 Windows 스탠드얼론) |
UNITY_ADS | 게임 코드에서 Unity Ads 메서드를 호출하기 위한 #define 지시어. 버전 5.2와 그 이상의 버전에 해당합니다. |
UNITY_ANALYTICS | 게임 코드에서 Unity 애널리틱스 메서드를 호출하기 위한 #define 지시어. 버전 5.2와 그 이상의 버전에 해당합니다. |
UNITY_ASSERTIONS | 행사 컨트롤 프로세스를 위한 #define 지시어 |
UNITY_64 | 64비트 플랫폼을 위한 #define 지시어 |
코드를 선택적으로 컴파일할 수도 있습니다. 이용 가능한 옵션은 사용하는 에디터 버전에 따라 다릅니다. 버전 X.Y.Z 에 따라(예를 들어, 버전 2.6.0) Unity는 세 개의 전역 #define 지시어를 UNITY_X, UNITY_X_Y 및 UNITY_X_Y_Z 포맷으로 표시합니다.
Unity 5.0.1에서 나타나는 #define 지시어 예시입니다.
Define | 기능 |
---|---|
UNITY_5 | 모든 5.X.Y 릴리스에서 나타나는 Unity 5의 릴리스 버전에 해당하는 #define 지시어입니다. |
UNITY_5_0 | 모든 5.0.Z 릴리스에서 나타나는 Unity 5.0의 주요 버전에 해당하는 #define 지시어입니다. |
UNITY_5_0_1 | Unity 5.0.1의 부 버전에 해당하는 #define 지시어입니다. |
Unity 5.3.4에서부터 Unity의 이전 버전을 기반으로 하여 코드를 선택적으로 컴파일하여 코드의 주어진 포션을 컴파일하거나 실행할 수 있습니다. 위와 동일한 버전의 포맷(X.Y.Z)일 경우 Unity는 이 목적으로 사용될 수 있는 포맷 UNITY_X_Y_OR_NEWER 에 하나의 글로벌 #define을 나타냅니다.
지원되는 #define 지시어는 다음과 같습니다.
Define | 기능 |
---|---|
CSHARP_7_3_OR_NEWER | C# 7.3 이상 지원하는 스크립트를 빌드할 때의 정의입니다. |
ENABLE_MONO | Mono를 위한 스크립팅 백엔드 #define입니다. |
ENABLE_IL2CPP | IL2CPP를 위한 스크립팅 백엔드 #define입니다. |
NET_2_0 | Mono 및 IL2CPP에서 .NET 2.0 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
NET_2_0_SUBSET | Mono와 IL2CPP에서 .NET 2.0 Subset API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
NET_LEGACY | Mono와 IL2CPP에서 .NET 2.0 또는 .NET 2.0 Subset API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
NET_4_6 | Mono 및 IL2CPP에서 .NET 4.x API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
NET_STANDARD_2_0 | Mono 및 IL2CPP에서 .NET 스탠다드 2.0 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
ENABLE_WINMD_SUPPORT | Windows Runtime 지원이 IL2CPP에서 활성화될 때의 정의입니다. 자세한 내용은 Windows Runtime 지원을 참조하십시오. |
ENABLE_INPUT_SYSTEM | 플레이어 설정에 입력 시스템 패키지가 활성화되었을 때 정의됩니다. |
ENABLE_LEGACY_INPUT_MANAGER | 플레이어 설정에 레거시 입력 관리자가 활성화되었을 때 정의됩니다. |
DEVELOPMENT_BUILD #define을 사용하여 스크립트가 “개발용 빌드” 옵션이 활성화될 때 빌드된 플레이어에서 재생되고 있는지 확인할 수 있습니다.
스크립팅 백엔드에 따라 코드를 선택적으로 컴파일할 수 있습니다.
아래는 프리컴파일된 코드를 사용하는 방식에 관한 예시입니다. 타겟 빌드로 선택한 플랫폼에 따라 메시지를 출력합니다.
먼저 File > Build Settings 로 이동한 다음, 테스트하고 싶은 코드의 플랫폼을 선택합니다. Build Settings 창이 보여지면 타겟 플랫폼을 선택할 수 있습니다.
프리컴파일된 코드를 테스트하고자 하는 플랫폼을 선택하고 Switch Platform 을 클릭해 Unity에 어떤 플랫폼을 대상으로 하는지 알립니다.
스크립트를 생성한 후 다음의 코드를 복사/붙여넣기합니다.
// C#
using UnityEngine;
using System.Collections;
public class PlatformDefines : MonoBehaviour {
void Start () {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IOS
Debug.Log("Iphone");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif
}
}
코드를 테스트하려면 Play Mode 를 선택합니다. Unity 콘솔에 있는 메시지가 선택한 플랫폼에 적절히 나타나는지 확인하여 코드 작동을 확인하기 바랍니다. 예를 들어, iOS 를 선택할 경우 “Iphone” 메시지가 콘솔에 나타나도록 설정됩니다.
C#의 경우 함수를 제거할 때, 더 깔끔하고 오류가 적게 나는 CONDITIONAL
속성을 사용할 수 있습니다. 자세한 내용은 ConditionalAttribute Class를 참조하십시오.
Note that common Unity callbacks (ex. Start(), Update(), LateUpdate(), FixedUpdate(), Awake()) are not affected by this attribute because they are called directly from the engine and, for performance reasons, it does not take them into account.
기본적인 #if
컴파일러 명령뿐 아니라 C#에서 다양한 테스트를 사용할 수 있습니다.
# if UNITY_EDITOR
Debug.Log("Unity Editor");
# elif UNITY_IOS
Debug.Log("Unity iPhone");
# else
Debug.Log("Any other platform");
# endif
직접 공급을 통해 #define 지시어의 빌트인 선택을 추가할 수도 있습니다. 플레이어 설정의 Other Settings 패널을 연 후 Scripting Define Symbols 텍스트 상자로 이동하시기 바랍니다.
정의하고 싶은 특정 플랫폼의 기호 이름을 입력하시기 바랍니다. 기호 이름은 세미콜론으로 구분됩니다. 입력한 기호 이름은 빌트인 명령처럼 #if
명령의 조건으로 사용될 수 있습니다.
전처리 지시어를 정의하여 컴파일링할 때 어떤 코드를 포함할지 조절할 수 있습니다. 그러기 위해선 추가 지시어가 있는 텍스트 파일을 Assets 폴더에 추가해야 합니다. 파일명은 사용하고 있는 언어에 따라 달라지며 확장자는 .rsp 입니다.
C# (플레이어 스크립트와 에디터 스크립트) | <Project Path>/Assets/mcs.rsp |
예를 들어 mcs.rsp 파일에 -define:UNITY_DEBUG
한 줄을 포함할 경우 #define 지시어인 UNITY_DEBUG
는 에디터 스크립트의 경우를 제외하고는 C# 스크립트에 대한 글로벌 #define으로 존재하게 됩니다.
.rsp 파일을 변경할 때마다 다시 컴파일해야 해당 파일이 유효합니다. 하나의 스크립트(.js 또는 .cs) 파일을 업데이트하거나 다시 임포트를 하면 됩니다.
참고: 글로벌 ##define 지시어만 수정하고 싶을 경우 플레이어 설정에 있는 Scripting Define Symbols 를 사용하시기 바랍니다. 이 설정이 모든 컴파일러를 다루기 때문입니다. .rsp 를 선택할 경우에는 Unity에서 사용하는 모든 컴파일러에 해당하는 하나의 파일을 제공해야 합니다.
.rsp 파일 사용법은 에디터 설치 폴더에 포함된 mcs 애플리케이션의 ‘도움말’ 섹션에 설명돼 있습니다. mcs -help
를 실행하여 자세한 내용을 알 수 있습니다.
.rsp 파일은 호출되는 컴파일러와 반드시 매치돼야 함을 유의하시기 바랍니다. 예를 들어
mcs.rsp
와 함께 사용됩니다.csc.rsp
와 함께 사용됩니다.