unity平台的预处理
在开发过程中,尤其是进行Unity跨平台开发时,我们常常需要在不同平台(如安卓版、苹果版、PC版等)之间进行适配。在不同的平台上,可能需要执行不同的操作。这时,我们可以利用Unity自带的平台宏定义来进行平台判断。
Unity平台预处理宏定义
Unity为我们定义了以下平台预处理宏:
| 名称 | 描述 |
| --- | --- |
| UNITY_EDITOR | 用于从游戏代码中调用Unity编辑器脚本的定义。 |
| UNITY_STANDALONE_OSX | 专门为Mac OS(包括通用、PPC和英特尔架构)编译/执行代码的平台定义。 |
| 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编译代码时的平台定义。 |
根据这些宏定义,我们可以很方便地在代码中加入平台判断。以下是一个简单的示例:
using UnityEngine;
using System.Collections;
public class Recompile : MonoBehaviour
{
private string platform = string.Empty;
// Use this for initialization
void Start()
{
DebugPlatformMessage();
}
void DebugPlatformMessage()
{
#if UNITY_EDITOR
platform = "hi,大家好,我是在unity编辑模式下";
#elif UNITY_XBOX360
platform = "hi,大家好,我在XBOX360平台";
#elif UNITY_IPHONE
platform = "hi,大家好,我是IPHONE平台";
#elif UNITY_ANDROID
platform = "hi,大家好,我是ANDROID平台";
#elif UNITY_STANDALONE_OSX
platform = "hi,大家好,我是OSX平台";
#elif UNITY_STANDALONE_WIN
platform = "hi,大家好,我是Windows平台";
#endif
Debug.Log("Current Platform:" + platform);
}
}
如果在Editor状态下运行上述代码,控制台将打印出相应的信息。
自定义宏定义
我们也可以在PlayerSetting中自定义宏定义。例如,在PlayerSetting中填写一个预编译指令CUSTOM_ITF,然后在DebugPlatformMessage函数尾部添加以下代码:
// 新添加的内容
string customMsg = string.Empty;
#if CUSTOM_ITF
customMsg = "我自定义了预编译";
#endif
Debug.Log(customMsg);
运行代码后,在控制台就能看到输出的信息。当我们去掉自定义的宏定义时,打印的信息将不再显示。
Unity各版本的宏定义
除了平台宏定义,Unity中还有各个版本的宏定义,这些宏定义通常会被开发插件的开发者使用。以下是一些常见的版本宏定义: | 名称 | 描述 | | --- | --- | | UNITY_2_6 | 用于Unity 2.6主版本的平台定义。 | | UNITY_2_6_1 | 用于Unity 2.6主版本中特定版本1的平台定义。 | | UNITY_3_0 | 用于Unity 3.0主版本的平台定义。 | | UNITY_3_0_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主版本的平台定义。 | | UNITY_4_2 | 用于Unity 4.2主版本的平台定义。 |
预编译的其他作用
性能优化
在Unity开发中,预编译还有一个重要的作用。在Debug时,IO操作会消耗CPU资源,从而影响性能。我们希望在开发阶段进行Debug,但在发布时不打印Debug信息。这时,可以使用预编译来判断是否处于Editor状态,从而进行相应的操作。
版本控制
预处理命令不会被翻译为可执行命令,但会影响编译过程的各个方面。例如,使用预处理器指令可以禁止编译器编译代码的某一部分。如果计划发布两个版本的代码,即基本版本和功能更丰富的企业版本,可以使用这些预处理指令。在编译软件的基本版本时,使用预处理器指令禁止编译器编译与额外功能相关的代码。另外,在编写提供调试信息的代码时,也可以使用预处理器指令,在销售软件时,通常不希望编译这部分代码。预处理器指令以符号#开头。Unity分为专业版和免费版,可能就是利用了预编译来编译不同的版本。