Unity includes a feature called “Platform Dependent Compilation”. This consists of some preprocessor directives that let you partition your scripts to compile and execute a section of code exclusively for one of the supported platforms.
코드를 Unity 에디터에서 실행할 수 있기 때문에 타겟 플랫폼에 필요한 코드를 컴파일하고 에디터에서 테스트할 수 있습니다.
Unity가 스크립트를 지원하는 플랫폼 #define 지시어는 다음과 같습니다.
프로퍼티: | 기능: |
---|---|
UNITY_EDITOR | 게임 코드에서 Unity 에디터 스크립트를 호출하는 #define 지시어 |
UNITY_EDITOR_WIN | Windows에서의 에디터 코드용 #define 지시어 |
UNITY_EDITOR_OSX | #define directive for Editor code on Mac OSX. |
UNITY_STANDALONE_OSX | #define directive for compiling/executing code specifically for OS X (including Universal, PPC and Intel architectures). |
UNITY_STANDALONE_WIN | Windows 스탠드얼론 애플리케이션 전용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_STANDALONE_LINUX | Linux 스탠드얼론 애플리케이션 전용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_STANDALONE | #define directive for compiling/executing code for any standalone platform (OS X, Windows or Linux). |
UNITY_WII | Wii 콘솔용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_IOS | iOS 플랫폼용 컴파일링/실행 코드를 위한 #define 지시어 |
UNITY_IPHONE | 권장하지 않음. 대신 UNITY_IOS 를 사용해야 합니다. |
UNITY_ANDROID | Android 플랫폼을 위한 #define 지시어 |
UNITY_PS3 | #define directive for running PlayStation 3 code. |
UNITY_PS4 | PlayStation 4 실행 코드를 위한 #define 지시어 |
UNITY_SAMSUNGTV | Samsung TV 실행 코드를 위한 #define 지시어 |
UNITY_XBOX360 | #define directive for executing Xbox 360 code. |
UNITY_XBOXONE | Xbox One 실행 코드를 위한 #define 지시어 |
UNITY_TIZEN | Tizen 플랫폼을 위한 #define 지시어 |
UNITY_TVOS | Apple TV 플랫폼을 위한 #define 지시어 |
UNITY_WP_8_1 | #define directive for Windows Phone 8.1. |
UNITY_WSA | #define directive for Windows Store Apps. Additionally, NETFX_CORE is defined when compiling C# files against .NET Core. |
UNITY_WSA_8_1 | #define directive for Windows Store Apps when targeting SDK 8.1. |
UNITY_WSA_10_0 | #define directive for Windows Store Apps when targeting Universal Windows 10 Apps. Additionally WINDOWS_UWP and NETFX_CORE are defined when compiling C# files against .NET Core. |
UNITY_WINRT | UNITY_WSA 와 동일함 |
UNITY_WINRT_8_1 | Equivalent to UNITY_WP_8_1 | UNITY_WSA_8_1. This is also defined when compiling against Universal SDK 8.1. |
UNITY_WINRT_10_0 | UNITY_WSA_10_0 와 동등함 |
UNITY_WEBGL | WebGL을 위한 #define 지시어 |
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 지시어입니다. |
You can compile code selectively based on the earliest version of Unity required to compile or execute a given portion of code. Given the same version format as above (X.Y.Z), Unity exposes one global #define directive that can be used for this purpose, in the format UNITY_X_Y_OR_NEWER.
지원되는 #define 지시어는 다음과 같습니다.
UNITY_5_3_OR_NEWER | Global #define directive exposed starting from Unity 5.3. |
스크립팅 백엔드에 따라 코드를 선택적으로 컴파일할 수 있습니다.
ENABLE_MONO | Scripting back-end #define directive for Mono. |
ENABLE_IL2CPP | Scripting back-end #define directive for IL2CPP. |
ENABLE_DOTNET | Scripting back-end #define directive for .NET. |
You can also use the DEVELOPMENT_BUILD
#define directive to identify whether your script is running in a player which was built with the “Development Build” option enabled.
아래는 프리컴파일된 코드를 사용하는 방식에 관한 예시입니다. 타겟 빌드로 선택한 플랫폼에 따라 메시지를 출력합니다.
First of all, select the platform you want to test your code against by going to File > Build Settings. This displays the Build Settings window; select your target platform from here.
프리컴파일된 코드를 테스트하고자 하는 플랫폼을 선택하고 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
It is also possible to add to the built-in selection of #define directives by supplying your own. In the Other Settings panel of the Player Settings, you will see the Scripting Define Symbols text box.
정의하고 싶은 특정 플랫폼의 기호 이름을 입력하시기 바랍니다. 기호 이름은 세미콜론으로 구분됩니다. 입력한 기호 이름은 빌트인 명령처럼 #if
명령의 조건으로 사용될 수 있습니다.
전처리 지시어를 정의하여 컴파일링할 때 어떤 코드를 포함할지 조절할 수 있습니다. 그러기 위해선 추가 지시어가 있는 텍스트 파일을 Assets 폴더에 추가해야 합니다. 파일명은 사용하고 있는 언어에 따라 달라지며 확장자는 .rsp 입니다.
C# | <Project Path>/Assets/smcs.rsp |
C# - Editor Scripts | <Project Path>/Assets/gmcs.rsp |
UnityScript | <Project Path>/Assets/us.rsp |
As an example, if you include the single line -define:UNITY_DEBUG
in your smcs.rsp file, the #define directive UNITY_DEBUG
will exist as a global #define for C# scripts, except for Editor scripts.
Every time you make changes to .rsp files, you will need to recompile in order for them to be effective. You can do this by updating or reimporting a single script (.js or .cs) file.
NOTE
If you want to modify only global #define directives, use Scripting Define Symbols in Player Settings, as this covers all the compilers. If you choose the .rsp files instead, you need to provide one file for every compiler Unity uses, and you won’t know when one or another compiler is used.
The use of .rsp files is described in the ‘Help’ section of the smcs application which is included in the Editor installation folder. You can get more information by running smcs -help
.
.rsp 파일은 호출되는 컴파일러와 반드시 매치돼야 함을 유의하시기 바랍니다. 예를 들어
smcs.rsp
,gmcs.rsp
, andcsc.rsp
등과 함께 사용됩니다.