Version: 2019.2
自動メモリ管理
特殊フォルダーとスクリプトのコンパイル順

プラットフォーム依存コンパイル

Unity’s Platform Dependent Compilation feature consists of some preprocessor directives that let you partition your scripts 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.

プラットフォームの #define ディレクティブ

Unity がスクリプトでサポートしているプラットフォームの #define ディレクティブは以下の通りです。

Define 機能
UNITY_EDITOR #define directive to call Unity Editor scripts from your game code.
UNITY_EDITOR_WIN Windows 版エディターコードのための #define ディレクティブ
UNITY_EDITOR_OSX Mac OS X 版エディターコードのための #define ディレクティブ
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 Windows スタンドアロンアプリケーションのコードをコンパイル/実行するための #define ディレクティブ
UNITY_STANDALONE_LINUX Linux スタンドアロンアプリケーションのコードをコンパイル/実行するための #define ディレクティブ
UNITY_STANDALONE あらゆるスタンドアロンプラットフォーム(Mac OS X, Windows, Linux)のコードをコンパイル/実行するための #define ディレクティブ
UNITY_WII Wii コンソールのためのコードをコンパイル/実行するための #define ディレクティブ
UNITY_IOS iOS プラットフォームのためのコードをコンパイル/実行するための #define ディレクティブ
UNITY_IPHONE 非推奨。代わりに UNITY_IOS を使用してください。
UNITY_ANDROID Android プラットフォームのための #define ディレクティブ
UNITY_PS4 PlayStation 4 のコードを実行するための #define ディレクティブ
UNITY_XBOXONE XBox One のコードを実行するための #define ディレクティブ
PLATFORM_LUMIN #define directive for the Magic Leap OS platform.
UNITY_TIZEN Tizen プラットフォームのための #define ディレクティブ
UNITY_TVOS Apple TV プラットフォームのための #define ディレクティブ
UNITY_WSA ユニバーサル Windows プラットフォームのための #define ディレクティブ。さらに、C# ファイルを .NET Core 向けにコンパイルし .NET スクリプティングバックエンドを使用する場合に、NETFX_CORE が定義されます。
UNITY_WSA_10_0 ユニバーサル Windows プラットフォームのための #define ディレクティブ。さらに、C# ファイルを .NET Core 向けにコンパイルする場合に、WINDOWS_UWP が定義されます。
UNITY_WINRT UNITY_WSA と同様
UNITY_WINRT_10_0 UNITY_WSA_10_0 に相当
UNITY_WEBGL WebGL のための #define ディレクティブ
UNITY_FACEBOOK Facebook プラットフォーム (WebGL か Windows スタンドアロン) のための #define ディレクティブ
UNITY_FACEBOOK Facebook プラットフォーム (WebGL か Windows スタンドアロン) のための #define ディレクティブ
UNITY_ADS ゲームコードから Unity Ads メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。
UNITY_ANALYTICS ゲームコードから Unity Analytics メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。
UNITY_ASSERTIONS アサーション制御プロセスの #define ディレクティブ

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.

Unity 5.0.1 の #define ディレクティブ

Define 機能
UNITY_5 Unity 5 リリースバージョンの #define ディレクティブです。すべての 5.X.Y リリースで使用可能。
UNITY_5_0 Unity 5.0 リリースバージョンの #define ディレクティブです。すべての 5.0.Z リリースで使用可能。
UNITY_5_0_1 Unity 5.0 マイナーバージョンの #define ディレクティブです。

Unity 5.3.4 以降、指定した部分のコードのコンパイル、または実行に必要な最も古い Unity のバージョンに基づいて、選択的にコードをコンパイルできます。前述の (X.Y.Z) と同じバージョン形式を使用して、Unity は、UNITY_X_Y_OR_NEWER の形式でグローバルな #define を示します。

以下はサポートされている #define ディレクティブです。

Define 機能
CSHARP_7_3_OR_NEWER C# 7.3をサポートするスクリプトをビルドするときに定義されます。
ENABLE_MONO Mono のスクリプティングバックエンド #define ディレクティブ
ENABLE_IL2CPP IL2CPP のスクリプティングバックエンド #define ディレクティブ
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 Subset API 互換性レベル向けにスクリプトをビルドするときに定義されます。
NET_4_6 Mono と IL2CPP の .NET 4.x API 互換性レベル向けにスクリプトをビルドするときに定義されます。
NET_STANDARD_2_0 Mono と IL2CPP の .NET Standard 2.0 API 互換性レベル向けにスクリプトをビルドするときに定義されます。
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 Settings.
ENABLE_LEGACY_INPUT_MANAGER Defined when the legacy Input Manager is enabled in Player Settings.

また、 DEVELOPMENT_BUILD #define ディレクティブを使用すると、スクリプトを “Development Build” オプションを有効にしてビルドしたプレイヤーで実行しているかどうかを確認できます。

スクリプトバックエンドでコードを選択的にコンパイルすることもできます。

プリコンパイルコードのテスト

以下は、プリコンパイルコードの使用例です。選択したビルドターゲットのプラットフォームにもとづいてメッセージを出力します。

まず初めに、コードをテストしたいプラットフォームを選択するために File > Build Settings をクリックします。これによりターゲットプラットフォームを選択する Build Settings ウィンドウが表示されます。

ターゲットのプラットフォームとして PC, Mac & Linux を選択した Build Settings ウィンドウ
ターゲットのプラットフォームとして PC, Mac & Linux を選択した Build Settings ウィンドウ

プリコンパイルコードをテストしたいプラットフォームを選択して、Switch Platform をクリックし、どのプラットフォームをターゲットにするのか設定します。

スクリプトを作成し、次のコードをコピー&ペーストします。

// 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

  }          
}

コードをテストするには Play Mode をクリックします。Unity のコンソールに表示される選択したプラットフォームに基づく関連メッセージで、コードが正常に作動していることを確認してください。例えば、iOS を選択すると、コンソールに Iphone と表示されます。

C# では、よりクリーンでエラーを起こしにくい、関数の除去方法である CONDITIONAL 属性を使用することができます。詳細は、 ConditionalAttribute Class を参照してください。一般的な 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

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.

ここで特定のプラットフォーム用に定義したいシンボルの名前を入力し、(複数ある場合は) セミコロンで区切ります。これらのシンボルは、ビルトインのものと同様に #if ディレクティブの条件として使用できます。

グローバルのカスタム #defines

自身のカスタムのプリプロセッサーディレクティブを定義して、コンパイル時にどのコードを含むかを制御することができます。これを行うためには追加のディレクティブを含んだテキストファイルを Assets フォルダーに追加しなければなりません。ファイルの名前は使用している言語に依存し、拡張子は .rsp です。

C# (プレイヤーとエディタースクリプト) <Project Path>/Assets/mcs.rsp

例として、もし mcs.rsp ファイルに -define:UNITY_DEBUG の 1行を加えると、#define ディレクティブ UNITY_DEBUG は、エディタースクリプトを除く、C# スクリプトのグローバルの #define になります。

.rsp ファイルに変更を行うたびに、それを有効にするためには再コンパイルを行う必要があります。これを行うにはスクリプトファイル( .js または .cs )を更新または再インポートするだけです。

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.

.rsp ファイルの使用法は、エディターインストールフォルダーに含まれる mcs アプリケーションの ‘Help’ で説明されています。詳細な情報を得るには、mcs -help を実行してください。

.rsp ファイルは、以下の例のように起動するコンパイラーと一致する必要があることに注意してください。

  • .NET 3.5 Equivalent (非推奨) のスクリプティングランタイムバージョンをターゲットにする場合、mcsmcs.rspによって使用されます。
  • .NET 4.x Equivalent (非推奨) のスクリプティングランタイムバージョンコンパイラーをターゲットにする場合、csccsc.rsp によって使用されます。
自動メモリ管理
特殊フォルダーとスクリプトのコンパイル順