コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】スクリプトのコンパイル時間を大幅に短縮し、C# 7.2 の機能を使用できる「Unity Incremental Compiler」の導入方法を紹介

f:id:baba_s:20180329103456p:plain

はじめに

Unity 2018.1b12 以降で使用できる「Unity Incremental Compiler」が公開されました
これは、次世代コンパイラと呼ばれる「Roslyn」を Unity で使用し、
変更があった部分だけをリコンパイルすることで、
スクリプトのコンパイル時間を大幅に短縮する仕組みです
また、C# 7.2 の機能も使用できるようになります

現在はまだアルファ版の公開となりますが、導入方法を紹介していきます

目次

導入方法

Unity 2018.1.0b12 のインストール

https://unity3d.com/jp/unity/beta-download

「Unity Incremental Compiler」は Unity 2018.1b12 以降で使用できるので、
上記のページから Unity 2018.1.0b12 をダウンロードしてインストールします

Visual Studio 2017 のバージョン 15.6.4 のインストール

https://www.visualstudio.com/ja/downloads/

「Unity Incremental Compiler」を使用するためには、
Visual Studio のバージョンが 15.6.4 以上である必要があります

もしも Visual Studio のバージョンが古い場合は、
上記のページからインストーラをダウンロードしてインストールします

manifest.json の編集

Unity 2018.1.0b12 で Unity プロジェクトを作成したら、
Unity プロジェクトの保存場所をエクスプローラで開き、

f:id:baba_s:20180329103627p:plain

「Packages」フォルダ内の「manifest.json」をテキストエディタで開き、
下記のコードを貼り付けて保存します

{
    "dependencies": {
        "com.unity.incrementalcompiler": "0.0.27"
    },
    "registry": "https://staging-packages.unity.com"
}

Scripting Runtime Version の変更

f:id:baba_s:20180329102858p:plain

Unity で Player Settings を開き、「Scripting Runtime Version」を
「Stable (.NET 4.x Equivalent)」に変更し、Unity プロジェクトを再起動します

「Library/ScriptAssemblies」フォルダの削除

f:id:baba_s:20180329103704p:plain

Unity プロジェクトを一旦閉じて、「Library」フォルダ内の
「ScriptAssemblies」フォルダを削除してから、再度 Unity プロジェクトを開きます

導入できているかどうかの確認

f:id:baba_s:20180329103331p:plain

Unity メニューの「Window>Package Manager」を選択して
表示されたウィンドウに「IncrementalCompiler」が表示されていれば導入完了です

コンソールウィンドウの表示設定

f:id:baba_s:20180329104155p:plain

Unity メニューの「Edit>Preferences...」を選択して表示されたウィンドウで
「Compiler」を選択し、「Show Console Window」をチェックしておくと

f:id:baba_s:20180329104500p:plain

次回から Unity プロジェクトを開いた時に
コンパイル時間が確認できるコンソールが起動するようになります

コンパイル時間確認

f:id:baba_s:20180329110811p:plain

自分の Unity プロジェクトでコンパイル時間を確認してみたところ
下記のような結果になりました

  Assembly-CSharp.dll Assembly-CSharp-Editor.dll
初回 2.320 秒 0.277 秒
2回目以降 0.376 秒 0.143 秒

初回だけはすべてのスクリプトをコンパイルする必要があるため、
コンパイル時間が長くなりますが、
2回目以降は変更があった部分だけがコンパイルされており、
時間が短縮されていることが確認できました

C# 7.2 の機能の使用

using UnityEngine;

public class Example : MonoBehaviour
{
    readonly struct Point
    {
        public readonly int X;
        public readonly int Y;

        public Point( int x, int y ) => ( X, Y ) = ( x, y );
    }

    void Start()
    {
        var pt = new Point( 1, 2 );
        Debug.Log( pt.X + ", " + pt.Y );
    }
}

C# 7.2 から使用できる、readonly struct や

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        var vec = new Vector3();
        vec.Hoge();
        Debug.Log( vec );
    }
}

public static class Vector3Ext
{
    public static void Hoge( ref this Vector3 self )
    {
        self.x = 1;
        self.y = 2;
        self.z = 3;
    }
}

参照渡しの拡張メソッドも問題なく使用できます

問題点

「Unity Incremental Compiler」はまだアルファ版なので、いくつか問題があります

Visual Studio

f:id:baba_s:20180329105415p:plain

Visual Studio において、コードハイライトが一部適用されず、
また、インテリセンスが正常に動作しない状態のようです

関連記事