太郎Work

Unityとかで困ったこと等を残しておきます

Unity5.3でExecuteInEditModeとDontDestroyOnLoadを同時に使用した際の挙動

Unity5.3にアップデートしてかなり発見しにくいバグ?を見つけたのでメモ

問題

[ExecuteInEditMode]
public class Test : MonoBehaviour {
    void Awake() {
        DontDestroyOnLoad (gameObject);
    }
}

こんなクラスがあった時にEditor上でHierarchyにスクリプトを追加しようとすると表示されず、GameObject毎どこかに行ってしまいます。 FindObjectOfTypeを使用するとどこかに存在していることは分かるのですが、困ったことにどこにも見つかりません。

原因

原因はDontDestroyOnLoadの挙動が変更されているからのようです。 このメソッドが呼び出された直後、普段は隠蔽されている”DontDestroyOnLoad”シーンにGameObjectが移動される挙動になっていました。

gameObject.scene.name

でログを出力するとDontDestroyOnLoadシーンに飛ばされていることが分かります。

このシーンは実行直前にHierarchy上で確認することが出来ます。 f:id:tarowork:20151215221022p:plain

(実行が開始すると消えるので動画キャプチャから抜き出しました)

解決策

解決策としては実行している時のみ指定をすれば一応動作します

if (Application.isPlaying) {
    DontDestroyOnLoad (gameObject);
}

滅茶苦茶ハマりました…