Version: 2022.2
言語: 日本語
特殊フォルダーとスクリプトのコンパイル順
カスタム製スクリプトシンボル

条件付きコンパイル

  • Unity の C# 言語サポートには ディレクティブ があります。これにより、特定の スクリプトシンボル定義されている定義されていないか によって、コードを選択的にコンパイルに入れたり除外したりすることができます。

これらのディレクティブが C# でどのように動作するかについては、Microsoft C# プリプロセッサディレクティブのページ を参照してください。

Unity にはさまざまなビルトインスクリプトシンボルがあり、スクリプトでコードの一部を選択的にコンパイルしたり除外したりできます。

例えば、Windows スタンドアロンプラットフォーム用にプレイヤーをビルドするときに設定されるビルトインのスクリプトシンボルは、UNITY_STANDALONE_WIN です。このシンボルが定義されているかどうかは、以下の特殊なタイプの if ステートメントを使用して確認することができます。


#if UNITY_STANDALONE_WIN    

  Debug.Log("Standalone Windows");

#endif 

ifendif の前にあるハッシュ (#) 文字は、これらの文が “ディレクティブ” であり、ランタイムではなく、コンパイル時に処理されることを示しています。

したがって、上の例では、Debug 行はプロジェクトの Windows スタンドアロンビルドのコンパイルにのみ含まれます。エディターや他のターゲットビルドでコンパイルする場合は、Debug 行は完全に省略されます。* これは、通常の if ... then ... else 構造の使用とは異なり、ランタイムにコードの特定部分の 実行 を回避するだけです。完全な例については、以下を参照してください。

多くのビルトインのスクリプトシンボルがあり、これにより、プラットフォームエディターバージョンその他 その他のシステム環境シナリオに基づいて、選択的にコードをコンパイルまたは省略することができます。これらのビルトインのスクリプトシンボルを以下に示します。

さらに、エディター UI、スクリプト、アセットファイルのいずれかを使用して、独自のスクリプトシンボルを定義することができます。これにより、任意の定義に基づいて、コードの一部のコンパイルを制御できます。詳しくは、カスタムスクリプトシンボル を参照してください。

  • ノート: スクリプトシンボル は、“定義シンボル”、“プリプロセッサー定義”、あるいは単に “定義” と呼ばれることもあります。

プラットフォームのスクリプトシンボル

Unity では、オーサリングやビルドの対象プラットフォームに応じて、特定のスクリプトシンボルが自動的に定義されます。これらは以下の通りです。

定義 機能
UNITY_EDITOR ゲームコードから Unity エディターのスクリプトを呼び出すためのスクリプトシンボル
UNITY_EDITOR_WIN Windows 用エディターコードのためのスクリプトシンボル
UNITY_EDITOR_OSX Mac OS X 用エディターコードのためのスクリプトシンボル
UNITY_EDITOR_LINUX Linux 用エディターコードのためのスクリプトシンボル
UNITY_STANDALONE_OSX Mac OS X (Univeral、PPC、Intel のアーキテクチャを含む) のコードをコンパイル/実行するための スクリプトシンボル
UNITY_STANDALONE_WIN Windows スタンドアロンアプリケーションのコードをコンパイル/実行するための スクリプトシンボル
UNITY_STANDALONE_LINUX Linux スタンドアロンアプリケーションのコードをコンパイル/実行するためのスクリプトシンボル
UNITY_STANDALONE あらゆるスタンドアロンプラットフォーム (Mac OS X, Windows, Linux) のコードをコンパイル/実行するためのスクリプトシンボル
UNITY_WII Wii コンソール用のコードをコンパイル/実行するためのスクリプトシンボル
UNITY_IOS iOS プラットフォーム用のコードをコンパイル/実行するためのスクリプトシンボル
UNITY_IPHONE 非推奨。代わりに UNITY_IOS を使用してください。
UNITY_ANDROID Android プラットフォーム用のスクリプトシンボル
UNITY_LUMIN Magic Leap OS プラットフォーム用のスクリプトシンボル。PLATFORM_LUMIN も使用できます。
UNITY_TIZEN Tizen プラットフォーム用のスクリプトシンボル
UNITY_TVOS Apple TV プラットフォーム用のスクリプトシンボル
UNITY_WSA ユニバーサル Windows プラットフォームのためのスクリプトシンボル。さらに、C# ファイルを .NET Core 向けにコンパイルし .NET スクリプティングバックエンドを使用する場合に、NETFX_CORE が定義されます。
UNITY_WSA_10_0 ユニバーサル Windows プラットフォームのためのスクリプトシンボル。さらに、C# ファイルを .NET Core 向けにコンパイルする場合に、WINDOWS_UWP が定義されます。
UNITY_WEBGL WebGL 用のスクリプトシンボル
UNITY_FACEBOOK Facebook プラットフォーム (WebGL か Windows スタンドアロン) のためのスクリプトシンボル
UNITY_ANALYTICS ゲームコードから Unity Analytics メソッドを呼び出すためのスクリプトシンボル。Unity 5.2 以降で使用可能。
UNITY_ASSERTIONS アサーション制御プロセスのスクリプトシンボル
UNITY_64 64 ビットプラットフォーム用のスクリプトシンボル

エディターバージョンのスクリプトシンボル

Unity では、現在使用しているエディターバージョンに基づき、特定のスクリプトシンボルが自動的に定義されます。

バージョン番号 X.Y.Z (例えば 2019.4.14) の場合、Unity は 3 つのグローバルなスクリプトシンボルを以下の形式で示します。UNITY_XUNITY_X_YUNITY_X_Y_Z

以下は Unity 2019.4.14 で公開されているスクリプトシンボルの例です。

定義 機能
UNITY_2019 Unity 2019 リリースバージョンのスクリプトシンボルです。すべての 2019.Y.Z リリースで公開されています。
UNITY_2019_4 Unity 2019.4 メジャーバージョンのスクリプトシンボルです。すべての 2019.4.Z リリースで公開されています。
UNITY_2019_4_14 Unity 2019.4.14 マイナーバージョンのスクリプトシンボル

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

その他のスクリプティングシンボル

その他、Unity が定義するスクリプトシンボルは以下の通りです。

定義 機能
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 互換性レベル向けにスクリプトをビルドするときに定義されます。
NET_STANDARD_2_1 Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。
NET_STANDARD Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。
NETSTANDARD2_1 Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。
NETSTANDARD Mono と IL2CPP の .NET Standard 2.1 API 互換性レベル向けにスクリプトをビルドするときに定義されます。
ENABLE_WINMD_SUPPORT Windows Runtime のサポートが IL2CPP で使用可能なときに定義されます。詳しくは Windows Runtime Support を参照してください。
ENABLE_INPUT_SYSTEM Player Settings で Input System パッケージが有効になっている場合に定義されます。
ENABLE_LEGACY_INPUT_MANAGER Player Settings で古い Input Manager が有効になっている場合に定義されます。
UNITY_SERVER Build Settings で Server Build 設定が有効になっている場合に定義されます。
DEVELOPMENT_BUILD “Development Build” オプションを有効にしてビルドされたプレイヤーでスクリプトが実行されている場合に定義されます。

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

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

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

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

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

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

using UnityEngine;
using System.Collections;

public class PlatformDefines : MonoBehaviour {
  void Start () {

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

    #if UNITY_IOS
      Debug.Log("iOS");
    #endif

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

    #if UNITY_STANDALONE_WIN
      Debug.Log("Standalone Windows");
    #endif

  }          
}

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

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 iOS");

# else

    Debug.Log("Any other platform");

# endif
特殊フォルダーとスクリプトのコンパイル順
カスタム製スクリプトシンボル