UnityのEditor拡張のソースを変更するとメンバー変数は初期化されInit()は呼ばれない

Global Game Jam 2015に参加したこともあって、久しぶりにUnityを触る機会が増えてます。
なので、以前に練習で作ったhttps://github.com/kanonji/CommandViewというエディタ拡張のバグの原因っぽいものが分かったので、メモ残しておきます。

あと、たまに生成出来なくなるときがあります。メニューからCommandViewを選択し直すと復活。これはなんか、今回クラス分割した時にバグ作っちゃった気がしないでもないです。
UnityでCLIっぽくGameObjectを生成するエディタ拡張の試作 | kanonjiのブログ

バグはこれです。
原因はタイトルの通りだけど、文章じゃどういう事か説明出来る気がしないので、サンプルコードをベースに書きます。

kanonji/CommandView at v0.2

あと、まぁ自分しか使ってないだろうけど、CommandViewも修正しといた。

サンプルコード

using UnityEngine;
using UnityEditor;

public class ExampleView : EditorWindow {

    public static string foo = "";
    public static string bar = "bar"

    [MenuItem ("MyMenus/ExampleView")]
    public static void Init () {
        EditorWindow.GetWindow<ExampleView> (false, "ExampleView View");
        foo = "updated by Init()";
        bar = "updated by Init()";
    }

    public void OnGUI () {
        Debug.Log(foo);
        Debug.Log(bar);
    }
}

解説

Init()の呼ばれるタイミング

この例で言うと[MenuItem ("MyMenus/ExampleView")]によって、UnityEditorのメニューに、Example Viewを開く項目が追加されます。
それをクリックしてExample Viewを開いたタイミングでInit()は呼ばれました。
正確には、Example Viewが既に開いてる状態でも、メニューをクリックするとInit()は呼ばれます。

エディタ拡張のソースを変更するとメンバー変数は初期化される

UnityEditorが起動しててこのエディタ拡張が読み込まれてる状態でも、エディタ拡張は書き換えられるし、随時変更は反映されます。
ただ、書き換えを行った場合、少なくともstaticメンバー変数は初期化される様です。
ここでいう初期化というのはInit()ではなく、クラス定義の状態に戻るという意味です。

public static string foo = "";
public static string bar = "bar"

これに戻るのでOnGUI()内のDebug.Log()では、空文字列とbarが出力されます。

ソースを変更した場合は、読み込みし直さないとならないはずだし、そのタイミングではInit()は呼ばれてない事は確認出来てるので、よく考えたらまぁそうなるだろうなって動きではあります。

なので、もしエディタ拡張をUnityEditor起動中に書き換えたら、その拡張の起動し直しが必要みたい。ウィンドウを持たない拡張だと、どうなるのか作った事無いから分からないけど。

staticじゃないメンバー変数は、確認してないけど多分初期かされるんじゃないかな。でも、staticなInit()で値を入れる事は無いから、問題にはならなさそうです。

環境

環境 バージョン
Unity 4.6.1f1

書いた日

2015年2月1日頃

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>