依赖于平台的编译
Unity包含一个名为Platform Dependent Compilation的功能。这包含一些预处理程序指令,可让您对脚本进行
分区以便为其中一个受支持的平台编译和执行一段代码。
您可以在Unity Editor中运行此代码,这样您就可以专门为目标平台编译代码并在编辑器中对其进行测试!
Unity支持脚本的平台#define指令如下:
属性: | 功能: |
---|---|
UNITY_EDITOR | #define指令,用于从游戏代码中调用Unity Editor脚本。 |
UNITY_EDITOR_WIN | Windows上编辑器代码的#define指令。 |
UNITY_EDITOR_OSX | Mac OS X上编辑器代码的#define指令。 |
UNITY_STANDALONE_OSX | #define指令,用于编译/执行专门用于Mac OS X的代码(包括Universal,PPC和Intel架构)。 |
UNITY_STANDALONE_WIN | #define指令,用于专门为Windows独立应用程序编译/执行代码。 |
UNITY_STANDALONE_LINUX | #define指令,用于专门为Linux独立应用程序编译/执行代码。 |
UNITY_STANDALONE | #define指令,用于编译/执行任何独立平台(Mac OS X,Windows或Linux)的代码。 |
UNITY_WII | #define指令,用于编译/执行Wii控制台的代码。 |
UNITY_IOS | #define指令,用于编译/执行iOS平台的代码。 |
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指令。此外,NETFX_CORE是在针对.NET Core编译C#文件和使用.NET 脚本后端时定义的 |
UNITY_WSA_10_0 | 通用Windows平台的#define指令。另外,在针对.NET Core编译C#文件时定义了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 | #define指令,用于从您的游戏代码中调用Unity Ads方法。5.2及更高版本。 |
UNITY_ANALYTICS | 用于调用Unity Analytics的 #define指令为游戏代码方法。5.2及更高版本。 |
UNITY_ASSERTIONS | 断言控制进程的#define指令。 |
从Unity 2.6.0开始,您可以有选择地编译代码。可用选项取决于您正在处理的编辑器的版本。给定版本号XYZ(例如,2.6.0),Unity以下列格式公开三个全局#define指令:UNITY_X,UNITY_X_Y和UNITY_X_Y_Z。
以下是Unity 5.0.1中公开的#define指令的示例:
UNITY_5 | 每个5.XY版本都公开了Unity 5发行版的#define指令。 |
UNITY_5_0 | 主要版本Unity 5.0的#define指令,在每个5.0.Z版本中公开。 |
UNITY_5_0_1 | Unity 5.0.1次要版本的#define指令。 |
从Unity 5.3.4开始,您可以根据编译或执行给定代码部分所需的最早版本Unity来有选择地编译代码。给定与上述相同的版本格式(XYZ),Unity以UNITY_X_Y_OR_NEWER格式公开一个全局#define ,可用于此目的。
支持的#define指令是:
CSHARP_7_3_OR_NEWER | 在构建支持C#7.3或更高版本的脚本时定义。 |
ENABLE_MONO | 为Mono编写后端#define脚本。 |
ENABLE_IL2CPP | 用于IL2CPP的 脚本后端#define 。 |
ENABLE_DOTNET | 脚本编写后端#define for .NET。 |
NETFX_CORE | 在.NET上针对.NET Core类库构建脚本时定义。 |
NET_2_0 | 在Mono和IL2CPP上针对.NET 2.0 API兼容级别构建脚本时定义。 |
NET_2_0_SUBSET | 在Mono和IL2CPP上针对.NET 2.0 Subset API兼容级别构建脚本时定义。 |
NET_LEGACY | 在Mono和IL2CPP上针对.NET 2.0或.NET 2.0子集API兼容级别构建脚本时定义。 |
NET_4_6 | 在Mono和IL2CPP上针对.NET 4.x API兼容级别构建脚本时定义。 |
NET_STANDARD_2_0 | 在Mono和IL2CPP上针对.NET Standard 2.0 API兼容级别构建脚本时定义。 |
ENABLE_WINMD_SUPPORT | 在IL2CPP和.NET上启用Windows运行时支持时定义。有关详细信息,请参阅Windows运行时支持。 |
您可以使用DEVELOPMENT_BUILD #define来确定您的脚本是否在使用“ 开发构建
” 构建的播放器中运行 “选项已启用。
您还可以根据脚本后端选择性地编译代码。
测试预编译的代码
下面是如何使用预编译代码的示例。它会打印一条消息,该消息取决于您为目标构建选择的平台。
首先,通过转到文件>构建设置,选择要测试代码的平台。这将显示“ 构建设置”窗口; 从这里选择您的目标平台。
选择PC,Mac和Linux作为目标平台的Build Settings窗口
选择要测试预编译代码的平台,然后单击“ 切换平台”以告知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
}
}
要测试代码,请单击“ 播放模式”。通过在Unity控制台中检查相关消息来确认代码是否正常工作,具体取决于您选择的平台 - 例如,如果您选择iOS “Iphone”设置为出现在控制台中。
在C#中,您可以使用一个CONDITIONAL
更清晰,更不容易出错的方法来剥离函数。有关更多信息,请参阅ConditionalAttribute类。请注意,常见的Unity回调(例如Start(),Update(),LateUpdate(),FixedUpdate(),Awake())不受此属性的影响,因为它们是直接从引擎调用的,并且出于性能原因,它会不要考虑它们。
除了基本的#if
编译器指令外,您还可以在C#中使用多路测试:
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iPhone");
#else
Debug.Log("Any other platform");
#endif
平台自定义#defines
也可以通过提供自己的#define指令来添加内置的#define指令选项。打开“ 播放器设置
”的其他设置”面板,并导航到“ 脚本定义符号”文本框。
输入要为该特定平台定义的符号名称,以分号分隔。然后可以将这些符号用作#if
指令的条件,就像内置指令一样。