Version: 2022.1
言語: 日本語
Mono 概要
IL2CPP 追加引数のためのプラットフォーム固有の設定

IL2CPP の概要

IL2CPP (Intermediate Language To C++) スクリプティングバックエンドは、Mono バックエンドの代替品です。IL2CPP は、広範なプラットフォームのアプリケーションに対し、優れたサポートを提供します。IL2CPP バックエンドは、MSIL (Microsoft Intermediate Language) コード (スクリプト内の C# コードなど) を C++ コードに変換し、その C++ コードを使って選択したプラットフォーム用のネイティブのバイナリファイル (.exe、.apk、.xap など) を作成します。

This type of compilation, in which Unity compiles code specifically for a target platform when it builds the native binary, is called ahead-of-time (AOT) compilation. The Mono backend compiles code at runtime, with a technique called just-in-time compilation (JIT).

このページには以下の情報が含まれています。

AOT コンパイルをサポートしないプラットフォームもあります。そのため、IL2CPP バックエンドはすべてのプラットフォームで動作するわけではありません。また、AOT と IL2CPP をサポートしても、JIT コンパイルができないため、Mono バックエンドをサポートできないプラットフォームもあります。プラットフォームが両方のバックエンドをサポートする場合は、Mono がデフォルトとなります。詳細については、スクリプトの制限 を参照してください。

IL2CPP は、さまざまなプラットフォームのパフォーマンスを向上させることができますが、ビルドされたアプリケーションにマシンコードを置く必要があるため、ビルド時間と最終的にビルドされたアプリケーションのサイズの両方が増加します。詳細については、IL2CPP の仕組みとブログシリーズ An introduction to IL2CPP internals を参照してください。

IL2CPP は、Mono スクリプトバックエンドと同じ方法でマネージドコードのデバッグをサポートします。詳細は、Unity での C# コードのデバッグ を参照してください。

IL2CPP を使ったプロジェクトのビルド

To build a project with IL2CPP, you need to have the backend installed in your Unity installation. You can select IL2CPP as an optional module when you first install a version of Unity, or add IL2CPP support to an existing installation through the Unity Hub. For more information, see Installing the Unity Hub and Add modules to the Unity Editor.

IL2CPP also requires some systems native to the target platform to generate the C++ code. This means that to use IL2CPP on a specific platform, you need to build the application on that platform. For example, to use IL2CPP with MacOS as a build target, you need to build the application on a machine that uses MacOS. For more information about system requirements for desktop platforms, including IL2CPP requirements for individual platforms, see the Desktop section of System Requirements for Unity.

Unity がアプリケーションのビルドに使用するスクリプティングバックエンドを変更するには、次の 2 つの方法があります。

  • エディターの Player Settings メニューから。以下の手順で、Player Settings メニューからスクリプティングバックエンドを変更します。

    1. Edit > Project Settings の順に移動します。
    2. Player Settings ボタンをクリックし、 ** Inspector** に表示された現在のプラットフォームの ** Player** 設定を開きます。
    3. Other SettingsConfiguration セクションに移動します。
    4. Scripting Backend ドロップダウンをクリックして、IL2CPP を選択します。

    Player Settings メニューは、Build Settings メニューの中からも開くことができます。 File > Build Settings と移動し、Player Settings ボタンをクリックしてください。

  • エディターのスクリプティング API を通じて、PlayerSettings.SetScriptingBackend プロパティを使用して、Unity が使用するスクリプティングバックエンドを変更します。

The Configuration section of the Player settings
The Configuration section of the Player settings

To start the build process, open the Build Settings window and click the Build button. Unity then converts your C# code and assemblies into C++ and finally produces a binary file for your target platform.

IL2CPP のしくみ

IL2CPP を使用してビルドを開始すると、Unity は自動的に以下の手順を実行します。

  1. Roslyn C# コンパイラーは、アプリケーションの C# コードと必要なすべてのパッケージコードを .NET DLL (マネージアセンブリ) にコンパイルします。
  2. Unity はマネージ バイトコードストリッピング を適用します。この手順により、ビルドされたアプリケーションのサイズを大幅に削減することができます。
  3. IL2CPP バックエンドは、すべてのマネージアセンブリを標準の C++ コードに変換します。
  4. C++ コンパイラーは、生成された C++ コードと IL2CPP のランタイム部分をネイティブのプラットフォームのコンパイラーでコンパイルします。
  5. そのコードをターゲットとするプラットフォームによって、実行ファイルか DLL のいずれかにリンクします。

IL2CPP と Mono 両方とも、スクリプトの属性で制御できる便利なオプションをいくつか提供します。詳細は、プラットフォーム依存コンパイル を参照してください。

IL2CPP は、Unity が特定のプラットフォーム用にコードを事前にコンパイルすることを可能にします。このプロセスの最後に Unity が生成するバイナリファイルには、ターゲットプラットフォームに必要なマシンコードがすでに含まれていますが、Mono はこのマシンコードをランタイムにコンパイルしなければなりません。AOT コンパイルは、ビルド時間を増加させますが、ターゲットプラットフォームとの互換性を高め、パフォーマンスを向上させることができます。

どちらのスクリプティングバックエンドも、ターゲットとするプラットフォームごとに新規にビルドする必要があります。例えば、Android と iOS の両方のプラットフォームをサポートするためには、アプリケーションを 2 回ビルドし、2 つのバイナリファイルを作成する必要があります。

アセンブリストリッピングステージでは、最終的なバイナリサイズを小さくすることができます。Unity は、最終的にビルドされるアプリケーションが使用しないバイトコードを削除します。

IL2CPP のビルド時間の最適化

IL2CPP を使用するプロジェクトのビルド時間は、Mono を使用する場合よりも大幅に長くなることがあります。しかし、ビルド時間を短縮するためにいくつか工夫できます。

マルウェア対策ソフトのスキャンからプロジェクトを除外する

プロジェクトをビルドする前に、Unity のプロジェクトフォルダーとターゲットのビルドフォルダーをマルウェア対策ソフトのスキャン対象から除外します。

プロジェクトとターゲットビルドフォルダーをソリッドステートドライブ (SSD) に保存する

Solid State Drive (SSD) は以前からあるハードディスクドライブ (HDD) に比べ、より速く読み込み、書き込みを行えます。IL コードを C++ に変換しそれをコンパイルすることは、大量の読み込み、書き込み操作を伴います。ストレージデバイスのスピードが速いと、この処理もより早くなります。

Change the IL2CPP Code Generation option in the Build Settings

To change how IL2CPP generates code, open the Build Settings and configure the IL2CPP Code Generation option By default, the Faster runtime option is enabled, which produces more machine code that reduces the impact of IL2CPP at runtime. To reduce build times, you can set this option to Faster (smaller) builds. This method produces and includes less machine code in the binary executable and so can reduce performance at runtime, but also significantly reduces build times and binary size.

Enabling runtime checks using Il2CppSetOption

When you use the IL2CPP scripting backend, you can control how il2cpp.exe generates C++ code. You can use the Il2CppSetOption attribute to enable or disable the following runtime checks:

プロパティ 説明 デフォルト
Null checks このオプションを有効にすると、IL2CPP が生成する C++ コードにはに null チェックが加えられ、必要に応じてマネージ NullReferenceException 例外が投げられます。このオプションを無効にすると、生成された C++ コードに null チェックを加えません。

この設定を無効にすると、Unity が生成されたコードの null 値にアクセスしようとするのを防げないため、誤った動作の原因になる可能性があります。Unity では、このオプションを無効にしないことを推奨します。
有効
Array bounds checks If this option is enabled, the C++ code that IL2CPP generates contains array bounds checks and throws managed IndexOutOfRangeException exceptions as necessary. If this option is disabled, IL2CPP doesn’t emit the array bounds checks into the generated C++ code.

For some projects, disabling this option might improve runtime performance. However, when this option is disabled, Unity doesn’t prevent attempts to access an array with invalid indices in the generated code, which might lead to incorrect behavior, including reading from or writing to arbitrary memory locations. In most cases, these memory accesses occur without any immediate side effects, and can corrupt the state of the application with no obvious warning signs. This can make debugging these errors extremely difficult. Unity recommends that you keep this option enabled.
有効
Divide by zero checks このオプションを有効にすると、IL2CPP によって生成される C++ コードには、整数のゼロ除算チェックが加えられ、必要に応じて管理された DivideByZeroException 例外を投げます。このオプションを無効にすると、IL2CPP は生成される C++ コードに整数のゼロ除算チェックを加えません。

これらのチェックは、実行時のパフォーマンスに影響を与えます。このオプションは、ゼロ除算チェックを実行する必要がある場合にのみ有効にし、そうでない場合は無効のままにしてください。
無効

To use the Il2CppSetOption attribute:

  1. Unity バージョンがインストールされているディレクトリで、Windows の場合は Data\il2cpp ディレクトリ、OS X の場合は Contents/Frameworks/il2cpp ディレクトリに移動してください。
  2. Find the Il2CppSetOptionAttribute.cs source file.
  3. ソースファイルをプロジェクトの Assets ディレクトリにコピーします。

以下の例では、Il2CppSetOption 属性の使い方を説明します。

[Il2CppSetOption(Option.NullChecks, false)]
public static string MethodWithNullChecksDisabled()
{
    var tmp = new object();
    return tmp.ToString();
}

You can apply Il2CppSetOption attribute to types, methods, and properties. Unity uses the attribute from the most local scope.

[Il2CppSetOption(Option.NullChecks, false)]
public class TypeWithNullChecksDisabled
{
    public static string AnyMethod()
    {
        // このメソッドでは、Unity は null チェックを行いません
        var tmp = new object();
        return tmp.ToString();
    }

    [Il2CppSetOption(Option.NullChecks, true)]
    public static string MethodWithNullChecksEnabled()
    {
        // このメソッドでは、Unity は null チェックを行います
        var tmp = new object();
        return tmp.ToString();
    }
}

public class SomeType
{
    [Il2CppSetOption(Option.NullChecks, false)]
    public string PropertyWithNullChecksDisabled
    {
        get
        {
            // ここでは、Unity は null チェックを行いません
            var tmp = new object();
            return tmp.ToString();
        }
        set
        {
            // ここでは、Unity は null チェックを行いません
            value.ToString();
        }
    }

    public string PropertyWithNullChecksDisabledOnGetterOnly
    {
        [Il2CppSetOption(Option.NullChecks, false)]
        get
        {
            // ここでは、Unity は null チェックを行いません
            var tmp = new object();
            return tmp.ToString();
        }
        set
        {
            // ここでは、Unity は null チェックを行います
            value.ToString();
        }
    }
}

•2018–05–15 修正されたページ

Mono 概要
IL2CPP 追加引数のためのプラットフォーム固有の設定