From unity
Unity 6 platform targeting and build guide. Use when building for specific platforms, configuring build profiles, using platform scripting defines (#if UNITY_IOS, #if UNITY_ANDROID), optimizing for mobile, WebGL, or consoles, working with Addressables/asset bundles, or choosing between IL2CPP and Mono. Based on Unity 6.3 LTS documentation.
npx claudepluginhub cdata/aria-skills --plugin unityThis skill uses the workspace's default tool permissions.
Unity 6 supports the following platform categories:
Unity 6 performance profiling and optimization guide. Use when profiling, optimizing frame rate, reducing memory usage, debugging performance bottlenecks, or using the Profiler, Memory Profiler, or Frame Debugger. Based on Unity 6.3 LTS documentation.
Builds Unity games with optimized C# scripts, URP/HDRP rendering pipelines, asset management, performance profiling, and cross-platform deployment for Unity 6 LTS.
Builds optimized Unity games with C# scripts, URP/HDRP rendering, asset management, gameplay systems, UI, and cross-platform deployment. For performance issues, mechanics, builds.
Share bugs, ideas, or general feedback.
Unity 6 supports the following platform categories:
Build Profiles replace the old Build Settings window. A build profile is a set of configuration settings for building your application on a particular platform.
Scenes are managed per-profile. You can add, exclude, remove, and reorder scenes in your build. Each unique Scene file represents a unique level or screen.
Use #if directives to conditionally compile code per platform.
| Define | Platform |
|---|---|
UNITY_EDITOR | Any Editor code |
UNITY_EDITOR_WIN | Windows Editor |
UNITY_EDITOR_OSX | macOS Editor |
UNITY_EDITOR_LINUX | Linux Editor |
UNITY_STANDALONE_OSX | macOS Standalone |
UNITY_STANDALONE_WIN | Windows Standalone |
UNITY_STANDALONE_LINUX | Linux Standalone |
UNITY_STANDALONE | Any Standalone (Win/Mac/Linux) |
UNITY_SERVER | Dedicated Server |
UNITY_IOS | iOS |
UNITY_ANDROID | Android |
UNITY_TVOS | tvOS |
UNITY_VISIONOS | visionOS |
UNITY_WEBGL | WebGL |
UNITY_WSA | Universal Windows Platform |
UNITY_WSA_10_0 | UWP 10.0 |
UNITY_EMBEDDED_LINUX | Embedded Linux |
UNITY_QNX | QNX |
UNITY_FACEBOOK_INSTANT_GAMES | Facebook Instant Games |
| Define | Meaning |
|---|---|
UNITY_ANALYTICS | Analytics enabled |
UNITY_ASSERTIONS | Assertions enabled |
UNITY_64 | 64-bit platform |
ENABLE_MONO | Mono scripting backend |
ENABLE_IL2CPP | IL2CPP scripting backend |
ENABLE_VR | VR support enabled |
ENABLE_INPUT_SYSTEM | New Input System enabled |
ENABLE_LEGACY_INPUT_MANAGER | Legacy Input Manager enabled |
ENABLE_WINMD_SUPPORT | WinMD support |
DEVELOPMENT_BUILD | Development build |
UNITY_CLOUD_BUILD | Cloud Build |
| Define | API Level |
|---|---|
NET_STANDARD_2_0 | .NET Standard 2.0 |
NET_STANDARD_2_1 | .NET Standard 2.1 |
NET_STANDARD / NETSTANDARD | Any .NET Standard |
NETSTANDARD2_1 | .NET Standard 2.1 (C# define) |
NET_4_6 | .NET Framework |
NET_2_0 / NET_LEGACY | .NET 2.0 (legacy) |
CSHARP_7_3_OR_NEWER | C# 7.3+ available |
Format: UNITY_X, UNITY_X_Y, UNITY_X_Y_Z, UNITY_X_Y_OR_NEWER
Example for Unity 6000.0.33:
UNITY_6000, UNITY_6000_0, UNITY_6000_0_33, UNITY_6000_0_OR_NEWERArchitecture: ARM64 only (no ARMv7).
Scripting Backend: IL2CPP required for iOS (no Mono option).
Player Settings (Edit > Project Settings > Player > iOS):
com.CompanyName.ProductNameArchitectures: ARMv7 and ARM64 (ARM64 requires IL2CPP).
Player Settings (Edit > Project Settings > Player > Android):
com.YourCompanyName.YourProductNameKey Difference: Android hardware capabilities vary significantly between models. Test across multiple devices.
.data file into virtual memory file system (Emscripten)Use StringBuilder instead of string concatenation in loops:
// BAD: Creates ~15 GB temporary allocations for 100k iterations
string hugeString = "";
for (int i = 0; i < 100000; i++)
hugeString += "foo";
// GOOD: Pre-allocated StringBuilder
var sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
sb.Append("foo");
Use NativeArray<T> for temporary allocations to bypass GC:
using (var data = new NativeArray<byte>(size, Allocator.Temp))
{
// Memory freed immediately upon scope exit
}
Use AssetBundles for asset loading (downloads directly into Unity heap without extra browser allocation).
Enable Data Caching (IndexedDB/Caching APIs) to reduce re-downloads.
Unity supports two JavaScript plug-in file types:
Limitation: Only ECMAScript 5 (ES5) syntax supported in .jslib and .jspre files. ES6 is not yet supported.
// Assets/Plugins/WebGL/MyPlugin.jslib
mergeInto(LibraryManager.library, {
ShowAlert: function (message) {
window.alert(UTF8ToString(message));
},
});
using System.Runtime.InteropServices;
using UnityEngine;
public class WebGLBridge : MonoBehaviour
{
[DllImport("__Internal")]
private static extern void ShowAlert(string message);
void Start()
{
#if UNITY_WEBGL && !UNITY_EDITOR
ShowAlert("Hello from Unity!");
#endif
}
}
IL2CPP is Unity's custom AOT scripting backend that converts C# to native code via C++.
Conversion Pipeline:
Advantages:
Disadvantages:
Configuration:
PlayerSettings.SetScriptingBackendBuild Speed Optimization:
| Criteria | IL2CPP | Mono |
|---|---|---|
| iOS builds | Required | Not available |
| Android builds | Recommended for ARM64 | Available for ARMv7 |
| Build iteration speed | Slower | Faster |
| Runtime performance | Better | Good |
| Console platforms | Required | Not available |
| WebGL | Required | Not available |
The Addressable Asset System (com.unity.addressables v2.9.1) enables referencing assets by address rather than direct paths.
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
public class AddressableLoader : MonoBehaviour
{
[SerializeField] private AssetReference prefabRef;
async void Start()
{
AsyncOperationHandle<GameObject> handle =
Addressables.InstantiateAsync(prefabRef);
await handle.Task;
if (handle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("Asset loaded successfully");
}
}
void OnDestroy()
{
// Always release when done
prefabRef.ReleaseAsset();
}
}
public class PlatformManager : MonoBehaviour
{
void Start()
{
#if UNITY_IOS
Application.targetFrameRate = 60;
#elif UNITY_ANDROID
Application.targetFrameRate = 60;
Screen.sleepTimeout = SleepTimeout.NeverSleep;
#elif UNITY_WEBGL
// WebGL runs at browser refresh rate
#elif UNITY_STANDALONE
Application.targetFrameRate = -1; // Uncapped
#endif
}
}
void ConfigureForPlatform()
{
switch (Application.platform)
{
case RuntimePlatform.IPhonePlayer:
SetupMobileControls();
break;
case RuntimePlatform.Android:
SetupMobileControls();
break;
case RuntimePlatform.WebGLPlayer:
SetupWebControls();
break;
default:
SetupDesktopControls();
break;
}
}
#if DEVELOPMENT_BUILD
Debug.Log("Development build active");
#endif
#if ENABLE_IL2CPP
// IL2CPP-specific code
#elif ENABLE_MONO
// Mono-specific code
#endif
Using Resources folder for everything instead of Addressables. Resources folder loads all assets at startup, increasing memory usage and load times.
Not using platform defines and relying solely on runtime checks. Compile-time defines exclude unused code from builds entirely.
String concatenation in WebGL loops. GC only runs at frame end in WebGL, causing massive temporary allocations. Use StringBuilder or NativeArray<T>.
Ignoring IL2CPP AOT restrictions. Reflection-heavy code, System.Reflection.Emit, and runtime code generation will fail under IL2CPP. Design with AOT in mind.
Shipping with Development Build enabled. Development builds include Profiler overhead and debug symbols, increasing size and reducing performance.
Not splitting APKs by architecture on Android. Shipping a single fat APK with both ARMv7 and ARM64 wastes user bandwidth. Use Split APKs or App Bundles.
Hardcoding platform paths. Use Application.persistentDataPath, Application.streamingAssetsPath, and Application.temporaryCachePath for cross-platform file access.
Not testing on actual devices. Android hardware varies enormously. Emulators and simulators do not represent real performance characteristics.
| API | Purpose |
|---|---|
Application.platform | Runtime platform detection |
RuntimePlatform enum | Platform constants for runtime checks |
SystemInfo.graphicsDeviceType | Current graphics API (Vulkan, Metal, etc.) |
SystemInfo.supportsComputeShaders | Check compute shader support |
PlayerSettings.SetScriptingBackend() | Set IL2CPP or Mono via script |
Addressables.InstantiateAsync() | Load and instantiate addressable asset |
Addressables.LoadAssetAsync<T>() | Load addressable asset without instantiation |
AssetReference | Serializable reference to an addressable asset |
Application.targetFrameRate | Set target frame rate |
Screen.sleepTimeout | Prevent screen dimming on mobile |
Application.persistentDataPath | Platform-safe writable data path |