Edited at

[Unity] プレイヤービルド時に出るコンパイルエラーを事前にチェックする


概要

Editorフォルダ以下以外でUnityEditor名前空間のメソッドを使っていてビルド時に怒られるやつが鬱陶しいので、事前にチェックできるようにする。


利点

わざわざプレイヤービルドを行わなくてもコンパイルエラーをチェックすることができて便利。

また、Switch platformしなくても異なるBuildTargetのコンパイルを実行することも可能。


実装


前準備

コンパイルチェックはScriptable Build Pipeline(SBP)を使えば簡単に実装することができる。

ということで、まずScriptable Build Pipelineを導入する。

manifest.jsonに以下を追記する。(1.5.0-previewは2019/06/24現在の最新版)


manifest.json

    "com.unity.scriptablebuildpipeline": "1.5.0-preview",


もしくはAddressablesなどSBPに依存するパッケージを使っている場合は、SBPを個別で追記する必要は無い。


コンパイルチェックの実装

以下のような感じで実装できる。

なお、このスクリプト自体ももちろんEditorフォルダ以下に入れるかAssembly DeffinitionでEditorのみに指定しておく必要がある。


ScriptCompileTester.cs

using System.IO;

using UnityEditor;
using UnityEditor.Build.Player;
using UnityEngine;

public static class ScriptCompileTester
{
/// <summary>
/// 現在のBuildTargetに対してコンパイルチェックを行う
/// </summary>
[MenuItem("Tools/Compile Check/Current Active Target")]
public static void CompileTestForCurrentBuildTarget()
{
CompileTest(EditorUserBuildSettings.activeBuildTarget, EditorUserBuildSettings.selectedBuildTargetGroup);
}

/// <summary>
/// iOSに対してコンパイルチェックを行う
/// </summary>
[MenuItem("Tools/Compile Check/iOS")]
public static void CompileTestForiOS()
{
CompileTest(BuildTarget.iOS, BuildTargetGroup.iOS);
}

/// <summary>
/// Androidに対してコンパイルチェックを行う
/// </summary>
[MenuItem("Tools/Compile Check/Android")]
public static void CompileTestForAndroid()
{
CompileTest(BuildTarget.Android, BuildTargetGroup.Android);
}

/// <summary>
/// コンパイルチェックを行う
/// </summary>
public static void CompileTest(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup)
{
var tempBuildPath = "Temp/CompileTest";

var option = new ScriptCompilationSettings();
option.target = buildTarget;
option.group = buildTargetGroup;
option.options = ScriptCompilationOptions.None;

Debug.Log($"Compile Test Running - BuildTarget: {option.target}");

// NOTE: エラーログはCompilePlayerScripts内で出力される
var result = PlayerBuildInterface.CompilePlayerScripts(option, tempBuildPath);

if (result.assemblies != null && result.assemblies.Count != 0 && result.typeDB != null)
{
Debug.Log($"Compile Test Success! - BuildTarget: {option.target}");
}

// NOTE: tempBuildPathにはコンパイル後のDLLが吐き出されている
if (Directory.Exists(tempBuildPath))
{
Directory.Delete(tempBuildPath, true);
}
}
}



使用例

上記のエディタ拡張を実行するとプレイヤービルド時と同じような感じでErrorやWarningがログに出るので、コンパイルエラーの箇所を潰していく。

コンパイルが通った場合には以下のような表示がログに出る。

ちなみにコンパイルのチェックだけなので、ActiveBuildTargetと異なるBuildTargetのチェックを行ってもSwitch Platformで時間が掛かったりしない。