Unity-编辑器拓展之GUILayout,EditorGUILayout布局 { }

Unity 脚本 API 中文版

链接: https://docs.unity3d.com/cn/2019.4/ScriptReference/

创建自定义窗口

public class MyWindow : EditorWindow//继承unity内置EditorWindow类
{
    
    
	[MenuItem("Window/我的自定义窗口")]
	private static void ShowWindow()
	{
    
    
		//1.用GetWindow方法创建的窗口,只可以打开一个
		MyWindow window = GetWindow<MyWindow>("我的窗口");//字符串为窗口标题
		//2.用CreateWindow方法创建的窗口,可以打开很多个
		MyWindow window = CreateWindow<MyWindow>("我的窗口");
	}
	private void OnGUI()
	{
    
    
		//GUI布局
	}
}

GUILayout.Label

基础

GUILayout.Label("Label");

设置样式和大小

GUIStyle lblStyle = GUI.skin.label;//在unity默认的样式上面修改,如果使用new GUIStyle()的话,绘制出来的Label只有你自己设置的样式
lblStyle.alignment = TextAnchor.MiddleLeft;//
GUILayout.Label("Label", lblStyle, GUILayout.Width(50), GUILayout.Height(50));//必须指定大小,文字位置才有效

使用 GUIContent 代替文字

//无提示写法
GUIContent lblIcon = EditorGUIUtility.IconContent("console.infoicon");//根据icon名字获取unity内置的icon
GUILayout.Label(lblIcon);
//有提示写法
//(1)图标的提示:要加 |
GUIContent lblIcon = EditorGUIUtility.IconContent("console.infoicon", "|这是图标Label");//根据icon名字获取unity内置的icon
GUILayout.Label(lblIcon);
//(2)文字的提示:不用加 |
GUIContent lblStr = new GUIContent("console.infoicon", "这是文字Label");
GUILayout.Label(lblStr);

unity Api
请添加图片描述

GUILayout 滚动视图

滚动视图由GUILayout.BeginScrollView()和GUILayout.EndScrollView()组成,需要滚动的元素放在它们中间

void OnGUI()
{
    
    
	scrollPosition = GUILayout.BeginScrollView(scrollPosition,GUILayout.Width(100),GUILayout.Height(500));
	//放在里面的元素需要是GUILayout类的,比如GUI.Button是不会有滚动效果的
	for(int i = 0; i < 100; i++)
    {
    
    
		GUILayout.Label(i.ToString());
    }
	GUILayout.EndScrollView();
}
private Vector2 scrollPosition = Vector2.zero;

GUIStyle

统一更改所有按钮的样式

void OnGUI()
{
    
    
	GUIStyle btnStyle = GUI.skin.button;
	btnStyle.alignment = TextAnchor.MiddleLeft;
	btnStyle.normal.textColor = Color.white;
	btnStyle.richText = true;//支持渲染HTML标签的文本: <strong>HTML</strong>
	GUILayout.Button("Button", btnStyle, GUILayout.Width(50));
}

自定义某个按钮的样式

void OnGUI()
{
    
    
	GUIStyle goTopBtnStyle = new GUIStyle(GUI.skin.button);
	goTopBtnStyle.alignment = TextAnchor.UpperLeft;
	GUILayout.Button("Button", goTopBtnStyle , GUILayout.Width(50));
}

GUI_Line

用来分割布局内容

void OnGUI()
{
    
    
	UnityEditorExtensions.GUI_Line();
}

GUILayout.HorizontalScope() 和 GUILayout.FlexibleSpace

用该元素可以实现水平居中效果

void OnGUI()
{
    
    
	//创建一个横向的区域
	using (new GUILayout.HorizontalScope())
	{
    
    
		GUILayout.FlexibleSpace();
		_selectedTabID = GUILayout.Toolbar(_selectedTabID, _tabNames, GUILayout.Height(25));
		GUILayout.FlexibleSpace();
	}
}
private int _selectedTabID = 0;
private string[] _tabNames = new string[] {
    
     "tab01", "tab02", "tab03" };

效果
请添加图片描述

unity Api
请添加图片描述


请添加图片描述

EditorGUI.BeginChangeCheck()

和EditorGUI.EndChangeCheck()结合使用
假如你想当一个Popup元素的选中值改变时候才作出相应操作,你可以这样写:

int popupInt = 0;
string[] popupOptions = {
    
     "50", "100" };
void OnGUI()
{
    
    
	EditorGUI.BeginChangeCheck();
	popupInt = EditorGUILayout.Popup(popupInt, popupOptions);
	if(EditorGUI.EndChangeCheck())
	{
    
    
		switch(popupInt)
		{
    
    
			case 0:
				//相应操作
				break;
			case 1:
				//相应操作
				break;
		}
	}
}

unity Api
请添加图片描述

GenericMenu

类似EditorGUILayout.Popup的一个菜单选项,跟Popup不同的是
1.GenericMenu菜单弹出的位置起点是鼠标点击的位置
2.可以多选
3.可以创建嵌套菜单

void OnGUI()
{
    
    
	using (new GUILayout.HorizontalScope())
	{
    
    
	    GUILayout.FlexibleSpace();
	    if (EditorGUILayout.DropdownButton(new GUIContent("DropdownButton"), FocusType.Passive))
	    {
    
    
	        GenericMenu menu = new GenericMenu();
	        //第二个参数控制是否选中,可以根据实际情况控制,例如:选中就显示某个元素,可根据该元素的可见性来控制
	        menu.AddItem(new GUIContent("红色"), redCheck, callback, Color.red);
	        menu.AddItem(new GUIContent("黄色"), yellowCheck, callback, Color.yellow);
	        menu.AddItem(new GUIContent("青色"), cyanCheck, callback, Color.cyan);
	        menu.AddItem(new GUIContent("其他/白色"), false, callback, Color.white);
	        menu.ShowAsContext();
	    }
	    GUILayout.FlexibleSpace();
	}
	using (new GUILayout.HorizontalScope())
	{
    
    
	    GUILayout.FlexibleSpace();
	    redCheck = GUILayout.Toggle(redCheck, "红色");
	    yellowCheck = GUILayout.Toggle(yellowCheck, "黄色");
	    cyanCheck = GUILayout.Toggle(cyanCheck, "青色");
	    GUILayout.FlexibleSpace();
	}
}
void callback(object color)
{
    
    
    if (color.Equals(Color.red)) redCheck = !redCheck;
    else if (color.Equals(Color.yellow)) yellowCheck = !yellowCheck;
    else if (color.Equals(Color.cyan)) cyanCheck = !cyanCheck;
}
bool redCheck, yellowCheck, cyanCheck;

效果
请添加图片描述
unity Api
请添加图片描述

未完待续…

猜你喜欢

转载自blog.csdn.net/weixin_43921423/article/details/126490322