Unity には “プラットフォーム依存コンパイル” という機能があります。これにはいくつかのプリプロセッサ ディレクティブが含まれ,スクリプトを ‘パーティション化’ して,コードの一部セクションをサポートされているプラットフォーム独自に実行できるようになります。
さらに,コードをエディター内で実行することが出来るので,コードをモバイル/コンソール特有にコンパイルしたうえでエディターでテストすることが出来ます。
Unity がスクリプトでサポートしているプラットフォーム マクロ定義:
プロパティ: | 特徴: |
---|---|
UNITY_EDITOR | Unity がスクリプトでサポートしているプラットフォーム マクロ定義: |
UNITY_EDITOR_WIN | Windows上のエディターコードのために定義します。 |
UNITY_EDITOR_OSX | Mac OS X上のエディターコードのために定義します。 |
UNITY_STANDALONE_OSX | Mac OS (Univeral, PPC, およびIntel アーキテクチャ含む)特有でコードのコンパイル/実行のためのプラットフォーム マクロ定義。 |
UNITY_DASHBOARD_WIDGET | Mac OS ダッシュボード ウィジェットのコードのコンパイル/実行のためのプラットフォーム マクロ定義。 |
UNITY_STANDALONE_WIN | Windows スタンドアローン アプリケーションのコードをコンパイル/実行したいときに使用します。 |
UNITY_STANDALONE_LINUX | Linux スタンドアローン アプリケーションのコードをコンパイル/実行したいときに使用します。 |
UNITY_STANDALONE | あらゆる スタンドアローン アプリケーション(Mac, Windows, または Linux)のコードをコンパイル/実行したいときに使用します。 |
UNITY_WEBPLAYER | Web Player コンテンツ(Windows および Mac Web Player実行ファイルを含みます)のプラットフォーム マクロ定義。 |
UNITY_WII | Wii コンソールでコードのコンパイル/実行のためのプラットフォーム マクロ定義。 |
UNITY_IPHONE | iPhone プラットフォームでコードのコンパイル/実行のためのプラットフォーム マクロ定義 |
UNITY_ANDROID | Android プラットフォームのプラットフォーム マクロ定義。 |
UNITY_PS3 | PlayStation 3 でコードのコンパイル/実行のためのプラットフォーム マクロ定義。 |
UNITY_XBOX360 | XBox 360 でコードのコンパイル/実行のためのプラットフォーム マクロ定義。 |
UNITY_FLASH | Adobe Flashでコードのコンパイル/実行のためのプラットフォーム マクロ定義。 |
UNITY_BLACKBERRY | Blackberry10 デバイス のためのプラットフォーム マクロ定義。 |
UNITY_WP8 | Windows Phone 8のプラットフォーム マクロ定義。 |
UNITY_METRO | Platform define for Windows Store Apps (additionally NETFX_CORE is defined when compiling C# files against .NET Core). |
UNITY_WINRT | Equivalent to UNITY_WP8 |UNITY_METRO |
さらに作業を行っている Unity エンジンのバージョンに基づいてコードを選択的にコンパイルできます。現在サポートされているのは:
UNITY_2_6 | Unity 2.6 バージョンのプラットフォーム マクロ定義。 |
UNITY_2_6_1 | Unity 2.6.1 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_0 | Unity 3.0 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_0_0 | Unity 3.0.0 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_1 | Unity 3.1 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_2 | Unity 3.2 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_3 | Unity 3.3 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_4 | Unity 3.4 バージョンのプラットフォーム マクロ定義。 |
UNITY_3_5 | Unity 3.5 バージョンのプラットフォーム マクロ定義。 |
UNITY_4_0 | Unity 4.0 バージョンのプラットフォーム マクロ定義。 |
UNITY_4_0_1 | Unity 4.0.1 バージョンのプラットフォーム マクロ定義。 |
UNITY_4_1 | Unity 4.1 バージョンのプラットフォーム マクロ定義。 |
UNITY_4_2 | Unity 4.2 バージョンのプラットフォーム マクロ定義。 |
UNITY_4_3 | Unity 4.3 バージョンのプラットフォーム マクロ定義。 |
UNITY_4_5 | Unity 4.5 バージョンのプラットフォーム マクロ定義。 |
注意: 2.6.0 で初めて導入された機能であるため,それより前のバージョンではプラットフォーム マクロ定義はありません。
プリコンパイル コードをどうやって使用するか簡単なサンプルを示します。これは選択したビルド ターゲットのプラットフォームにもとづいてメッセージを単に出力します。
まず初めに,コードをテストしたいプラットフォームを選択するために
をクリックします。これにより ターゲット プラットフォームを選択する Build Settings ウィンドウが表示されます。プリコンパイル コードをテストしたいプラットフォームを選択して,
を押下し,Unity にどのプラットフォームをターゲットにするのか 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_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
}
}
// Boo
import UnityEngine
class PlatformDefines (MonoBehaviour):
def Start ():
ifdef UNITY_EDITOR:
Debug.Log("Unity Editor")
ifdef UNITY_IPHONE:
Debug.Log("IPhone")
ifdef UNITY_STANDALONE_OSX:
Debug.Log("Stand Alone OSX")
ifdef not UNITY_IPHONE:
Debug.Log("not an iPhone")
次に,どのプラットフォームを選択したかによって,再生したときにいずれかのメッセージが Unity コンソール に出力されます。
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_IPHONE
Debug.Log("Unity iPhone");
#else
Debug.Log("Any other platform");
#endif
しかし,Boo は現在 ifdef ディレクティブのみサポートします。
ビルトインのセレクションに自身のカスタム定義のを追加することが出来ます。 Player Settings の Other Settings により, Scripting Define Symbols テキストボックスが表示されています。
ここで特定プラットフォームで定義したいシンボルの名前を入力して,セミコロンで区切ることが出来ます。これらのシンボルは,ビルトインのものと同様に #if ディレクティブの条件として使用できます。
自身のカスタムのプリプロセッサ ディレクティブを定義して,コンパイル時にどのコードを include するか制御することが出来ます。これを行うためには追加のディレクティブを含んだテキストファイルを “Assets/” フォルダに追加します。ファイルの名前は使用している言語に依存し,拡張子は .rsp です:
C# | <Project Path>/Assets/smcs.rsp |
C# - Editor Scripts | <Project Path>/Assets/gmcs.rsp |
UnityScript | <Project Path>/Assets/us.rsp |
Boo | <Project Path>/Assets/boo.rsp |
例として,もし smcs.rsp に “-define:UNITY_DEBUG” を一行含めれば,UNITY_DEBUG
の定義は C# スクリプトにおいて,エディタースクリプトを除いてグローバルのカスタム定義として存在することになります。
.rsp ファイルに変更を行うたびに,有効化するためには再コンパイルを行う必要があります。これを行うためには単独のスクリプトファイル(.js, .cs または .boo)を更新または再インポートします。
グローバル定義のみ修正したい場合,全てのコンパイラをカバーするために Player Settings の Scripting Define Symbols を修正すべきです。もし代わりに .rsp の変更を選択した場合,Unityが使用するコンパイラごとにひとつのファイルを提供する必要があり,どれかのコンパイラがしようされているかどうか知ることができません。
.rsp ファイルの使用方法についてはインストールした Editor フォルダに含まれる smcs アプリケーションの help セクションに説明があります。詳細な説明については “smcs -help” を実行して下さい。さらに .rsp ファイルは実行する前にコンパイラをマッチングする必要があることに留意して下さい。例えば,ウェブプレイヤーがターゲットである場合, smcs は smcs.rsp とともに使用され,スタンドアローンプレイヤーの場合は gmcs は gmcs.rsp とともに使用され,MS コンパイラの場合は csc は csc.rsp とともに使用する,などとします。