0. 전처리기란?
0.1 실행 파일 생성 프로세스
프로그래밍을 하고 실행파일을 만드는 과정은 다음의 프로세스로 진행됩니다.
① 소스 파일 작업 : 눈물나는 작업이죠. ㅜㅜ
② 컴파일(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 앞에 -버튼을 클릭하면, 코드 블록이 축소됩니다.
그리고 축소 된 코드 블록 앞의 +버튼을 클릭하면, 코드 블록이 확대됩니다.
'프로그램 > 유니티 C# 강좌' 카테고리의 다른 글
[유니티 C# 강좌] 18. 익명 형식, 익명 메서드, 람다식, Func 대리자, Action 대리자 (0) | 2020.02.05 |
---|---|
[유니티 C# 강좌] 17. 이벤트(Event), 대리자 (델리게이트, Delegate) (0) | 2020.02.04 |
[유니티 C# 강좌] 15. 제네릭 (Generics) (0) | 2020.01.29 |
[유니티 C# 강좌] 14. 구조체(Struct) (0) | 2020.01.29 |
[유니티 C# 강좌] 13. 클래스(Class) (2) | 2020.01.29 |