平台依赖编译

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_ANDROIDAndroid 平台的平台定义。
UNITY_PS3运行 PlayStation 3 代码的平台定义。
UNITY_XBOX360执行 Xbox 360 代码的平台定义。
UNITY_NACLGoogle 本地客户端编译代码时的平台定义(在 UNITY_WEBPLAYER 进行设置)。
UNITY_FLASH为 Adobe Flash 编译代码的平台定义。
UNITY_BLACKBERRYBlackberry10 设备的平台定义。

您也可以选择性地编译代码,这取决于您正在使用的引擎版本。目前支持的有:

UNITY_2_6Unity 2.6 主要版本的平台定义。
UNITY_2_6_12.6 主要版本中指定版本 1 的平台定义。
UNITY_3_0Unity 3.0 主要版本的平台定义。
UNITY_3_0Unity 3.0 中指定版本 0 的平台定义。
UNITY_3_1Unity 3.1 主要版本的平台定义。
UNITY_3_2Unity 3.2 主要版本的平台定义。
UNITY_3_3Unity 3.3 主要版本的平台定义。
UNITY_3_4Unity 3.4 主要版本的平台定义。
UNITY_3_5Unity 3.5 主要版本的平台定义。
UNITY_4_0Unity 4.0 主要版本的平台定义。
UNITY_4_0_1Unity 4.0.1 主要版本的平台定义。
UNITY_4_1Unity 4.1 主要版本的平台定义。

注意:2.6.0 之前的版本没有平台定义,因为此功能在该版本中首次引入。

测试预编译代码。

我们将通过一个小例子展示预编译代码的使用方式。这将根据您构建目标所选择的平台,输出一条信息。

首先点击文件 (File) -> 构建设置 (Build Settings),选择测试代码的平台。这将打开构建设置窗口,选择目标平台。


在构建设置窗口中选择 WebPlayer 作为目标平台。

选择测试预编译代码需要的平台,然后按下切换编辑器 (Switch Editor) 按钮,提示 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