Unity의 C# 언어 지원에는 지시문의 사용이 포함되어 있어서 특정 스크립팅 심볼이 정의되었는지에 따라 컴파일에서 코드를 선택적으로 포함하거나 제외할 수 있습니다. C#에서 이러한 지시문이 작동하는 방식에 대한 자세한 내용은 C# 프리 프로세서 지시문에 대한 Microsoft 기술 자료를 참조하십시오.
Unity에는 스크립트에서 코드의 일부를 컴파일에서 선택적으로 포함하거나 제외하는 데 사용할 수 있는 다양한 사전 정의된 심볼이 있습니다. 예를 들어 Windows 스탠드얼론 플랫폼용 프로젝트 빌드에 정의된 심볼은 UNITY_STANDALONE_WIN입니다. 특수한 유형의 if 문을 사용하여 이 심볼이 정의되었는지 확인할 수 있습니다.
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone Windows");
#endif
#if 및 #endif 앞에 있는 해시(#) 문자는 이 문이 런타임이 아닌 컴파일 프로세스 중에 처리되는 지시문임을 나타냅니다. 이전 예시에서 디버그 라인은 프로젝트의 Windows 스탠드얼론 빌드에서만 컴파일하기 위해 포함되어 있습니다. Unity 에디터 또는 기타 타겟 빌드에서 컴파일하면 완전히 생략됩니다. 이는 런타임 시 코드의 특정 섹션 실행을 우회할 수 있는 일반 if 문을 사용하는 것과는 다릅니다.
#elif 및 #else 지시문을 사용하여 여러 조건을 확인할 수 있습니다.
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iOS");
#else
Debug.Log("Any other platform");
#endif
선택한 플랫폼, 에디터 버전, 기타 시스템 환경 시나리오에 따라 코드를 선택적으로 컴파일하거나 생략할 수 있는 여러 개의 사전 정의된 심볼이 있습니다. Unity의 사전 정의된 심볼 전체 리스트는 Unity 스크립팅 심볼 레퍼런스를 참조하십시오.
에디터를 사용하여 스크립팅 또는 에셋 파일을 통해 스크립팅 심볼을 정의할 수도 있습니다. 자세한 내용은 커스텀 스크립팅 심볼을 참조하십시오.
참고: 스크립팅 심볼은 심볼 정의, 프리 프로세서 정의 또는 간단히 정의라고도 합니다.
프리 프로세서 지시문은 항상 코드를 조건부로 포함하거나 제외하는 가장 적절하거나 신뢰할 수 있는 방법이 아닙니다. 다른 접근 방법은 다음과 같습니다.
Conditional 속성더 깔끔하고 오류가 적은 함수 스트리핑 방법인 C# Conditional 속성을 사용할 수 있습니다. 자세한 내용은 ConditionalAttribute 클래스를 참조하십시오. Start(), Update(), LateUpdate(), FixedUpdate(), Awake() 같은 일반적인 Unity 콜백은 엔진에서 직접 호출되기 때문에 이 속성에 영향을 받지 않으며 성능상의 이유로 이를 고려하지 않습니다.
높은 수준의 조건부 컴파일에 권장되는 접근 방식은 연결된 어셈블리 정의 파일을 사용하여 어셈블리로 스크립트를 구성하는 것입니다. 조건부로 포함하거나 제외하려는 코드가 어셈블리에 있는 경우 어셈블리 정의에서 제약 정의를 구성하여 프로젝트에 특정 버전의 패키지가 있는 경우에만 코드를 컴파일할 수 있습니다.
조건부 컴파일 대신 표준 if 문을 사용하여 컴파일된 코드의 조건부 실행을 적용할 수 있습니다. 예를 들어 Unity의 UNITY_64 스크립팅 심볼은 64비트 아키텍처에 대해 신뢰할 수 없는 테스트이므로 대신 다음을 수행하는 것이 좋습니다.
if (IntPtr.Size == 4)
{
// 32 bit code
}
else
{
// 64-bit code
}