Unity에는 플랫폼별 컴파일(Platform Dependent Compilation) 이라는 기능이 있습니다. 이 기능은 지원되는 플랫폼 중 하나를 위해 작성된 코드 섹션을 컴파일 및 실행할 수 있게 하고, 스크립트를 파티션화할 수 있는 전처리 지시문으로 구성됩니다.
코드를 Unity 에디터에서 실행할 수 있기 때문에 타겟 플랫폼에 필요한 코드를 컴파일하고 에디터에서 테스트할 수 있습니다.
Unity가 스크립트를 지원하는 플랫폼 #define 지시어는 다음과 같습니다.
프로퍼티: | 기능: |
---|---|
UNITY_EDITOR | 게임 코드에서 Unity 에디터 스크립트를 호출하는 #define 지시어 |
UNITY_EDITOR_WIN | Windows에서의 에디터 코드용 #define 지시어 |
UNITY_EDITOR_OSX | Mac OS X에서의 에디터 코드용 #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_SAMSUNGTV | Samsung TV 실행 코드를 위한 #define 지시어 |
UNITY_XBOXONE | Xbox One 실행 코드를 위한 #define 지시어 |
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_ADS | 게임 코드에서 Unity Ads 메서드를 호출하기 위한 #define 지시어. 버전 5.2와 그 이상의 버전에 해당합니다. |
UNITY_ANALYTICS | 게임 코드에서 Unity 애널리틱스 메서드를 호출하기 위한 #define 지시어. 버전 5.2와 그 이상의 버전에 해당합니다. |
UNITY_ASSERTIONS | 행사 컨트롤 프로세스를 위한 #define 지시어 |
Unity 버전 2.6.0.과 그 이상의 버전에서 코드를 선택적으로 컴파일할 수 있습니다. 사용 가능한 옵션은 사용하고 있는 에디터의 버전에 따라 다릅니다. 버전 X.Y.Z 에 따라(예를 들어, 버전 2.6.0) Unity는 세 개의 글로벌 #define 지시어를 다음의 포맷으로 나타냅니다. UNITY_X, UNITY_X_Y, 그리고 UNITY_X_Y_Z.
Unity 5.0.1에서 나타나는 #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 지시어는 다음과 같습니다.
ENABLE_MONO | Mono를 위한 스크립팅 백엔드 #define입니다. |
ENABLE_IL2CPP | IL2CPP를 위한 스크립팅 백엔드 #define입니다. |
ENABLE_DOTNET | .NET를 위한 스크립팅 백엔드 #define입니다. |
NETFX_CORE | .NET의 .NET Core 클래스 라이브러리에 스크립트를 빌드할 때의 정의입니다. |
NET_2_0 | Mono 및 IL2CPP에서 .NET 2.0 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
NET_2_0_SUBSET | Mono와 IL2CPP에서 .NET 2.0 Subset API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
NET_4_6 | Mono와 IL2CPP에서 .NET 4.6 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다. |
ENABLE_WINMD_SUPPORT | Windows 런타임 지원이 IL2CPP와 .NET에서 활성화될 때의 정의입니다. 자세한 내용은 Windows 런타임 지원을 참조하십시오. |
DEVELOPMENT_BUILD #define을 사용하여 스크립트가 “개발용 빌드” 옵션이 활성화될 때 빌드된 플레이어에서 재생되고 있는지 확인할 수 있습니다.
스크립팅 백엔드에 따라 코드를 선택적으로 컴파일할 수 있습니다.
아래는 프리컴파일된 코드를 사용하는 방식에 관한 예시입니다. 타겟 빌드로 선택한 플랫폼에 따라 메시지를 출력합니다.
먼저 File > Build Settings 로 이동한 다음, 테스트하고 싶은 코드의 플랫폼을 선택합니다. Build Settings 창이 보여지면 타겟 플랫폼을 선택할 수 있습니다.
프리컴파일된 코드를 테스트하고자 하는 플랫폼을 선택하고 Switch Platform 을 클릭해 Unity에 어떤 플랫폼을 대상으로 하는지 알립니다.
스크립트를 생성한 후 다음의 코드를 복사/붙여넣기합니다.
// JS
function Awake() {
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IPHONE
Debug.Log("Iphone");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif
}
// 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
속성을 사용할 수 있다는 점을 유의하기 바랍니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx에서 확인할 수 있습니다.
기본적인 #if
컴파일러 명령뿐 아니라 C#와 JavaScript에서 다양한 테스트를 사용할 수 있습니다.
# 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 |
UnityScript | <Project Path>/Assets/us.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
등과 함께 사용됩니다.• 2017–05–16 편집 리뷰 없이 페이지 수정됨