21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-24

概要

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がログに出るので、コンパイルエラーの箇所を潰していく。
コンパイルが通った場合には以下のような表示がログに出る。

image.png

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

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?