Version: 2023.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_SERVER Scripting symbol for compiling/executing code for a dedicated server (Mac OS X, Windows or Linux).
UNITY_WII Wii コンソール用のコードをコンパイル/実行するためのスクリプトシンボル
UNITY_IOS iOS プラットフォーム用のコードをコンパイル/実行するためのスクリプトシンボル
UNITY_IPHONE 非推奨。代わりに UNITY_IOS を使用してください。
UNITY_ANDROID Android プラットフォーム用のスクリプトシンボル
UNITY_LUMIN Scripting symbol for the Magic Leap OS platform. You can also use PLATFORM_LUMIN. Note that the Lumin platform is no longer supported.
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 ディレクティブ
ENABLE_VR Defined when the target build platform supports VR. Does not imply that VR is currently enabled or that the necessary plug-ins and packages needed to support VR are installed.
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 Defined when your script is running in a player which was built with the Development Build option enabled.

This define only reflects whether the development build checkbox was selected at the time of the build. To determine whether your script is running in the development build, use Debug.isDebugBuild. __DEVELOPMENT\_BUILD__ is not sufficient to determine whether you’re currently running in a development build as many platforms allow you to change between development and non-development build without rebuilding the project. On some platforms, Unity does not support switching between development and non-development builds in the Editor and requires switching after the build. For example, you can build for Windows with the Create Visual Studio solution option which means that you have to select whether you want a development or non-development build in Visual Studio. Switching in Visual Studio will not recompile your scripts and thus will not reevaluate scripting defines. Another example is switching from the final game build to a development build by swapping UnityPlayer.dll in the game build with one from a development build which is useful for debugging live game builds.

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

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

まず初めに、コードをテストしたいプラットフォームを選択するために 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("Unity iOS");
    #endif

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

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

  }          
}

To test the code, click Play Mode. Confirm that the code works by checking for the relevant messages in the Unity console, depending on which platform you selected - for example, if you choose iOS, the messages “Unity Editor” and “Unity iOS” are set to appear in the console.

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
特殊フォルダーとスクリプトのコンパイル順
カスタム製スクリプトシンボル
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961