본문 바로가기

프로그램/유니티 C# 강좌

[유니티 C# 강좌] 16. 전처리기 지시어(Preprocessor Directive)

728x90
반응형

0. 전처리기란?

0.1 실행 파일 생성 프로세스

 

프로그래밍을 하고 실행파일을 만드는 과정은 다음의 프로세스로 진행됩니다.

 

코더제로 유니티 C# 강좌 전처리기 지시어(Preprocessor Directive) 실행파일 생성 프로세스
그림. 실행파일 생성 프로세스

 

 ① 소스 파일 작업 : 눈물나는 작업이죠. ㅜㅜ 

 ② 컴파일(Compile) :  소스파일을 기계어로 변환하는 과정입니다.

 ③ 링크(Link) : 분리 되어 있는 각 소스 파일을 연결하는 작업입니다.

 ④ 실행 파일 생성.

 

여기서 ② 컴파일 + ③ 링크을 빌드(Build)라고 합니다.

 

 

0.2 전치리기

 

전치리는 컴파일 전에 소스 파일을 정리하여, 정의 된 부분만 컴파일 하는 것입니다.

모든 전치리기는 # 지시어로 시작합니다.

 

전처리기 지시어

설명

#define

심볼 정의

#undef

심볼 정의 해제

#if

조건을 만족한다면, 코드 컴파일

#else

조건을 만족하지 않다면, 코드 컴파일

#elif

앞의 조건들은 만족하지 않고, 현재 조건이 만족한다면, 코드 컴파일

#endif

#if 지시문 종료

#region

비주얼 스튜디오에서 확장 축소를 할 수 있는 코드 블록 지정

#endregion

#region 블록 끝 표시

 

그리고 전처리기 지시문은 한 줄에서 한 명령이어야 합니다.

 

 

1. #define 지시문, #undef 지시문

 

#define을 사용하여 기호(Symbol)를 정의합니다.

#undef를 사용하면 기호의 정의를 해제할 수 있습니다.

기호를 정의 후 #if 지시문을 사용하면, true로 평가 되고, 정의를 해제하면 false로 평가 됩니다.

 

사용 방법 : #define 지시문, #undef 지시문

#define 기호 // 기호 정의
#undef 기호 // 기호 해제

 

 

2. #if지시문,#endif지시문, #else 지시문, #elif 지시문

2.1 #if지시문 ... #endif지시문 

 

#if지시문와 #endif지시문 쌍으로 이루어져 있으며, #define에서 정의 된 기호를 확인하여 #if지시문 ~#endif지시문 사이의 기능을 실행합니다.

 

사용 방법 : #if지시문, #endif지시문

#if (조건-평가// 조건 평가가 하나의 기호이면, 괄호() 생략 가능
...
#endif

 

#define Symbol1 

using UnityEngine; 

public class PreprocessorExample : MonoBehaviour 
{ 
    void Start() 
    { 
#if Symbol1  
        Debug.Log("Define1"); // 출력 : Define1 
#endif 
    } 
}

 

괄호와 ==(같음), !=(같지 않음), &&(and), ||(or), !(not) 연산자를 사용하여 조건을 만들 수 있습니다.
#if 뒤 조건의 #if Symbol1와 #if(Symbol1 == true)가 같은 의미입니다.

 

 

2.2 #elif지시문, #else지시문

 

#elif지시문와 #else지시문는 #if지시문와#endif지시문와 함께 사용되며, #else는 조건을 만족하지 않다면, 코드 컴파일하고, #elif는 앞의 조건들은 만족하지 않고, 현재 조건이 만족한다면, 코드 컴파일합니다.

 

#define Define1

using UnityEngine;

public class PreprocessorExample : MonoBehaviour
{
    void Start()
    {
#if (Define1 && !Define2)
        Debug.Log("Define1 is defined"); // 출력 : Define1 is defined
#elif (!Define1 && Define2)
        Debug.Log("Define2 is defined");
#elif (Define1 && Define2)
        Debug.Log("Define1 and Define2 are defined");
#else
        Debug.Log("Define1 and Define2 are not defined");
#endif
    }
}

 

 

2.3 유니티 플랫폼별 컴파일

 

유니티는 플랫폼 의존 컴파일이 지원합니다

이때 사용되는 전처리기 지시문가 #if 지시어 입니다.

 

프로퍼티

기능

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와 그 이상의 버전에 해당합니다.

 

using UnityEngine;

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
    }
}

 

3. #region 지시어, #endregion 지시어

 

#region 지시어,#endregion 지시어는 비주얼 스튜디오에서 확장 축소를 할 수 있는 코드 블록 지정할 수 있습니다.

 

사용 방법 : #region 지시문

#region 설명
...
#endregion

 

비주얼 스튜디오 #region 앞에 -버튼을 클릭하면, 코드 블록이 축소됩니다.

그리고 축소 된 코드 블록 앞의 +버튼을 클릭하면, 코드 블록이 확대됩니다.

 

 

728x90
반응형