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

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

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

また、 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 )を更新または再インポートするだけです。

ノート

グローバル #define ディレクティブのみを修正したい場合、Player 設定の Scripting Define Symbols を使用します。なぜなら、これがすべてのコンパイラーをカバーするからです。もし代わりに .rsp ファイルを選択すると、Unity が使用するコンパイラーごとに 1 つのファイルを提供する必要があります。

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

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

  • .NET 3.5 Equivalent (非推奨) のスクリプティングランタイムバージョンをターゲットにする場合、mcsmcs.rspによって使用されます。
  • .NET 4.x Equivalent (非推奨) のスクリプティングランタイムバージョンコンパイラーをターゲットにする場合、csccsc.rsp によって使用されます。

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