Unity判断所在平台编译

依赖于平台的编译

官方API

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_XUNITY_X_YUNITY_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来确定您的脚本是否在使用“ 开发构建
 ” 构建的播放器中运行 “选项已启用。

您还可以根据脚本后端选择性地编译代码。

测试预编译的代码

下面是如何使用预编译代码的示例。它会打印一条消息,该消息取决于您为目标构建选择的平台。

首先,通过转到文件>构建设置,选择要测试代码的平台。这将显示“ 构建设置”窗口; 从这里选择您的目标平台。

Unity判断所在平台编译_第1张图片

选择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指令选项。打开“ 播放器设置
”的其他设置”面板,并导航到“ 脚本定义符号”文本框。

Unity判断所在平台编译_第2张图片

输入要为该特定平台定义的符号名称,以分号分隔。然后可以将这些符号用作#if指令的条件,就像内置指令一样。

你可能感兴趣的:(Unity编译)