自動メモリ管理を理解する
ジェネリック関数

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

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

さらに、コードをエディター内で実行することができるので、コードをモバイル/コンソール特有にコンパイルしたうえでエディターでテストすることができます。

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

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

プロパティー: 説明:
UNITY_EDITOR ゲームコードから Unity エディターのスクリプトを呼び出すための #define ディレクティブ
UNITY_EDITOR_WIN Windows 版エディターコードのための #define ディレクティブ
UNITY_EDITOR_OSX Mac OSX 版エディターコードのための #define ディレクティブ
UNITY_STANDALONE_OSX 特に Mac OS (Univeral、PPC、および Intel アーキテクチャを含む)コードをコンパイル/実行するための #define ディレクティブ
UNITY_STANDALONE_WIN Windows スタンドアロンアプリケーションのコードをコンパイル/実行するための #define ディレクティブ
UNITY_STANDALONE_LINUX Linux スタンドアロンアプリケーションのコードをコンパイル/実行するための #define ディレクティブ
UNITY_STANDALONE あらゆるスタンドアロンアプリケーション(Mac、Windows、または Linux)のコードをコンパイル/実行するための #define ディレクティブ
UNITY_WII Wii コンソールのためのコードをコンパイル/実行するための #define ディレクティブ
UNITY_IOS iOS プラットフォームのためのコードをコンパイル/実行するための #define ディレクティブ
UNITY_IPHONE 非推奨。代わりに UNITY_IOS を使用してください。
UNITY_ANDROID Android プラットフォームのための #define ディレクティブ
UNITY_PS3 PlayStation 3 のコードを実行するための #define ディレクティブ
UNITY_PS4 PlayStation 4 のコードを実行するための #define ディレクティブ
UNITY_SAMSUNGTV Samsung TV 用のコードを実行するための #define ディレクティブ
UNITY_XBOX360 XBox 360 のコードを実行するための #define ディレクティブ
UNITY_XBOXONE XBox One のコードを実行するための #define ディレクティブ
UNITY_TIZEN Tizen プラットフォームのための #define ディレクティブ
UNITY_TVOS Apple TV プラットフォームのための #define ディレクティブ
UNITY_WP_8 Windows Phone 8 のための #define ディレクティブ
UNITY_WP_8_1 Windows Phone 8.1 のための #define ディレクティブ
UNITY_WSA Windows Store Apps のための #define ディレクティブ。.NET Core で C# ファイルをコンパイルするときに NETFX_CORE が定義されます。
UNITY_WSA_8_0 SDK 8.0 をターゲットにする場合に Windows Store Apps のための #define ディレクティブ
UNITY_WSA_8_1 SDK 8.1 をターゲットにする場合に Windows Store Apps のための #define ディレクティブ
UNITY_WSA_10_0 Universal Windows 10 Apps をターゲットにする場合の Windows Store Apps のための #define ディレクティブ。追加で、.NET Core で C# ファイルをコンパイルするときに WINDOWS_UWPNETFX_CORE が定義されます。
UNITY_WINRT UNITY_WP_8 \ に相当 UNITY_WSA
UNITY_WINRT_8_0 UNITY_WP_8 \ に相当 UNITY_WSA_8_0
UNITY_WINRT_8_1 UNITY_WP_8_1 \ に相当 UNITY_WSA_8_1 。Universal SDK 8.1 でコンパイルするときにも定義されます。
UNITY_WINRT_10_0 UNITY_WSA_10_0 に相当
UNITY_WEBGL WebGL の #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_XUNITY_X_YUNITY_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.1 マイナーバージョンの #define ディレクティブです。

コンパイルを必要するコードに使用されている Unity の最も古いバージョンに基づいて、選択的にコードをコンパイルしたり、指定した部分のコードを実行することができます。この使用目的の場合、上記の (X.Y.Z) と同じバージョン形式が使用され、Unity はグローバルな #define ディレクティブを UNITY_X_Y_OR_NEWER というように示します。

現在サポートされている #define ディレクティブ

UNITY_5_3_OR_NEWER Unity 5.3 以上の新しいバージョン向けの Define

スクリプトバックエンドでコードを分けてコンパイルすることもできます。

ENABLE_MONO Mono のスクリプティングバックエンド #define ディレクティブ
ENABLE_IL2CPP IL2CPP のスクリプティングバックエンド #define ディレクティブ
ENABLE_DOTNET .NET のスクリプティングバックエンドンド #define ディレクティブ

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

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

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

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

ターゲットのプラットフォームとして Web Player を選択した Build Settings ウィンドウ
ターゲットのプラットフォームとして Web Player を選択した Build Settings ウィンドウ

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

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

// JS
function Awake() {
  #if UNITY_EDITOR
    Debug.Log("Unity Editor");
  #endif
    
  #if UNITY_IPHONE
    Debug.Log("Iphone");
  #endif

  #if UNITY_STANDALONE_OSX
    Debug.Log("Stand Alone OSX");
  #endif

  #if UNITY_STANDALONE_WIN
    Debug.Log("Stand Alone Windows");
  #endif    
}


// 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 属性を使用することでどれよりもエラーが少なくクリーンなものを作成することができます。詳しくは http://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx を参照してください。

基本的な #if コンパイラディレクティブに加えて、C# および JavaScript のどちらでも以下のようにテストできます。


#if UNITY_EDITOR
    Debug.Log("Unity Editor");

#elif UNITY_IOS
    Debug.Log("Unity iPhone");

#else
    Debug.Log("Any other platform");

#endif


プラットフォームのカスタム Define シンボル

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

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

グローバルのカスタム Define シンボル

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

C# <Project Path>/Assets/smcs.rsp
C# - Editor Scripts <Project Path>/Assets/gmcs.rsp
UnityScript <Project Path>/Assets/us.rsp

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

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

注意

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

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

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

  • Web Player がターゲットの場合は、smcssmcs.rsp とともに使用されます
  • スタンドアロンプレイヤーがターゲットの場合は、gmcsgmcs.rsp とともに使用されます
  • MS コンパイラーがターゲットの場合は、csccsc.rsp とともに使用されます
自動メモリ管理を理解する
ジェネリック関数