【问题标题】:Unity IMGUI - ArgumentException: Getting control's position when doing MouseDown - OnGUI EventsUnity IMGUI - ArgumentException:在执行 MouseDown 时获取控件的位置 - OnGUI 事件
【发布时间】:2019-07-17 11:46:52
【问题描述】:

我一直在努力使用 IMGUI(旧版和编辑器 GUI 系统)。 问题是我无法理解这种即时方式和所有不同的事件。

我构建了一个简单的示例来展示我对这个系统的诸多挫败感之一。

bool toggleValue;
void OnGUI()
{
    if (toggleValue = GUILayout.Toggle(toggleValue, "Toggle"))
    {
        EditorGUILayout.LabelField("This is a label");
    }
}

好的,所以,在这个非常简单的代码中,我有一个本机切换,根据其状态显示或不显示标签。 效果很好。

现在,我正在自己写一篇文章。

bool toggleValue;
void OnGUI()
{
    if (toggleValue = Toggle(toggleValue, "Toggle"))
    {
       EditorGUILayout.LabelField("This is a label");
    }
}

bool Toggle(bool state, string label)
{
    GUILayout.Label(label, state ? EditorStyles.boldLabel : GUIStyle.none);
    if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
        return !state;
    return state;
}

我的目标是手动重现切换的行为:我的可点击标签在活动时为粗体,在禁用时为正常。类似于原生切换的复选框图形。然后,如果我点击它的矩形,我会返回相反的状态。

在我看来,这应该可行。但是,我知道 OnGUI 函数会发生很多事情,例如事件RepaintLayout,它们的布局需要在一帧中保持一致。这里的错误是

ArgumentException: 在执行 MouseDown 时获取控件 1 在只有 1 个控件的组中的位置

但也经常出现这样的错误

ArgumentException: GUILayout: Mismatched LayoutGroup.MouseDown

我知道这些错误是您在布局和重绘之间更改内容时出现的。但是我找不到我的简单控件的修复程序。所以这是我的问题。

给我的函数 Toggle 提供相同的参数,我需要注意什么才能使切换起作用?

我觉得如果我有这个问题的答案,我或许能够理解这个系统的关键。

非常感谢

【问题讨论】:

    标签: c# unity3d unity-editor


    【解决方案1】:

    天哪,我简直不敢相信。我唯一缺少的是

    Event.current.Use();
    

    当控件被点击时。 就这样! Layout 和 Repaint 之间的布局没有任何变化。

    因此,如果您遇到同样的问题,请在事件成功时使用该事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多