Unity-平臺(tái)相關(guān)的編譯
Unity 包括名為__平臺(tái)相關(guān)的編譯 (Platform Dependent Compilation)__ 的功能。此功能包括一些預(yù)處理器指令,可讓您對(duì)腳本進(jìn)行分區(qū),從而為受支持平臺(tái)之一專門編譯和執(zhí)行一段代碼。
您可以在 Unity Editor 中運(yùn)行此代碼,這樣便可專門為目標(biāo)平臺(tái)編譯代碼并在 Editor 中對(duì)其進(jìn)行測(cè)試!
平臺(tái) #define 指令
Unity 支持對(duì)腳本使用的平臺(tái) #define 指令如下:
屬性:????????????????????????????????????????????????????????????????功能:
UNITY_EDITOR?????????????????????????用于從游戲代碼中調(diào)用 Unity Editor 腳本的 #define 指令。UNITY_EDITOR_WIN????????????????用于 Windows 上的 Editor 代碼的 #define 指令。UNITY_EDITOR_OSX???????????????用于 Mac OS X 上的 Editor 代碼的 #define 指令。UNITY_STANDALONE_OSX????用于專門為 Mac OS X(包括 Universal、PPC 和 Intel 架構(gòu))編譯/執(zhí)行代碼的 #define 指令。
UNITY_STANDALONE_WIN????用于專門為 Windows 獨(dú)立平臺(tái)應(yīng)用程序編譯/執(zhí)行代碼的 #define 指令。
UNITY_STANDALONE_LINUX?用于專門為 Linux 獨(dú)立平臺(tái)應(yīng)用程序編譯/執(zhí)行代碼的 #define 指令。
UNITY_STANDALONE?????????????用于為任何獨(dú)立平臺(tái)(Mac OS X、Windows 或 Linux)編譯/執(zhí)行代碼的 #define 指令。
UNITY_WII????????????????????????????????用于為 Wii 游戲主機(jī)編譯/執(zhí)行代碼的 #define 指令。UNITY_IOS???????????????????????????????用于為 iOS 平臺(tái)編譯/執(zhí)行代碼的 #define 指令。UNITY_IPHONE???????????????????????已棄用。改用?UNITY_IOS。
UNITY_ANDROID????????????????????用于 Android 平臺(tái)的 #define 指令。
UNITY_PS4??????????????????????????????用于運(yùn)行 PlayStation 4 代碼的 #define 指令。
UNITY_XBOXONE????????????????? ?用于執(zhí)行 Xbox One 代碼的 #define 指令。
UNITY_TIZEN??????????????????????????用于 Tizen 平臺(tái)的 #define 指令。
UNITY_TVOS????????????????????????? ?用于 Apple TV 平臺(tái)的 #define 指令。
UNITY_WSA????????????????????????????用于通用 Windows 平臺(tái)的 #define 指令。此外,根據(jù) .NET Core 和使用 .NET 腳本后端來編譯 C# 文件時(shí)會(huì)定義?NETFX_CORE。
UNITY_WSA_10_0??????????????????用于通用 Windows 平臺(tái)的 #define 指令。此外,根據(jù) .NET Core 來編譯 C# 文件時(shí)會(huì)定義?WINDOWS_UWP。UNITY_WINRT與?UNITY_WSA?相同。UNITY_WINRT_10_0????????????? ?等效于?UNITY_WSA_10_0UNITY_WEBGL用于 WebGL 的 #define 指令。
UNITY_FACEBOOK?????????????????用于 Facebook 平臺(tái)(WebGL 或 Windows 獨(dú)立平臺(tái))的 #define 指令。
UNITY_ADS??????????????????????????????用于從游戲代碼中調(diào)用 Unity Ads 方法的 #define 指令。5.2 及更高版本。
UNITY_ANALYTICS?????????????????用于從游戲代碼中調(diào)用 Unity Analytics 方法的 #define 指令。5.2 及更高版本。
UNITY_ASSERTIONS??????????????用于斷言控制過程的 #define 指令。
從 Unity 2.6.0 開始,可有選擇地編譯代碼??捎眠x項(xiàng)取決于所使用的 Editor 版本。 如果版本號(hào)為?X.Y.Z__(例如,2.6.0),Unity 將使用以下格式公開三個(gè)全局 #define 指令:__UNITY_X、UNITY_X_Y?和?UNITY_X_Y_Z。
以下是 Unity 5.0.1 中公開的 #define 指令的示例:
UNITY_5????????????????????用于 Unity 5 發(fā)行版的 #define 指令,在每個(gè) 5.X.Y 版本中公開。
UNITY_5_0????????????????用于 Unity 5.0 主要版本的 #define 指令,在每個(gè) 5.0.Z 版本中公開。
UNITY_5_0_1????????????用于 Unity 5.0.1 次要版本的 #define 指令。
從 Unity 5.3.4 開始,可根據(jù)編譯或執(zhí)行給定代碼部分所需的最早 Unity 版本來有選擇地編譯代碼。如果采用與上面相同的版本格式 (X.Y.Z),Unity 將以?UNITY_X_Y_OR_NEWER?格式公開一個(gè)可用于此目的的全局 #define。
支持的 #define 指令為:
CSHARP_7_3_OR_NEWER????????????????在構(gòu)建支持 C# 7.3 或更高版本的腳本時(shí)定義。
ENABLE_MONO??????????????????????????????????用于 Mono 的腳本后端 #define。
ENABLE_IL2CPP????????????????????????????????用于 IL2CPP 的腳本后端 #define。
ENABLE_DOTNET?????????????????????????????用于 .NET 的腳本后端 #define。
NETFX_CORE?????????????????????????????????????在 .NET 上根據(jù) .NET Core 類庫構(gòu)建腳本時(shí)定義。
NET_2_0??????????????????????????????????????????????在 Mono 和 IL2CPP 上根據(jù) .NET 2.0 API 兼容性級(jí)別構(gòu)建腳本時(shí)定義。
NET_2_0_SUBSET?????????????????????????????在 Mono 和 IL2CPP 上根據(jù) .NET 2.0 Subset API 兼容性級(jí)別構(gòu)建腳本時(shí)定義。
NET_LEGACY????????????????????????????????????在 Mono 和 IL2CPP 上根據(jù) .NET 2.0 或 .NET 2.0 Subset API 兼容性級(jí)別構(gòu)建腳本時(shí)定義。
NET_4_6?????????????????????????????????????????????在 Mono 和 IL2CPP 上根據(jù) .NET 4.x API 兼容性級(jí)別構(gòu)建腳本時(shí)定義。
NET_STANDARD_2_0???????????????????????在 Mono 和 IL2CPP 上根據(jù) .NET 標(biāo)準(zhǔn) 2.0 API 兼容性級(jí)別構(gòu)建腳本時(shí)定義。
ENABLE_WINMD_SUPPORT????????? ?在 IL2CPP 和 .NET 上啟用 Windows 運(yùn)行時(shí)支持時(shí)定義。有關(guān)更多詳細(xì)信息,請(qǐng)參閱?Windows 運(yùn)行時(shí)支持。
可使用 DEVELOPMENT_BUILD #define 來確定腳本是否正在啟用了“Development Build”選項(xiàng)的情況下構(gòu)建的播放器中運(yùn)行。
還可根據(jù)腳本后端有選擇地編譯代碼。
測(cè)試預(yù)編譯的代碼
下面是如何使用預(yù)編譯代碼的示例。該示例根據(jù)為目標(biāo)構(gòu)建選擇的平臺(tái)打印一條消息。
首先,通過?File > Build Settings?選擇要測(cè)試代碼的平臺(tái)。隨后將顯示?Build Settings?窗口;從此處選擇目標(biāo)平臺(tái)。

選擇要測(cè)試預(yù)編譯代碼的平臺(tái),然后單擊?Switch Platform?向 Unity 告知您所需的目標(biāo)平臺(tái)。
創(chuàng)建腳本并復(fù)制/粘貼以下代碼:
要測(cè)試代碼,請(qǐng)單擊?Play Mode。通過在 Unity 控制臺(tái)中檢查相關(guān)消息來確認(rèn)代碼是否正常工作,具體取決于選擇的平臺(tái);例如,如果選擇 __iOS__,則消息“Iphone”設(shè)置為顯示在控制臺(tái)中。
在 C# 中,可使用?CONDITIONAL
?屬性,這是一種更簡(jiǎn)潔、更不容易出錯(cuò)的函數(shù)剝離方式。請(qǐng)參閱?ConditionalAttribute 類以了解更多信息。 請(qǐng)注意,常見的 Unity 回調(diào)(例如:Start()、Update()、LateUpdate()、FixedUpdate()、Awake())不受此屬性的影響,因?yàn)樗鼈兪侵苯訌囊嬲{(diào)用的,并且出于性能原因,此屬性不會(huì)考慮它們。
除了基本的?#if
?編譯器指令外,還可在 C# 中使用多路測(cè)試:
平臺(tái)自定義 #define 指令
您也可以向內(nèi)置的 #define 指令集合中添加您自己的指令。打開?Player Settings?的?Other Settings?面板,并導(dǎo)航到?Scripting Define Symbols?文本框。

輸入要為該特定平臺(tái)定義的符號(hào)名稱,以分號(hào)分隔。隨后可以將這些符號(hào)用作?#if
?指令中的條件,就像內(nèi)置條件一樣。
全局自定義 #define 指令
您可以定義自己的預(yù)處理器指令來控制在編譯時(shí)包含的代碼。為此,必須將包含額外指令的文本文件添加到?Assets?文件夾。文件名取決于您使用的語言。擴(kuò)展名為 __.rsp__:
C#(播放器和 Editor 腳本)????????????????????????????????????<項(xiàng)目路徑>/Assets/mcs.rsp
舉例來說,如果在?mcs.rsp?文件中包含單行?-define:UNITY_DEBUG
,則 #define 指令?UNITY_DEBUG
?將作為 C# 腳本的全局 #define 指令存在,但 Editor 腳本除外。
每次對(duì)?.rsp?文件進(jìn)行更改時(shí),都需要重新編譯才能使更改生效??赏ㄟ^更新或重新導(dǎo)入單個(gè)腳本(.js 或 .cs)文件來完成此操作。
注意
如果只想修改全局 #define 指令,請(qǐng)使用?Player?設(shè)置中的?Scripting Define Symbols__,因?yàn)榇诉x項(xiàng)涵蓋了所有編譯器。如果選擇?.rsp__ 文件,則需要為 Unity 使用的每個(gè)編譯器提供一個(gè)文件。
包含在 Editor 安裝文件夾中的?mcs?應(yīng)用程序的“Help”部分中描述了?.rsp?文件的使用方法??赏ㄟ^運(yùn)行?mcs -help
?獲取更多信息。
請(qǐng)注意,.rsp?文件需要與正在調(diào)用的編譯器匹配。例如:
當(dāng)針對(duì) .NET 3.5 Equivalent(已棄用)腳本運(yùn)行時(shí)版本時(shí),__mcs__ 與?
mcs.rsp
?一起使用,當(dāng)針對(duì) .NET 4.x Eqivalent 腳本運(yùn)行時(shí)版本編譯器時(shí),__csc__ 與?
csc.rsp
?一起使用。