Unity 包含名为“平台依赖编译 (Platform Dependent Compilation)”的功能。它包含一些预处理器指令,让您可以分割脚本,在支持的平台上专门编译和执行某一段代码。
此外,可以在编辑器中运行这一代码,从而为特定的手机/控制台编译代码并在编辑器中测试!
Unity 支持的平台定义脚本有:
UNITY_EDITOR | 定义从游戏代码中调用 Unity 编辑器脚本。 |
UNITY_STANDALONE_OSX | 专门用于 Mac OS 编译/执行的代码(包括 Universal、PPC 和 Intel架构)的平台定义。 |
UNITY_DASHBOARD_WIDGET | 为 Mac OS 仪表板小部件创建代码时的平台定义。 |
UNITY_STANDALONE_WIN | 为 Windows 独立应用程序编译/执行代码时使用的功能。 |
UNITY_STANDALONE_LINUX | 为 Linux 独立应用程序编译/执行代码时使用的功能。 |
UNITY_STANDALONE | 此功能可用来为任何独立平台(Mac、Windows 或 Linux)编译/执行代码。 |
UNITY_WEBPLAYER | 网络播放器内容的平台定义(包括 Windows 和 Mac 网络播放器可执行文件)。 |
UNITY_WII | 为 Wii 控制台编译/执行代码的平台定义。 |
UNITY_IPHONE | 为 iPhone 平台编译/执行代码的平台定义。 |
UNITY_ANDROID | Android 平台的平台定义。 |
UNITY_PS3 | 运行 PlayStation 3 代码的平台定义。 |
UNITY_XBOX360 | 执行 Xbox 360 代码的平台定义。 |
UNITY_NACL | Google 本地客户端编译代码时的平台定义(在 UNITY_WEBPLAYER 进行设置)。 |
UNITY_FLASH | 为 Adobe Flash 编译代码的平台定义。 |
UNITY_BLACKBERRY | Blackberry10 设备的平台定义。 |
您也可以选择性地编译代码,这取决于您正在使用的引擎版本。目前支持的有:
UNITY_2_6 | Unity 2.6 主要版本的平台定义。 |
UNITY_2_6_1 | 2.6 主要版本中指定版本 1 的平台定义。 |
UNITY_3_0 | Unity 3.0 主要版本的平台定义。 |
UNITY_3_0 | Unity 3.0 中指定版本 0 的平台定义。 |
UNITY_3_1 | Unity 3.1 主要版本的平台定义。 |
UNITY_3_2 | Unity 3.2 主要版本的平台定义。 |
UNITY_3_3 | Unity 3.3 主要版本的平台定义。 |
UNITY_3_4 | Unity 3.4 主要版本的平台定义。 |
UNITY_3_5 | Unity 3.5 主要版本的平台定义。 |
UNITY_4_0 | Unity 4.0 主要版本的平台定义。 |
UNITY_4_0_1 | Unity 4.0.1 主要版本的平台定义。 |
UNITY_4_1 | Unity 4.1 主要版本的平台定义。 |
注意:2.6.0 之前的版本没有平台定义,因为此功能在该版本中首次引入。
我们将通过一个小例子展示预编译代码的使用方式。这将根据您构建目标所选择的平台,输出一条信息。
首先点击
,选择测试代码的平台。这将打开构建设置窗口,选择目标平台。选择测试预编译代码需要的平台,然后按下
按钮,提示 Unity 您的目标平台。创建一个脚本,复制/粘贴以下代码:
JavaScript 示例:
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_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 } }
Boo 示例:
import UnityEngine class PlatformDefines (MonoBehaviour): def Start (): ifdef UNITY_EDITOR: Debug.Log("Unity Editor") ifdef UNITY_IPHONE: Debug.Log("IPhone") ifdef UNITY_STANDALONE_OSX: Debug.Log("Stand Alone OSX") ifdef not UNITY_IPHONE: Debug.Log("not an iPhone")
然后,根据所选择的平台,按下 “play” 时,Unity 控制台将输出一条信息。
除基础 #if 编译器指令以外,还可以在 C# 和 JavaScript 中使用多路测试:
#if UNITY_EDITOR Debug.Log("Unity Editor"); #elif UNITY_IPHONE Debug.Log("Unity iPhone"); #else Debug.Log("Any other platform"); #endif
但是,Boo 目前仅支持 ifdef 指令。
也可以提供 自己的脚本,将其添加至内置定义选择中。在播放器设置 (Player Settings) 的其他设置 (Other Settings) 面板中,您将看到脚本定义符号 (Scripting Define Symbols) 文本框。
在这里,可以输入想要为这一特定平台定义的符号,用分号隔开。这些符号可以作为 #if 指令的条件,就像内置符号一样。
可以定义自己的预处理器指令,控制在编译时可以使用哪些代码。为此,必须添加带有其他指令的文本文件至“资源 (Assets/)” 文件夹。文件的名称取决于使用的语言,扩展名为.rsp:
C# | <Project Path>/Assets/smcs.rsp |
C# - Editor Scripts | <Project Path>/Assets/gmcs.rsp |
UnityScript | <Project Path>/Assets/us.rsp |
Boo | <Project Path>/Assets/boo.rsp |
例如,如果在smcs.rsp文件中包含独立行 "-define:UNITY_DEBUG
",定义的 UNITY_DEBUG
将作为 C# 脚本的全局定义,编辑器脚本除外。
每次更改 .rsp 文件,都需要重新编译才能保证有效。只需更新或重新导入单个脚本 (.js, .cs or .boo) 文件即可。
如果只需要修改全局定义,应使用播放器设置 (Player Settings) 中的脚本定义符号 (Scripting Define Symbols),因为这将覆盖所有编译器。若选择 .rsp 文件,就必须为 Unity 使用的每个编译器提供 一个文件,并且将无法了解何时使用一个或另一个编译器。
.rsp 文件的使用在 smcs 应用程序(包含在编辑器安装文件夹中)的帮助部分有详细说明。可以运行 "smcs -help
" 了解更多信息。同时,请务必记住,.rsp 文件必须与调用的编译器匹配。例如,如果针对网络播放器,smcs 将与 smcs.rsp 同时使用;如果针对独立播放器,gmcs 将与 gmcs.rsp 同时使用;如果针对 MS 编译器,csc 将与 csc.rsp 同时使用,等等。
Page last updated: 2013-06-29