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();
を利用することをおすすめする