Understanding Automatic Memory Management
特殊フォルダーとスクリプトのコンパイル順

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

Unity には プラットフォーム依存コンパイル という機能があります。これは、いくつかのプリプロセッサーディレクティブで構成され、スクリプトを分割して、サポートしているプラットフォームごとに一つずつコンパイルし実行できます。

さらに、Unity エディター内でコードを実行することができるので、コードをターゲットのプラットフォームのためにコンパイルし、エディター内でテストすることができます。

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

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

プロパティー 説明
UNITY_EDITOR ゲームコードから Unity エディターのスクリプトを呼び出すための #define ディレクティブ
UNITY_EDITOR_WIN Windows 版エディターコードのための #define ディレクティブ
UNITY_EDITOR_OSX Mac OS X 版エディターコードのための #define ディレクティブ
UNITY_STANDALONE_OSX Mac OS X (Univeral、PPC、Intel のアーキテクチャを含む)のコードをコンパイル/実行するための #define ディレクティブ
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 ディレクティブ
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_ADS ゲームコードから Unity Ads メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。
UNITY_ANALYTICS ゲームコードから Unity Analytics メソッドを呼び出すための #define ディレクティブ。Unity 5.2 以降で使用可能。
UNITY_ASSERTIONS アサーション制御プロセスの #define ディレクティブ

Unity 2.6.0 以降、選択的にコンパイルできるようになりました。使用できるオプションは使用しているエディターバージョンによります。 バージョン番号 X.Y.Z (例えば 2.6.0) の場合、Unity は 3つのグローバルな #define ディレクティブを以下の形式で示します。UNITY_X, UNITY_X_Y, UNITY_X_Y_Z

Unity 5.0.1 の #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 ディレクティブです。

CSHARP_7_3_OR_NEWER Defined when building scripts with support for C# 7.3 or newer.
ENABLE_MONO Mono のスクリプティングバックエンド #define ディレクティブ
ENABLE_IL2CPP IL2CPP のスクリプティングバックエンド #define ディレクティブ
ENABLE_DOTNET .NET のスクリプティングバックエンド #define ディレクティブ
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 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 Windows Runtime のサポートが IL2CPP と .NET で使用可能なときに定義されます。 .NET 4.6 API 互換性レベル向けにスクリプトをビルドするときに定義されます。詳しくは Windows Runtime Support を参照してください。

また、 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

ビルトインのセレクションに自身のカスタム #define ディレクティブを追加することもできます。 Player SettingsOther Settings パネルで、 Scripting Define Symbols テキストボックスを開きます。

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

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

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

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

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

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

注意

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.

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

  • when targeting the .NET 3.5 Equivalent (deprecated) scripting runtime version, mcs is used with mcs.rsp, and
  • when targeting the .NET 4.x Eqivalent scripting runtime version compiler, csc is used with csc.rsp.

Understanding Automatic Memory Management
特殊フォルダーとスクリプトのコンパイル順