【Unity】Editor起動時のみ処理を実行する

2019/11/21DEVELOP, Unity

InitializeOnLoad属性を付与することで、UnityEditor起動直後や、スクリプトコンパイル直後にクラスの静的コンストラクタを呼び出すことが出来ます。

目次

InitializeOnLoadの使用例

using UnityEngine;
using UnityEditor;
[InitializeOnLoad]
public class Startup
{
    static Startup()
    {
        Debug.Log("Boot Unity Editor!!!");
    }
}

[InitializeOnLoad]属性を付与した全てのクラスの静的コンストラクタが呼び出されます。ゲーム固有の環境セットアップなどの処理を挟み込むには大変便利です。しかし、このままだとEditor起動時のみに処理を絞り込むこと難しいです。

timeSinceStartupと組み合わせる

少し強引な気がしますが EditorApplication.timeSinceStartup を利用して起動した直後かどうかを判断します。 EditorApplication.timeSinceStartup にはEditorが起動してからの時間が入っています。そのため以下の様に組み合わせることで・・・

using UnityEngine;
using UnityEditor;
[InitializeOnLoad]
public class Startup
{
    static Startup()
    {
        //起動して3秒以内
        if (3 < EditorApplication.timeSinceStartup)
        {
            return;
        }
        Debug.Log("Boot Unity Editor!!!");
    }
}

起動直後にのみ処理を走らせることが出来る様になります。

番外編:メソッド版の InitializeOnLoadMethod もあるよ

InitializeOnLoad はクラスに対してでしたが InitializeOnLoadMethod を使えばメソッドに対しても書けます。

using UnityEngine;
using UnityEditor;
public class Startup
{
    [InitializeOnLoadMethod]
    static void Hoge()
    {
        //起動して3秒以内
        if (3 < EditorApplication.timeSinceStartup)
        {
            return;
        }
        Debug.Log("Boot Unity Editor!!!");
    }
}

例では結果は変わらないため好みの方を使うと良いです。

Posted by kazupon