자동 메모리 관리를 이해하기
제네릭 함수

플랫폼 의존 컴파일

Unity는 “플랫폼 의존 컴파일”이라는 기능이 있습니다. 여기에는 몇 가지 전 처리기 지시문이 포함되어, 스크립트를 ’파티션화’하여 코드의 일부 섹션을 지원하는 하나의 플랫폼 독점적으로 실행할 수 있게 됩니다.

또한 코드를 에디터 내에서 실행할 수 있기 때문에, 코드를 모바일/콘솔에 대해 컴파일 한 후 에디터에서 테스트할 수 있습니다.

플랫폼 매크로 정의

Unity 스크립트에서 지원하는 플랫폼 매크로 정의 :

프로퍼티: 기능:
UNITY_EDITOR Unity 스크립트에서 지원하는 플랫폼 매크로 정의 :
UNITY_EDITOR_WIN Windows에서의 플랫폼 정의 에디터 코드.
UNITY_EDITOR_OSX Mac OSX에서의 플랫폼 정의 에디터 코드.
UNITY_STANDALONE_OSX Mac OS (Univeral, PPC 및 Intel 아키텍처 포함) 의 코드 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_STANDALONE_WIN Windows 독립 실행형 응용 프로그램 코드를 컴파일 / 실행하고 싶을 때 사용합니다.
UNITY_STANDALONE_LINUX Linux 독립 실행형 응용 프로그램 코드를 컴파일 / 실행하고 싶을 때 사용합니다.
UNITY_STANDALONE 모든 독립 실행형 응용 프로그램(Mac, Windows 또는 Linux)의 코드를 컴파일 / 실행하고 싶을 때 사용합니다.
UNITY_WII Wii 콘솔 코드 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_IOS iOS 플랫폼에서 코드 컴파일/실행을 위한 플랫폼 매크로 정의
UNITY_IPHONE Deprecated. Use UNITY_IOS instead.
UNITY_ANDROID Android 플랫폼의 플랫폼 매크로 정의.
UNITY_PS3 PlayStation 3에서 코드 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_PS4 PlayStation 4에서 코드 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_SAMSUNGTV XBox 360 코드의 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_XBOX360 XBox 360 코드의 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_XBOXONE XBox One 코드의 컴파일 / 실행을 위한 플랫폼 매크로 정의.
UNITY_TIZEN Android 플랫폼의 플랫폼 매크로 정의.
UNITY_TVOS Android 플랫폼의 플랫폼 매크로 정의.
UNITY_WP_8 Windows Phone 8 플랫폼 매크로 정의.
UNITY_WP_8_1 Windows Phone 8.1 플랫폼 매크로 정의.
UNITY_WSA #define directive for Windows Store Apps. Additionally, NETFX_CORE is defined when compiling C# files against .NET Core.
UNITY_WSA_8_0 SDK 8.0을 타케팅했을 때의 Windows Store Apps 플랫폼 매크로 정의.
UNITY_WSA_8_1 SDK 8.1을 타케팅했을 때의 Windows Store Apps 플랫폼 매크로 정의.
UNITY_WSA_10_0 #define directive for Windows Store Apps when targeting Universal Windows 10 Apps. Additionally WINDOWS_UWP and NETFX_CORE are defined when compiling C# files against .NET Core.
UNITY_WINRT Equivalent to UNITY_WP_8 | UNITY_WSA.
UNITY_WINRT_8_0 Equivalent to UNITY_WP_8 | UNITY_WSA_8_0.
UNITY_WINRT_8_1 Equivalent to UNITY_WP_8_1 | UNITY_WSA_8_1. This is also defined when compiling against Universal SDK 8.1.
UNITY_WINRT_10_0 Equivalent to UNITY_WSA_10_0
UNITY_WEBGL WebGL 플랫폼 매크로 정의.
UNITY_ADS Unity 스크립트에서 지원하는 플랫폼 매크로 정의 :
UNITY_ANALYTICS Unity 스크립트에서 지원하는 플랫폼 매크로 정의 :
UNITY_ASSERTIONS #define directive for assertions control process.

또한 작업을 하고 있는 Unity 엔진 ​​버전에 따라 코드를 선택적으로 컴파일할 수 있습니다. 현재 지원되고 있는 것은 : Given a version number X.Y.Z (for example, 2.6.0), Unity exposes three global #define directives in the following formats: UNITY_X, UNITY_X_Y and UNITY_X_Y_Z.

Here is an example of #define directives exposed in Unity 5.0.1:

UNITY_5 Unity 2.6 버전의 플랫폼 매크로 정의.
UNITY_5_0 Unity 3.0 버전의 플랫폼 매크로 정의.
UNITY_5_0_1 Unity 3.0 버전의 플랫폼 매크로 정의.

You can compile code selectively based on the earliest version of Unity required to compile or execute a given portion of code. Given the same version format as above (X.Y.Z), Unity exposes one global #define directive that can be used for this purpose, in the format UNITY_X_Y_OR_NEWER.

The supported #define directives are:

UNITY_5_3_OR_NEWER Unity 5.0 버전의 플랫폼 매크로 정의.

You can also compile code selectively depending on the scripting back-end.

ENABLE_MONO Scripting back-end #define directive for Mono.
ENABLE_IL2CPP Scripting back-end #define directive for IL2CPP.
ENABLE_DOTNET Scripting back-end #define directive for .NET.

You can also use the DEVELOPMENT_BUILD #define directive to identify whether your script is running in a player which was built with the “Development Build” option enabled.

프리 컴파일(precompied) 코드 테스트

프리 컴파일 코드를 어떻게 사용하는지 간단한 예제를 보여줍니다. 이것은 선택한 빌드 대상 플랫폼을 기반으로 메시지를 간단하게 출력합니다.

먼저 코드를 테스트할 플랫폼을 선택하기 위해 File -> Build Settings를 클릭합니다. 이렇게 하면 대상 플랫폼을 선택하는 Build Settings 창이 표시됩니다.

![대상 플랫폼으로 Web Player를 선택한 Build Settings 창](../uploads/ Main/BuildSettings.png)

프리컴파일된 코드를 테스트하길 원하는 플랫폼을 선택하고 Switch Platform을 눌러, Unity에 어떤 플랫폼을 대상으로 할 것인지 Unity에 알립니다.

스크립트를 만들고 다음 코드를 복사하여 붙여 넣습니다 :

// JS
function Awake() {
  #if UNITY_EDITOR
    Debug.Log("Unity Editor");
  #endif
    
  #if UNITY_IPHONE
    Debug.Log("Iphone");
  #endif

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

  #if UNITY_STANDALONE_WIN
    Debug.Log("Stand Alone Windows");
  #endif    
}


// C#
using UnityEngine;
using System.Collections;

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

  }          
}


To test the code, click Play Mode. Confirm that the code works by checking for the relevant message in the Unity console, depending on which platform you selected - for example, if you choose iOS, the message “Iphone” is set to appear in the console.

C#에서는 CONDITIONAL 어트리뷰트를 사용하여 오류가 적고 더 깔끔하게 만들 수 있습니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx를 참조하십시오.

기본적인 #if 컴파일러 지시문뿐만 아니라 C# 및 JavaScript 어느 쪽이라도 다음 테스트를 할 수 있습니다 : -


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

#elif UNITY_IOS
    Debug.Log("Unity iPhone");

#else
    Debug.Log("Any other platform");

#endif


플랫폼의 사용자 정의

내장 선택에 자신의 사용자 지정 정의를 추가할 수 있습니다. Player SettingsOther Settings에 의해, Scripting Define Symbols 텍스트 상자가 표시됩니다.

여기서 특정 플랫폼에서 정의하려는 심볼 이름을 입력하고 세미콜론으로 구분할 수 있습니다. 이 기호는 내장된 것과 마찬가지로 #if 지시문의 조건으로 사용할 수 있습니다.

전역 사용자 정의

자신의 사용자 지정 전처리기 지시문을 정의하여 컴파일시에 어떤 코드를 include하거나 제어할 수 있습니다. 이렇게 하려면 추가 디렉티브를 포함한 텍스트 파일을 “Assets/”폴더에 추가합니다. 파일의 이름은 사용하는 언어에 따라 달라지며, 확장자는 .rsp 입니다 :

C# <Project Path>/Assets/smcs.rsp
C# - Editor Scripts <Project Path>/Assets/gmcs.rsp
UnityScript <Project Path>/Assets/us.rsp

예를 들어, 만약 smcs.rsp 에 “-define:UNITY_DEBUG”을 한 줄 포함하면 UNITY_DEBUG 의 정의는 C# 스크립트에서 에디터 스크립트를 제외하고 전역 사용자 지정 정의로 존재하게 됩니다.

.rsp 파일을 변경할 때마다, 이것이 유효하려면 다시 컴파일해야 합니다. 이를 위해 별도의 스크립트 파일 (.js, .cs)를 업데이트하거나 다시 임포트합니다.

NOTE

전역 정의만 수정할 경우, 모든 컴파일러를 충당하기 위해 Player SettingsScripting Define Symbols를 수정해야 합니다. 만약 대신 .rsp 변경을 선택하면 Unity가 사용하는 컴파일러마다 하나의 파일을 제공해야 하며, 어떤 컴파일러가 사용되고 있는지 여부를 알 수 없습니다.

The use of .rsp files is described in the ‘Help’ section of the smcs application which is included in the Editor installation folder. You can get more information by running smcs -help.

Note that the .rsp file needs to match the compiler being invoked. For example:

  • when targeting the web player, smcs is used with smcs.rsp,
  • when targeting standalone players, gmcs is used with gmcs.rsp, and
  • when targeting MS compiler, csc is used with csc.rsp, etc.
자동 메모리 관리를 이해하기
제네릭 함수