Version: 2018.2
자동 메모리 관리 이해
특수 폴더와 스크립트 컴파일 순서

플랫폼별 컴파일

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

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

플랫폼 #define 지시어

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_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.x API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_STANDARD_2_0 Mono 및 IL2CPP에서 .NET 스탠다드 2.0 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 속성을 사용할 수 있습니다. 자세한 내용은 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

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

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

글로벌 커스텀 #define

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

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

  • 2018–03–16 편집 리뷰 없이 페이지 수정됨

  • Samsung TV 지원 제외됨

자동 메모리 관리 이해
특수 폴더와 스크립트 컴파일 순서