コガネブログ

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

【Unity】エディタ拡張でプロジェクト外のスクリプトをコンパイルできる「AssemblyBuilder」

ソースコード

using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.Compilation;
using UnityEngine;

public static class AssembyBuilderExample
{
    [MenuItem( "AssemblyBuilder Example/Build Assembly Async" )]
    public static void BuildAssemblyAsync()
    {
        // コンパイル対象のスクリプト
        var scripts = new[] { "Test/MyScript1.cs", "Test/MyScript2.cs" };

        // コンパイルされた DLL の出力先
        var outputAssembly = "Test/MyAssembly.dll";

        // コンパイルされた DLL を Unity プロジェクトにコピーする時のコピー先
        var assemblyProjectPath = "Assets/MyAssembly.dll";

        var assemblyBuilder = new AssemblyBuilder( outputAssembly, scripts )
        {
            excludeReferences = new[] { assemblyProjectPath }
        };

        // コンパイルを開始した時に呼び出されます
        assemblyBuilder.buildStarted += assemblyPath => Debug.LogFormat( "Assembly build started for {0}", assemblyPath );

        // コンパイルが完了した時に呼び出されます
        assemblyBuilder.buildFinished += ( assemblyPath, compilerMessages ) =>
        {
            var errorCount   = compilerMessages.Count( x => x.type == CompilerMessageType.Error );
            var warningCount = compilerMessages.Count( x => x.type == CompilerMessageType.Warning );

            Debug.LogFormat( "Assembly build finished for {0}", assemblyPath );
            Debug.LogFormat( "Warnings: {1} - Errors: {0}", errorCount, warningCount );

            if ( errorCount != 0 ) return;

            // コンパイルされた DLL を Unity プロジェクトにコピーします
            File.Copy( outputAssembly, assemblyProjectPath, true );
            AssetDatabase.ImportAsset( assemblyProjectPath );
        };

        // コンパイルを開始します
        if ( assemblyBuilder.Build() ) return;

        Debug.LogErrorFormat( "Failed to start build of assembly {0}!", assemblyBuilder.assemblyPath );
    }
}

参考サイト様