Version: 2022.2
언어: 한국어
특수 폴더와 스크립트 컴파일 순서
커스텀 스크립팅 심볼

조건부 컴파일

Unity의 C# 언어 지원에는 지시문의 사용이 포함되어 있어서 특정 스크립팅 심볼정의됨 또는 정의되지 않음에 따라 컴파일에서 코드를 선택적으로 포함하거나 제외할 수 있습니다.

Microsoft C# 프리 프로세서 지시문 페이지에서 이러한 지시문이 C#에서 작동하는 방식에 대해 더 광범위하게 알아볼 수 있습니다.

Unity에는 스크립트에서 사용할 수 있는 다양한 빌트인 스크립팅 심볼이 있습니다. 이 심볼은 컴파일에서 코드의 일부를 선택적으로 포함하거나 제외할 수 있는 옵션을 나타냅니다.

예를 들어 플레이어가 Windows 스탠드얼론 플랫폼용으로 빌드될 때 설정되는 빌트인 스크립팅 심볼은 UNITY_STANDALONE_WIN입니다. 다음과 같이 특수 타입의 if문을 사용하여 이 심볼이 정의되었는지 확인할 수 있습니다.

# if UNITY_STANDALONE_WIN

  Debug.Log("Standalone Windows");

# endif

ifendif 앞에 있는 해시(#) 캐릭터는 이 표현이 “지시문”이며 런타임이 아닌 컴파일 프로세스 중에 처리됨을 나타냅니다.

따라서 위의 예에서 디버그 행은 프로젝트의 Windows 스탠드얼론 빌드에서 컴파일용으로만 포함됩니다. 디버그 행은 에디터나 다른 타겟 빌드에서 컴파일할 때 완전히 생략됩니다. 이것은 런타임 시 코드 특정 부분의 execution만 우회하는 일반 if .. then .. else 구조를 사용하는 것과 다릅니다. 전체 예는 아래를 참조하십시오.

선택한 플랫폼, 에디터 버전, 기타 시스템 환경 시나리오에 따라 코드를 선택적으로 컴파일하거나 생략할 수 있는 여러 가지 빌트인 스크립팅 심볼이 있습니다. 빌트인 스크립팅 심볼은 아래 나열되어 있습니다.

또한 에디터 UI를 사용하거나 스크립팅을 통해 또는 에셋 파일을 통해 직접 스크립팅 심볼을 정의할 수 있으므로 임의 정의를 기반으로 코드 부분의 컴파일을 제어할 수 있습니다. 자세한 내용은 커스텀 스크립팅 심볼을 참조하십시오..

참고: 스크립팅 심볼은 “심볼 정의”, “프리 프로세서 정의” 또는 간단히 “정의”라고도 합니다.

플랫폼 스크립팅 심볼

Unity는 저작 및 빌드 타겟 플랫폼을 기반으로 특정 스크립팅 심볼을 자동으로 정의합니다. 이는 다음과 같습니다.

Define 기능
UNITY_EDITOR 게임 코드에서 Unity 에디터 스크립트를 호출하는 스크립팅 심볼.
UNITY_EDITOR_WIN Windows에서의 에디터 코드용 스크립팅 심볼.
UNITY_EDITOR_OSX Mac OS X에서의 에디터 코드용 스크립팅 심볼.
UNITY_EDITOR_LINUX Linux에서의 에디터 코드용 스크립팅 심볼.
UNITY_STANDALONE_OSX (Universal 아키텍처, PPC 아키텍처와 Intel 아키텍처를 포함한) Mac OS X 전용 코드를 컴파일 또는 실행하기 위한 스크립팅 심볼.
UNITY_STANDALONE_WIN Windows 스탠드얼론 애플리케이션 전용 컴파일링/실행 코드용 스크립팅 심볼.
UNITY_STANDALONE_LINUX Linux 스탠드얼론 애플리케이션 전용 컴파일링/실행 코드용 스크립팅 심볼.
UNITY_STANDALONE 스탠드얼론 플랫폼(Mac OS X, Windows 또는 Linux) 전용 컴파일링/실행 코드용 스크립팅 심볼.
UNITY_WII Wii 콘솔용 컴파일링/실행 코드용 스크립팅 심볼.
UNITY_IOS iOS 플랫폼용 컴파일링/실행 코드용 스크립팅 심볼.
UNITY_IPHONE 권장하지 않음. 대신 UNITY_IOS 를 사용해야 합니다.
UNITY_ANDROID Android 플랫폼용 스크립팅 심볼.
UNITY_LUMIN Magic Leap OS 플랫폼용 스크립팅 심볼. PLATFORM_LUMIN 을 사용할 수도 있습니다.
UNITY_TIZEN Tizen 플랫폼용 스크립팅 심볼
UNITY_TVOS Apple TV 플랫폼용 스크립팅 심볼
UNITY_WSA Universal Windows 플랫폼용 스크립팅 심볼. C# 파일을 .NET Core에 컴파일링하고 .NET 스크립팅 백엔드를 사용할 때 NETFX_CORE 가 정의됩니다.
UNITY_WSA_10_0 유니버설 Windows 플랫폼용 스크립팅 심볼. C# 파일을 .NET Core에 컴파일링할 때 WINDOWS_UWP 가 정의됩니다.
UNITY_WEBGL WebGL용 스크립팅 심볼.
UNITY_FACEBOOK Facebook 플랫폼(WebGL 또는 Windows 스탠드얼론)용 스크립팅 심볼.
UNITY_ANALYTICS 게임 코드에서 Unity 애널리틱스 메서드를 호출하기 위한 스크립팅 심볼. 버전 5.2 이상 버전에 해당합니다.
UNITY_ASSERTIONS 행사 컨트롤 프로세스를 위한 스크립팅 심볼
UNITY_64 64비트 플랫폼용 스크립팅 심볼

에디터 버전 스크립팅 심볼

Unity는 현재 사용 중인 에디터 버전에 따라 특정 스크립팅 심볼을 자동으로 정의합니다.

버전 X.Y.Z 에 따라(예를 들어, 버전 2019.4.14) Unity는 세 개의 글로벌 스크립팅 심볼을 UNITY_X, UNITY_X_Y, UNITY_X_Y_Z 포맷으로 나타냅니다.

Unity 2019.4.14에서 나타나는 스크립팅 심볼 예시입니다.

Define 기능
UNITY_2019 모든 2019.Y.Z 릴리스에서 나타나는 Unity 2019의 릴리스 버전에 해당하는 스크립팅 심볼입니다.
UNITY_2019_4 모든 2019.4.Z 릴리스에서 나타나는 Unity 2019.4의 주요 버전에 해당하는 스크립팅 심볼입니다.
UNITY_2019_4_14 Unity 2019.4.14의 부 버전에 해당하는 스크립팅 심볼입니다.

Unity의 이전 버전을 기반으로 하여 코드를 선택적으로 컴파일하여 코드의 주어진 포션을 컴파일하거나 실행할 수 있습니다. 위와 동일한 버전의 포맷(X.Y)일 경우 Unity는 이 목적으로 사용할 수 있는 포맷 UNITY_X_Y_OR_NEWER 에 하나의 전역 #define을 나타냅니다.

기타 스크립팅 심볼

Unity에서 정의하는 기타 스크립팅 심볼은 다음과 같습니다.

Define 기능
CSHARP_7_3_OR_NEWER C# 7.3 이상 지원하는 스크립트를 빌드할 때의 정의입니다.
ENABLE_MONO Mono를 위한 스크립팅 백엔드 #define입니다.
ENABLE_IL2CPP IL2CPP를 위한 스크립팅 백엔드 #define입니다.
NET_2_0 Mono 및 IL2CPP에서 .NET 2.0 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_2_0_SUBSET Mono와 IL2CPP에서 .NET 2.0 Subset API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_LEGACY Mono와 IL2CPP에서 .NET 2.0 또는 .NET 2.0 Subset API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_4_6 Mono 및 IL2CPP에서 .NET 4.x API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_STANDARD_2_0 Mono 및 IL2CPP에서 .NET 스탠다드 2.0 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_STANDARD_2_1 Mono 및 IL2CPP에서 .NET 스탠다드 2.1 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NET_STANDARD Mono 및 IL2CPP에서 .NET 스탠다드 2.1 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NETSTANDARD2_1 Mono 및 IL2CPP에서 .NET 스탠다드 2.1 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
NETSTANDARD Mono 및 IL2CPP에서 .NET 스탠다드 2.1 API 호환성 레벨에 스크립트를 빌드할 때의 정의입니다.
ENABLE_WINMD_SUPPORT Windows Runtime 지원이 IL2CPP에서 활성화될 때의 정의입니다. 자세한 내용은 Windows Runtime 지원을 참조하십시오.
ENABLE_INPUT_SYSTEM 플레이어 설정에 입력 시스템 패키지가 활성화되었을 때 정의됩니다.
ENABLE_LEGACY_INPUT_MANAGER 플레이어 설정에 레거시 입력 관리자가 활성화되었을 때 정의됩니다.
UNITY_SERVER 빌드 설정에 서버 빌드 설정이 활성화되었을 때 정의됩니다.
DEVELOPMENT_BUILD 스크립트가 “개발용 빌드” 옵션이 활성화될 때 빌드된 플레이어에서 재생되었을 때 정의됩니다.

프리컴파일 코드 테스트

아래는 프리컴파일된 코드를 사용하는 방식에 관한 예시입니다. 타겟 빌드로 선택한 플랫폼에 따라 메시지를 출력합니다.

먼저 File > Build Settings 로 이동한 다음, 테스트하고 싶은 코드의 플랫폼을 선택합니다. Build Settings 창이 보여지면 타겟 플랫폼을 선택할 수 있습니다.

타겟 플랫폼으로 선택된 Windows, Mac, Linux로 빌드 설정 창
타겟 플랫폼으로 선택된 Windows, Mac, Linux로 빌드 설정 창

프리컴파일된 코드를 테스트하고자 하는 플랫폼을 선택하고 Switch Platform 을 클릭해 Unity에 어떤 플랫폼을 대상으로 하는지 알립니다.

스크립트를 생성한 후 다음의 코드를 복사/붙여넣기합니다.

using UnityEngine;
using System.Collections;

public class PlatformDefines : MonoBehaviour {
  void Start () {

    #if UNITY_EDITOR
      Debug.Log("Unity Editor");
    #endif

    #if UNITY_IOS
      Debug.Log("iOS");
    #endif

    #if UNITY_STANDALONE_OSX
        Debug.Log("Standalone OSX");
    #endif

    #if UNITY_STANDALONE_WIN
      Debug.Log("Standalone Windows");
    #endif

  }          
}

코드를 테스트하려면 Play Mode 를 선택합니다. Unity 콘솔에 있는 메시지가 선택한 플랫폼에 적절히 나타나는지 확인하여 코드 작동을 확인하기 바랍니다. 예를 들어, iOS 를 선택할 경우 “Unity iOS” 메시지가 콘솔에 나타나도록 설정됩니다.

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 iOS");

# else

    Debug.Log("Any other platform");

# endif
특수 폴더와 스크립트 컴파일 순서
커스텀 스크립팅 심볼