【发布时间】: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 函数会发生很多事情,例如事件Repaint 和Layout,它们的布局需要在一帧中保持一致。这里的错误是
ArgumentException: 在执行 MouseDown 时获取控件 1 在只有 1 个控件的组中的位置
但也经常出现这样的错误
ArgumentException: GUILayout: Mismatched LayoutGroup.MouseDown
我知道这些错误是您在布局和重绘之间更改内容时出现的。但是我找不到我的简单控件的修复程序。所以这是我的问题。
给我的函数 Toggle 提供相同的参数,我需要注意什么才能使切换起作用?
我觉得如果我有这个问题的答案,我或许能够理解这个系统的关键。
非常感谢
【问题讨论】:
标签: c# unity3d unity-editor