うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】OnGUI の描画処理を終了させる

Listの要素を増減させる Editor 拡張を作成した際に

下記のようにスクリプトを書くと、消したタイミングでエラーが発生する

public class EditorSampleWindow : EditorWindow
{
    private List<int> _intList = new List<int>()
    {
        1, 2, 3, 4, 5
    };

    private void OnGUI()
    {
        foreach (var i in _intList)
        {
            using (new EditorGUILayout.HorizontalScope())
            {
                EditorGUILayout.LabelField(i.ToString());
                if (GUILayout.Button("Delete"))
                {
                    _intList.Remove(i);
                }
            }
        }
    }
}
InvalidOperationException: Collection was modified; enumeration operation may not execute.

これは要素数が変わったため foreach でループできなくなったエラーになる

こういったエラーの対応をするために GUIUtility.ExitGUI(); を利用する

これを呼び出すことで、これ以降の描画処理をすべてスキップしてくれる

先程のスクリプトを修正するとこのようになる

    private void OnGUI()
    {
        foreach (var i in _intList)
        {
            using (new EditorGUILayout.HorizontalScope())
            {
                EditorGUILayout.LabelField(i.ToString());
                if (GUILayout.Button("Delete"))
                {
                    _intList.Remove(i);
                    GUIUtility.ExitGUI();
                }
            }
        }
    }

これくらいの処理であれば return で終わっても問題が無いが、他のメソッドを利用していた場合だと return

だけでは対応できないことがあるので、GUIUtility.ExitGUI(); を利用することをおすすめする