hildsoftのコード置き場

プログラム関連で調べたことやコードの保管場所です

GUI Error: You are pushing more GUIClips than you are popping. Make sure they are balanced)

スポンサーリンク

f:id:hildsoft:20181022005420j:plain

検証環境

Unity 2018.1.6f1

現象

UnityのGUI.Window、GUILayout.WindowのパラメータGUI.WindowFunctionにdelegate登録したメソッド内で
GUI.BeginScrollView、GUILayout.BeginScrollViewを使っていると、
EditorGUILayout.ColorFieldだけ
クリックしたときにエラー(You are pushing more GUIClips than you are popping)が出る。
ObjectFieldやCurveFieldではエラー出ない。

原因

今回の場合については不明。

同様のエラー内容の場合、多くの原因がスコープの閉じ忘れ。

Begin~、End~
のような対になるべきメソッドが条件分岐やreturnなどで実行されないパターンで発生する。

実験

サンプルコードを実行してカラー選択をクリックする。

カラー選択ダイアログは表示され、処理も行われるようだが、

GUI Error: You are pushing more GUIClips than you are popping. Make sure they are balanced) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

のエラーメッセージが表示される。

サンプルコード

ColorFieldTestWindow .cs

using UnityEngine;
using UnityEditor;

public class ColorFieldTestWindow : EditorWindow
{
    Color color;
    Texture2D tex2D;
    AnimationCurve ac = new AnimationCurve();
    Vector2 sPos;
    Rect windowRect = new Rect(10f, 10f, 280f, 150f);

    [MenuItem("Window/ColorFieldTestWindow")]
    private static void OpenWindow()
    {
        ColorFieldTestWindow window = EditorWindow.CreateInstance<ColorFieldTestWindow>();
        window.Show();
    }

    void OnEnable()
    {
        ac = new AnimationCurve();
    }

    private void OnGUI()
    {
        BeginWindows();
        windowRect = GUI.Window(0, windowRect, WindowCallBack, "Parameter");
        EndWindows();
    }

    private void WindowCallBack(int id)
    {
        sPos = GUILayout.BeginScrollView(sPos);

        color = EditorGUILayout.ColorField("Color Field2", color);
        GUILayout.Space(50);

        tex2D = EditorGUILayout.ObjectField(tex2D, typeof(Texture2D), false) as Texture2D;
        GUILayout.Space(50);

        ac = EditorGUILayout.CurveField(ac);

        GUILayout.EndScrollView();
    }
}

結論

解決していないので原因は不明。 WindowCallBackのようなコールバックメソッド内ではなく、EditorWindow.OnGUIで GUILayout.BeginScrollView~GUILayout.EndScrollViewの中に記述する分には問題なし。

参考

https://answers.unity.com/questions/774863/gui-error-you-are-pushing-more-guiclips-than-you-a-5.html

https://www.facebook.com/groups/unityuserj/permalink/821541751239100/