자동 메모리 관리 이해
특수 폴더와 스크립트 컴파일 순서(Special folders and script compilation order)

Platform Dependent Compilation

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 에디터에서 실행할 수 있기 때문에 타겟 플랫폼에 필요한 코드를 컴파일하고 에디터에서 테스트할 수 있습니다.

플랫폼 #define 지시어

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.

타겟 플랫폼으로 선택된 PC, Mac 그리고 Linux로 설정창 빌드
타겟 플랫폼으로 선택된 PC, Mac 그리고 Linux로 설정창 빌드

프리컴파일된 코드를 테스트하고자 하는 플랫폼을 선택하고 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

Platform custom defines

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 명령의 조건으로 사용될 수 있습니다.

Global custom defines

전처리 지시어를 정의하여 컴파일링할 때 어떤 코드를 포함할지 조절할 수 있습니다. 그러기 위해선 추가 지시어가 있는 텍스트 파일을 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 파일은 호출되는 컴파일러와 반드시 매치돼야 함을 유의하시기 바랍니다. 예를 들어

  • when targeting the web player, smcs is used with smcs.rsp,
  • when targeting standalone players, gmcs is used with gmcs.rsp, and
  • MS 컴파일러를 타겟으로 할 때 csccsc.rsp 등과 함께 사용됩니다.
자동 메모리 관리 이해
특수 폴더와 스크립트 컴파일 순서(Special folders and script compilation order)