Unity’s Platform Dependent Compilation feature consists of some preprocessor directives that let you partition your scriptsA piece of code that allows you to create your own Components, trigger game events, modify Component properties over time and respond to user input in any way you like. More info
See in Glossary to compile and execute a section of code exclusively for one of the supported platforms.
You can run this code within the Unity Editor, so you can compile the code specifically for your target platform and test it in the Editor.
The platform #define directives that Unity supports for your scripts are as follows:
Define | Function |
---|---|
UNITY_EDITOR | #define directive to call Unity Editor scripts from your game code. |
UNITY_EDITOR_WIN | #define directive for Editor code on Windows. |
UNITY_EDITOR_OSX | #define directive for Editor code on Mac OS X. |
UNITY_EDITOR_LINUX | #define directive for Editor code on Linux. |
UNITY_STANDALONE_OSX | #define directive to compile or execute code specifically for Mac OS X (including Universal, PPC and Intel architectures). |
UNITY_STANDALONE_WIN | #define directive for compiling/executing code specifically for Windows standalone applications. |
UNITY_STANDALONE_LINUX | #define directive for compiling/executing code specifically for Linux standalone applications. |
UNITY_STANDALONE | #define directive for compiling/executing code for any standalone platform (Mac OS X, Windows or Linux). |
UNITY_WII | #define directive for compiling/executing code for the Wii console. |
UNITY_IOS | #define directive for compiling/executing code for the iOS platform. |
UNITY_IPHONE | Deprecated. Use UNITY_IOS instead. |
UNITY_ANDROID | #define directive for the Android platform. |
UNITY_PS4 | #define directive for running PlayStation 4 code. |
UNITY_XBOXONE | #define directive for executing Xbox One code. |
UNITY_SWITCH | #define directive for executing Nintendo Switch code. |
UNITY_LUMIN | #define directive for the Magic Leap OS platform. You can also use PLATFORM_LUMIN. |
UNITY_TIZEN | #define directive for the Tizen platform. |
UNITY_TVOS | #define directive for the Apple TV platform. |
UNITY_WSA | #define directive for Universal Windows PlatformAn IAP feature that supports Microsoft’s In App Purchase simulator, which allows you to test IAP purchase flows on devices before publishing your application. More info See in Glossary. Additionally, NETFX_CORE is defined when compiling C# files against .NET Core and using .NET scripting backendA framework that powers scripting in Unity. Unity supports three different scripting backends depending on target platform: Mono, .NET and IL2CPP. Universal Windows Platform, however, supports only two: .NET and IL2CPP. More info See in Glossary. |
UNITY_WSA_10_0 | #define directive for Universal Windows Platform. Additionally WINDOWS_UWP is defined when compiling C# files against .NET Core. |
UNITY_WEBGL | #define directive for WebGLA JavaScript API that renders 2D and 3D graphics in a web browser. The Unity WebGL build option allows Unity to publish content as JavaScript programs which use HTML5 technologies and the WebGL rendering API to run Unity content in a web browser. More info See in Glossary. |
UNITY_FACEBOOK | #define directive for the Facebook platform (WebGL or Windows standalone). |
UNITY_ANALYTICS | #define directive for calling Unity AnalyticsA data platform that provides analytics for your Unity game. More info See in Glossary methods from your game code. Version 5.2 and above. |
UNITY_ASSERTIONS | #define directive for assertions control process. |
UNITY_64 | #define directive for 64-bit platforms. |
You can also 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 2019.4.14:
Define | Function |
---|---|
UNITY_2019 | #define directive for the release version of Unity 2019, exposed in every 2019.Y.Z release. |
UNITY_2019_4 | #define directive for the major version of Unity 2019.4, exposed in every 2019.4.Z release. |
UNITY_2019_4_14 | #define directive for the minor version of Unity 2019.4.14. |
Starting from Unity 5.3.4, 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), Unity exposes one global #define in the format UNITY_X_Y_OR_NEWER, that can be used for this purpose.
The supported #define directives are:
Define | Function |
---|---|
CSHARP_7_3_OR_NEWER | Defined when building scripts with support for C# 7.3 or newer. |
ENABLE_MONO | Scripting backend #define for Mono. |
ENABLE_IL2CPP | Scripting backend #define for IL2CPPA Unity-developed scripting back-end which you can use as an alternative to Mono when building projects for some platforms. More info See in Glossary. |
NET_2_0 | Defined when building scripts against .NET 2.0 API compatibility level on Mono and IL2CPP. |
NET_2_0_SUBSET | Defined when building scripts against .NET 2.0 Subset API compatibility level on Mono and IL2CPP. |
NET_LEGACY | Defined when building scripts against .NET 2.0 or .NET 2.0 Subset API compatibility level on Mono and IL2CPP. |
NET_4_6 | Defined when building scripts against .NET 4.x API compatibility level on Mono and IL2CPP. |
NET_STANDARD_2_0 | Defined when building scripts against .NET Standard 2.0 API compatibility level on Mono and IL2CPP. |
ENABLE_WINMD_SUPPORT | Defined when Windows Runtime support is enabled on IL2CPP. See Windows Runtime Support for more details. |
ENABLE_INPUT_SYSTEM | Defined when the Input System package is enabled in Player SettingsSettings that let you set various player-specific options for the final game built by Unity. More info See in Glossary. |
ENABLE_LEGACY_INPUT_MANAGER | Defined when the legacy Input ManagerSettings where you can define all the different input axes, buttons and controls for your project. More info See in Glossary is enabled in Player Settings. |
UNITY_SERVER | Defined when the Server Build setting is enabled in Build Settings |
You use the DEVELOPMENT_BUILD #define to identify whether your script is running in a player which was built with the “Development BuildA development build includes debug symbols and enables the Profiler. More info
See in Glossary” option enabled.
You can also compile code selectively depending on the scripting back-end.
Below is an example of how to use the precompiled code. It prints a message that depends on the platform you have selected for your target build.
First of all, select the platform you want to test your code against by going to File > Build Settings. This displays the Build Settings window; select your target platform from here.
Select the platform you want to test your precompiled code against and click Switch Platform to tell Unity which platform you are targeting.
Create a script and copy/paste the following code:
// 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("iOS");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Standalone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Standalone 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 iOSApple’s mobile operating system. More info
See in Glossary, the message “Iphone” is set to appear in the console.
In C# you can use a CONDITIONAL
attribute which is a more clean, less error-prone way of stripping out functions. See ConditionalAttribute Class for more information.
Note that common Unity callbacks (ex. Start(), Update(), LateUpdate(), FixedUpdate(), Awake()) are not affected by this attribute because they are called directly from the engine and, for performance reasons, it does not take them into account.
In addition to the basic #if
compiler directive, you can also use a multiway test in C#:
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#elif UNITY_IOS
Debug.Log("Unity iPhone");
#else
Debug.Log("Any other platform");
#endif
It is also possible to add to the built-in selection of #define directives by supplying your own. Open the Other Settings panel of the Player settings and navigate to the Scripting Define Symbols text box.
Enter the names of the symbols you want to define for that particular platform, separated by semicolons. These symbols can then be used as the conditions for #if
directives, just like the built-in ones.
You can define your own preprocessor directives to control which code gets included when compiling. To do this you must add a text file with the extra directives to the AssetsAny media or data that can be used in your game or project. An asset may come from a file created outside of Unity, such as a 3D Model, an audio file or an image. You can also create some asset types in Unity, such as an Animator Controller, an Audio Mixer or a Render Texture. More info
See in Glossary folder. The name of the file depends on the language you are using. The extension is .rsp:
C# (player and editor scripts) | <Project Path>/Assets/mcs.rsp |
As an example, if you include the single line -define:UNITY_DEBUG
in your mcs.rsp file, the #define directive UNITY_DEBUG
exists as a global #define for C# scripts, except for Editor scripts.
Every time you make changes to .rsp files, you need to recompile in order for them to be effective. You can do this by updating or reimporting a single script (.js or .cs) file.
Note: If you want to modify only global #define directives, use Scripting Define Symbols in Player settings, because this covers all the compilers. If you choose the .rsp files instead, you need to provide one file for every compiler Unity uses.
The use of .rsp files is described in the ‘Help’ section of the mcs application, which is included in the Editor installation folder. You can get more information by running mcs -help
.
Note that the .rsp file needs to match the compiler being invoked. For example:
mcs.rsp
, andcsc.rsp
.When you visit any website, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and change our default settings. However, blocking some types of cookies may impact your experience of the site and the services we are able to offer.
More information
These cookies enable the website to provide enhanced functionality and personalisation. They may be set by us or by third party providers whose services we have added to our pages. If you do not allow these cookies then some or all of these services may not function properly.
These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site. They help us to know which pages are the most and least popular and see how visitors move around the site. All information these cookies collect is aggregated and therefore anonymous. If you do not allow these cookies we will not know when you have visited our site, and will not be able to monitor its performance.
These cookies may be set through our site by our advertising partners. They may be used by those companies to build a profile of your interests and show you relevant adverts on other sites. They do not store directly personal information, but are based on uniquely identifying your browser and internet device. If you do not allow these cookies, you will experience less targeted advertising. Some 3rd party video providers do not allow video views without targeting cookies. If you are experiencing difficulty viewing a video, you will need to set your cookie preferences for targeting to yes if you wish to view videos from these providers. Unity does not control this.
These cookies are necessary for the website to function and cannot be switched off in our systems. They are usually only set in response to actions made by you which amount to a request for services, such as setting your privacy preferences, logging in or filling in forms. You can set your browser to block or alert you about these cookies, but some parts of the site will not then work. These cookies do not store any personally identifiable information.