Unity编辑器拓展之九:SearchField

博客迁移

个人博客站点,欢迎访问,www.jiingfengji.tech

正文

Unity官方介绍文档:

https://docs.unity3d.com/ScriptReference/IMGUI.Controls.SearchField.html

#Properties

1、autoSetFocusOnFindCommand:当用户按下“Ctrl/Cmd + F”时,聚焦该控件,默认值为true
相关代码:

private bool m_AutoSetFocusOnFindCommand = true;

public bool autoSetFocusOnFindCommand
{
	get
	{
		return this.m_AutoSetFocusOnFindCommand;
	}
	set
	{
		this.m_AutoSetFocusOnFindCommand = value;
	}
}

private void CommandEventHandling()
{
	Event current = Event.current;
	if (current.type == EventType.ExecuteCommand || current.type == EventType.ValidateCommand)
	{
		//UnityEngine内部应该建立了commandName与按键的对应关系
		//https://docs.unity3d.com/ScriptReference/Event-commandName.html
		if (this.m_AutoSetFocusOnFindCommand && current.commandName == "Find")
		{
			if (current.type == EventType.ExecuteCommand)
			{
				this.SetFocus();
			}
			current.Use();
		}
	}
}

2、searchFieldControlID
控件的ControllID,就不多介绍了,构造函数里会为它赋值。

#公有函数:
构造函数:

public SearchField()
{
	this.m_ControlID = GUIUtility.GetPermanentControlID();
}

HasFocus:

public bool HasFocus()
{
	return GUIUtility.keyboardControl == this.m_ControlID;
}

SetFocus:

public void SetFocus()
{
	this.m_WantsFocus = true;
}

OnGUI
提供了三个重载:

public string OnGUI(string text, params GUILayoutOption[] options);
public string OnGUI(Rect rect, string text);
public string OnGUI(Rect rect, string text, GUIStyle style, GUIStyle cancelButtonStyle, GUIStyle emptyCancelButtonStyle);
public string OnGUI(Rect rect, string text, GUIStyle style, GUIStyle cancelButtonStyle, GUIStyle emptyCancelButtonStyle)
{
	this.CommandEventHandling();
	this.FocusAndKeyHandling();
	float fixedWidth = cancelButtonStyle.fixedWidth;
	Rect position = rect;
	position.width -= fixedWidth;
	text = EditorGUI.TextFieldInternal(this.m_ControlID, position, text, style);
	Rect position2 = rect;
	position2.x += rect.width - fixedWidth;
	position2.width = fixedWidth;

	//搜索框的 X 按钮
	if (GUI.Button(position2, GUIContent.none, (!(text != "")) ? emptyCancelButtonStyle : cancelButtonStyle) && text != "")
	{
		//搜索文字 置为 Empty,并取消其聚焦
		text = "";
		GUIUtility.keyboardControl = 0;
	}
	return text;
}

public string OnGUI(Rect rect, string text)
{
	//EditorStyles.searchField = 搜索框样式
	//EditorStyles.searchFieldCancelButton= 搜索框取消按钮样式
	//EditorStyles.searchFieldCancelButtonEmpty = 搜索框 搜索关键字为空时的 样式
	return this.OnGUI(rect, text, EditorStyles.searchField, EditorStyles.searchFieldCancelButton, EditorStyles.searchFieldCancelButtonEmpty);
}

public string OnGUI(string text, params GUILayoutOption[] options)
{
	Rect rect = GUILayoutUtility.GetRect(36f, 1E+07f, 16f, 16f, EditorStyles.searchField, options);
	return this.OnGUI(rect, text);
}

#私有函数:

FocusAndKeyHandling:

private void FocusAndKeyHandling()
{
	Event current = Event.current;
	//SetFocus公有接口将私有变量m_WantsFocus置为true,将controlID赋值给GUIUtility.keyboardControl以此实现Focus
	if (this.m_WantsFocus && current.type == EventType.Repaint)
	{
		GUIUtility.keyboardControl = this.m_ControlID;
		EditorGUIUtility.editingTextField = true;
		this.m_WantsFocus = false;
	}
	if (current.type == EventType.KeyDown && (current.keyCode == KeyCode.DownArrow || current.keyCode == KeyCode.UpArrow) && GUIUtility.keyboardControl == this.m_ControlID && GUIUtility.hotControl == 0)
	{
		if (this.downOrUpArrowKeyPressed != null)
		{
			this.downOrUpArrowKeyPressed();
			current.Use();
		}
	}
}

#Event:

downOrUpArrowKeyPressed:
搜索字段时检测到向上或者向下键被按下时,可以用来改变键盘焦点到另一个控件,例如TreeView,如下图

这里写图片描述

public event SearchField.SearchFieldCallback downOrUpArrowKeyPressed
{
	add
	{
		SearchField.SearchFieldCallback searchFieldCallback = this.downOrUpArrowKeyPressed;
		SearchField.SearchFieldCallback searchFieldCallback2;
		do
		{
			searchFieldCallback2 = searchFieldCallback;
			searchFieldCallback = Interlocked.CompareExchange<SearchField.SearchFieldCallback>(ref this.downOrUpArrowKeyPressed, (SearchField.SearchFieldCallback)Delegate.Combine(searchFieldCallback2, value), searchFieldCallback);
		}
		while (searchFieldCallback != searchFieldCallback2);
	}
	remove
	{
		SearchField.SearchFieldCallback searchFieldCallback = this.downOrUpArrowKeyPressed;
		SearchField.SearchFieldCallback searchFieldCallback2;
		do
		{
			searchFieldCallback2 = searchFieldCallback;
			searchFieldCallback = Interlocked.CompareExchange<SearchField.SearchFieldCallback>(ref this.downOrUpArrowKeyPressed, (SearchField.SearchFieldCallback)Delegate.Remove(searchFieldCallback2, value), searchFieldCallback);
		}
		while (searchFieldCallback != searchFieldCallback2);
	}
}

以上代码为使用ILSpy工具反编译得来,仅供学习使用。

以上知识分享,如有错误,欢迎指出,共同学习,共同进步。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity编辑器拓展Editor Extension)可以通过自定义的脚本来扩展Unity编辑器的功能和界面,以满足特定项目的需求。通过编辑器拓展,开发者可以创建自定义的编辑器窗口、工具栏按钮、菜单项、检视面板等,来增强Unity编辑器的功能和流程。 要创建一个Unity编辑器拓展,你可以使用C#编写一个继承自Editor类的脚本。这个脚本可以通过Unity的Inspector面板来设置相关的属性和行为。以下是一个简单的示例: ```csharp using UnityEngine; using UnityEditor; public class MyEditorExtension : EditorWindow { [MenuItem("Custom Tools/My Editor Window")] public static void OpenWindow() { // 创建并打开一个自定义的编辑器窗口 MyEditorExtension window = (MyEditorExtension)EditorWindow.GetWindow(typeof(MyEditorExtension)); window.Show(); } private void OnGUI() { // 在编辑器窗口中绘制UI元素 GUILayout.Label("Hello, I am a custom editor window!"); if (GUILayout.Button("Click Me")) { Debug.Log("Button clicked!"); } } } ``` 上述代码创建了一个自定义的编辑器窗口,并在窗口中绘制了一个标签和一个按钮。通过在Unity编辑器中点击"Custom Tools"菜单下的"My Editor Window",可以打开这个自定义的编辑器窗口。 除了编辑器窗口,你还可以通过继承Editor类来创建自定义的检视面板、菜单项等。Unity官方文档中有更详细的教程和示例,可以帮助你更深入地了解和使用Unity编辑器拓展

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值