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

플랫폼 의존 컴파일(Platform dependent compilation)

Unity 에는 Platform Dependent Compilation 이라는 기능이 있습니다. 이 기능은 지원되는 플랫폼 중 하나를 위해 작성된 코드 섹션을 컴파일 및 실행할 수 있게 하고, 스크립트를 파티션화할 수 있는 전처리 지시문으로 구성됩니다.

코드를 Unity 에디터에서 실행할 수 있기 때문에 타겟 플랫폼에 필요한 코드를 컴파일하고 에디터에서 테스트할 수 있습니다.

플랫폼 #define 지시어

Unity 가 스크립트를 지원하는 플랫폼 #define 지시어는 다음과 같습니다.

Property: 기능:
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 창이 보여지면 타겟 플랫폼을 선택할 수 있습니다.

타겟 플랫폼으로 선택된 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

플랫폼 커스텀 #define

직접 공급을 통해 #define 지시어의 빌트인 선택을 추가할 수도 있습니다. 플레이어 설정Other Settings 패널을 연 후 Scripting Define Symbols 텍스트 상자로 이동하시기 바랍니다.

정의하고 싶은 특정 플랫폼의 기호 이름을 입력하시기 바랍니다. 기호 이름은 세미콜론으로 구분됩니다. 입력한 기호 이름은 빌트인 명령처럼 #if 명령의 조건으로 사용될 수 있습니다.

글로벌 커스텀 #define

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

  • 모든 플레이어 또는 에디터를 타겟으로 할 때 mcsmcs.rsp와 함께 사용되며
  • MS 컴파일러를 타겟으로 할 때 csccsc.rsp 등과 함께 사용됩니다.

• 2017–05–16 편집 리뷰 없이 페이지 수정됨

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