Unity编辑器

Unity编辑器整理 - 输入控件聚焦问题

EditorGUI的输入控件在聚焦后,如果在其他地方改变值,聚焦的框不会更新,而且无法取消聚焦,如下图:
控件聚焦

在代码中取消控件的聚焦

取消聚焦的“时机”需要看具体情况,比如上图可以在按下“删除最后一个字符”按钮时取消,也可以通过按下ESC键或者的鼠标移出面板是取消聚焦。。。
代码:

text = EditorGUILayout.TextField("text:", text);
if (GUILayout.Button("删最后一个字符")) {
    if (!string.IsNullOrEmpty(text)&& text.Length>0) {
        text = text.Substring(0, text.Length - 1);
    }
    //在需要时取消聚焦
    GUI.FocusControl(null);
    Repaint();
}
text = EditorGUILayout.TextField("text:", text);
var e = Event.current;

//鼠标离开窗口时,
if (e.type == EventType.MouseLeaveWindow ) {
    GUI.FocusControl(null);//
}

//按esc键退出聚焦
if(e.keyCode == KeyCode.Escape)
{
    GUI.FocusControl(null);//
    Repaint();
}

多个控件,有复杂交互情况时,需要为控件指定一个聚焦名字,灵活操作聚焦逻辑,代码:

GUI.SetNextControlName("text:"); //指定下一控件用于控制聚焦的名字
text = EditorGUILayout.TextField("text:", text);
var rect = GUILayoutUtility.GetLastRect();
var e = Event.current;
if (e.type == EventType.MouseDown //当鼠标点击时
     && !rect.Contains(e.mousePosition) //鼠标不在控件范围内时
    && GUI.GetNameOfFocusedControl() == "text:") { //判断控件处于聚焦状态时

    GUI.FocusControl(null);
}

另外也可以使用GUIUtility.keboardControl获取当前键盘聚焦的控件id.

原文地址:https://www.cnblogs.com/CloudLiu/p/10746067.html