Unity의 C# 언어 지원에는 지시문의 사용이 포함되어 있어서 특정 스크립팅 심볼이 정의됨 또는 정의되지 않음에 따라 컴파일에서 코드를 선택적으로 포함하거나 제외할 수 있습니다.
Microsoft C# 프리 프로세서 지시문 페이지에서 이러한 지시문이 C#에서 작동하는 방식에 대해 더 광범위하게 알아볼 수 있습니다.
Unity에는 스크립트에서 사용할 수 있는 다양한 빌트인 스크립팅 심볼이 있습니다. 이 심볼은 컴파일에서 코드의 일부를 선택적으로 포함하거나 제외할 수 있는 옵션을 나타냅니다.
예를 들어 플레이어가 Windows 스탠드얼론 플랫폼용으로 빌드될 때 설정되는 빌트인 스크립팅 심볼은 UNITY_STANDALONE_WIN
입니다. 다음과 같이 특수 타입의 if문을 사용하여 이 심볼이 정의되었는지 확인할 수 있습니다.
# if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
# endif
if
와 endif
앞에 있는 해시(#
) 캐릭터는 이 표현이 “지시문”이며 런타임이 아닌 컴파일 프로세스 중에 처리됨을 나타냅니다.
따라서 위의 예에서 디버그 행은 프로젝트의 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_SERVER | 전용 서버(Mac OS X, Windows 또는 Linux)의 컴파일링/실행 코드용 스크립팅 심볼입니다. |
UNITY_IOS | iOS 플랫폼용 컴파일링/실행 코드용 스크립팅 심볼. |
UNITY_IPHONE | 권장하지 않음. 대신 UNITY_IOS 를 사용해야 합니다. |
UNITY_ANDROID | Android 플랫폼용 스크립팅 심볼. |
UNITY_LUMIN | Magic Leaf OS 플랫폼용 스크립팅 심볼.PLATFORM_LUMIN 도 사용할 수 있습니다.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 | 웹용 스크립팅 심볼입니다. |
UNITY_FACEBOOK | Facebook 플랫폼(웹 또는 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입니다. |
ENABLE_VR | 타겟 빌드 플랫폼이 VR을 지원할 때의 정의입니다.현재 VR이 활성화되어 있거나 VR을 지원하는 데 필요한 플러그인과 패키지가 설치되어 있음을 의미하지는 않습니다. |
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 | 스크립트가 Development Build 옵션이 활성화된 상태로 빌드된 플레이어에서 실행될 때 정의됩니다. 이 정의는 빌드 시 개발 빌드 체크박스가 선택되었는지만 반영합니다. 스크립트가 개발 빌드에서 실행 중인지 판단하려면 Debug.isDebugBuild를 사용하십시오. 많은 플랫폼에서 프로젝트를 다시 빌드하지 않고도 개발 빌드와 비개발 빌드 간에 변경할 수 있으므로 __DEVELOPMENT\_BUILD__ 만으로는 현재 개발 빌드에서 실행 중인지 판단할 수 없습니다. 일부 플랫폼에서는 Unity가 에디터에서 개발 빌드와 비개발 빌드 간의 전환을 지원하지 않으므로 빌드 후에 전환해야 합니다. 예를 들어 Create Visual Studio solution 옵션을 사용하여 Windows 용으로 빌드할 수 있는데, 이는 Visual Studio에서 개발 빌드 또는 비개발 빌드를 원하는지를 선택해야 한다는 의미입니다. Visual Studio에서 전환해도 스크립트를 다시 컴파일하지 않으므로 스크립팅 정의를 다시 평가하지 않습니다. 또 다른 예는 게임 빌드의 UnityPlayer.dll 을 개발 빌드의 UnityPlayer.dll 로 변경하여 최종 게임 빌드를 개발 빌드로 전환하는 것인데, 이는 라이브 게임 빌드를 디버깅할 때 유용합니다. |
아래는 프리컴파일된 코드를 사용하는 방식에 관한 예시입니다. 타겟 빌드로 선택한 플랫폼에 따라 메시지를 출력합니다.
먼저 File > Build Settings 로 이동한 다음, 테스트하고 싶은 코드의 플랫폼을 선택합니다. Build Settings 창이 보여지면 타겟 플랫폼을 선택할 수 있습니다.
프리컴파일된 코드를 테스트하고자 하는 플랫폼을 선택하고 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("Unity 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 에디터” 및 “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