Unity включает в себя функцию под названием “Платформенно зависимая компиляция”. Она состоит из некоторых директив препроцессора, которые позволяют вам разделить свои скрипты для компиляции и выполнения части кода исключительно для одной из поддерживаемых платформ.
Кроме того, вы можете запустить этот код в редакторе, таким образом, вы можете скомпилировать код специально для вашего мобильного/консоли и проверить его в редакторе!
Определения платформ для ваших скриптов, которые Unity поддерживает:
Свойство: | Функция: | |
---|---|---|
UNITY_EDITOR | Определение для вызова скриптов редактора Unity из вашего игрового кода. | |
UNITY_EDITOR_WIN | Определение платформы для редактора кода на Windows. | |
UNITY_EDITOR_OSX | Определение платформы для редактора кода на Windows. | |
UNITY_STANDALONE_OSX | Определение платформы для компиляции/выполнения кода специально для Mac OS (это включает в себя Universal, PPC и Intel архитектуры). | |
UNITY_STANDALONE_WIN | Используйте, когда вы хотите скомпилировать/выполнить код для приложения на Windows. | |
UNITY_STANDALONE_LINUX | Используйте, когда вы хотите скомпилировать/выполнить код для приложения на Linux. | |
UNITY_STANDALONE | Используйте, когда вы хотите скомпилировать/выполнить код для любой платформы Mac, Windows или Linux. | |
UNITY_WII | Определение платформы для компиляции/выполнения кода для консоли Wii. | |
UNITY_IOS | Определение платформы для компиляции/выполнения кода для iPhone. | |
UNITY_IPHONE | Deprecated. Use UNITY_IOS instead. | |
UNITY_ANDROID | Определение платформы для Android. | |
UNITY_PS3 | Определение платформы для запуска кода на PlayStation 3. | |
UNITY_PS4 | Определение платформы для запуска кода на PlayStation 3. | |
UNITY_SAMSUNGTV | Определение платформы для выполнения кода на Samsung TV. | |
UNITY_XBOX360 | Определение платформы для выполнения кода на Xbox 360. | |
UNITY_XBOXONE | Определение платформы для выполнения кода на Xbox One. | |
UNITY_TIZEN | Определение платформы для Tizen. | |
UNITY_TVOS | Определение платформы для Apple TV. | |
UNITY_WP_8_1 | Определение платформы для Windows Phone 8. | |
UNITY_WSA | #define directive for Windows Store Apps. Additionally, NETFX_CORE is defined when compiling C# files against .NET Core. | |
UNITY_WSA_8_1 | Определение платформы для Windows Phone 8. | |
UNITY_WSA_10_0 | Определение платформы для Windows Store Apps (дополнительно определяется NETFX\CORE_ при компиляции C#-файлов в отношении ядра .NET).| |UNITY_WINRT__ | Same as UNITY_WSA. |
UNITY_WINRT_8_1 | Equivalent to UNITY_WP_8_1 | UNITY_WSA_8_1. This is also defined when compiling against Universal SDK 8.1. | |
UNITY_WINRT_10_0 | Equivalent to UNITY_WSA_10_0 | |
UNITY_WEBGL | Определение платформы для Windows Phone 8. | |
UNITY_ADS | Определение для вызова скриптов редактора Unity из вашего игрового кода. | |
UNITY_ANALYTICS | Определение для вызова скриптов редактора Unity из вашего игрового кода. | |
UNITY_ASSERTIONS | #define directive for assertions control process. |
From Unity 2.6.0 onwards, you can compile code selectively. The options available depend on the version of the Editor that you are working on. Given a version number X.Y.Z (for example, 2.6.0), Unity exposes three global #define directives in the following formats: UNITY_X, UNITY_X_Y and UNITY_X_Y_Z.
Here is an example of #define directives exposed in Unity 5.0.1:
UNITY_5 | Определение платформы для мажор-версии Unity 2.6. |
UNITY_5_0 | Определение платформы для мажор-версии Unity 3.0. |
UNITY_5_0_1 | Определение платформы для мажор-версии Unity 3.0. |
You can compile code selectively based on the earliest version of Unity required to compile or execute a given portion of code. Given the same version format as above (X.Y.Z), Unity exposes one global #define directive that can be used for this purpose, in the format UNITY_X_Y_OR_NEWER.
The supported #define directives are:
UNITY_5_3_OR_NEWER | Определение платформы для мажор-версии Unity 4.0. |
You can also compile code selectively depending on the scripting back-end.
ENABLE_MONO | Scripting back-end #define directive for Mono. |
ENABLE_IL2CPP | Scripting back-end #define directive for IL2CPP. |
ENABLE_DOTNET | Scripting back-end #define directive for .NET. |
You can also use the DEVELOPMENT_BUILD
#define directive to identify whether your script is running in a player which was built with the “Development Build” option enabled.
Мы собираемся показать небольшой пример, как использовать прекомпилированный код. В данном примере просто выводится сообщение в зависимости от платформы, которую вы выбрали в качестве целевой для сборки.
Во-первых, выберите платформу, для которой вы хотите проверить ваш код, кликнув на File ->_ Build Settings. Откроется окно Build Settings для выбора целевой платформы.
Выберите платформу, для который вы хотите проверить ваш прекомпилированный код, и нажмите кнопку Switch Editor, тем самым указывая 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
}
}
To test the code, click Play Mode. Confirm that the code works by checking for the relevant message in the Unity console, depending on which platform you selected - for example, if you choose iOS, the message “Iphone” is set to appear in the console.
Учтите, что в C# вы можете использовать атрибут CONDITIONAL
, который более прозрачен в использовании и является менее подверженным ошибкам способом вырезания функций, см. http://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx.
В дополнение к основной #if директиве компилятора, вы также можете использовать многооборотную проверку в C# и JavaScript:-
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iPhone");
#else
Debug.Log("Any other platform");
#endif
Кроме того, можно добавить определённые вами определения к встроенному набору. На панели Other Settings настроек проигрывателя (Player Settings), вы увидите текстовое поле Scripting Define Symbols.
Здесь вы можете указать имена обозначений, которые хотите определить для конкретной платформы, через точку с запятой. Эти обозначения можно затем использовать в качестве условий для директив #if также как встроенные.
Вы можете определить свои собственные директивы препроцессора, чтобы контролировать, какой код попадет в результат при компиляции. Для этого необходимо добавить текстовый файл с дополнительными директивами в папку “Assets/”. Имя файла зависит от языка, который вы используете, а расширение rsp.:
C# | <Путь проекта>/Assets/smcs.rsp |
C# - Скрипты редактора | <Путь проекта>/Assets/gmcs.rsp |
UnityScript | <Путь проекта>/Assets/us.rsp |
Например, если вы включите одну строку “-define:UNITY_DEBUG
” в ваш файл smcs.rsp, то определение UNITY_DEBUG
будет существовать как глобальное определение для скриптов на C#, за исключением скриптов редактора.
Каждый раз, когда вы вносите изменения в .rsp файлы вам нужно перекомпилировать, чтобы изменения были задействованы. Вы можете сделать это путем обновления или повторного импорта одного из файлов скриптов (.js, .cs или .boo).
NOTE
Если вы хотите изменить только глобальные определения, следует использовать Scripting Define Symbols в Player Settings, потому что это будет охватывать все компиляторы. Если вы выбираете .rsp файлы вместо этого, вы должны будете предоставить один файл для каждого компилятора используемый Unity, и вы не будете знать, когда используется тот или иной компилятор.
The use of .rsp files is described in the ‘Help’ section of the smcs application which is included in the Editor installation folder. You can get more information by running smcs -help
.
Note that the .rsp file needs to match the compiler being invoked. For example:
smcs.rsp
,gmcs.rsp
, andcsc.rsp
, etc.