个人学习笔记,如有错误、疑问、建议,欢迎留言。 声明:本文不得以任何形式进行转载。
?前言:上一篇文章中我们已经介绍了,如何在Unity 中拓展一个界面,在上一篇文章结尾提到可以使用GUI 、GUILayout 、EditorGUI 、EditorGUILayout 中组件来实现我们想要的功能,不过由于API中的各种组件很多,本文不一一进行介绍,本文只介绍一些在拓展界面时常用的一些其他重要功能。
一、 如何监听组件的更改
1.1 通过GUI.changed属性
?在GUI 中,可以GUI 的静态变量changed 来监听组件是否有更改(当有组件发生改变时,changed 会返回true ):
void OnGUI()
{
GUILayout.Button("Test");
str = GUILayout.TextField(str);
if(GUI.changed)
{
Debug.Log("Changed!");
}
}
?当我们点击按钮或者在文本框输入信息时,就会打印出Changed! 。 ?注:在界面中任何的GUI 更改都会返回true ,也就是说我们无法限制监听的范围,那么如果我们需要只监听某一个组件的状态是否改变怎么办呢?
1.2 通过EditorGUI.BeginChangeCheck()方法
?在EditorGUI 中有一对 方法可以用于监听组件的修改,那便是BeginChangeCheck() 与EndChangeCheck() (在GUI 与EditorGUI 中有很多这种成对出现的方法,可以理解为push 与pop ,可以限制功能生效的范围),还是以上面的代码为例,但是这次我们只监听输入框 的状态:
void OnGUI()
{
GUILayout.Button("Test");
EditorGUI.BeginChangeCheck();
str = GUILayout.TextField(str);
if (EditorGUI.EndChangeCheck())
{
Debug.Log("Changed!");
}
}
?这一次,只有我们改变输入框的状态(即在输入框输入信息),才会打印Changed! 了
二、禁用组件
?在Unity 游戏开发中,我们如果想要禁用 某个游戏对象,只需要使用SetActive(false) 即可,在GUI 与EditorGUI 中同样可以实现这个功能。
2.1 通过GUI.enabled属性
void OnGUI()
{
GUILayout.Button("btn1");
GUI.enabled = false;
GUILayout.Button("btn2");
str = GUILayout.TextField(str);
GUI.enabled = true;
GUILayout.Button("btn3");
}
?在上面的代码中,我们在btn1 组件之后使用了GUI.enabled = false; ,那么在这句语句之后的组件就会被禁用,变为半透明状态,也不能交互。 ?注意:GUI.enabled 会禁用所有之后的组件,所以要记得恢复状态! ?演示如下:
2.2 通过EditorGUI.BeginDisabledGroup()方法
?在EditorGUI 中有一对 方法可以用于控制组件的状态,那便是BeginDisabledGroup() 与EndDisabledGroup() ,如下所示:
void OnGUI()
{
GUILayout.Button("btn1");
EditorGUI.BeginDisabledGroup(true);
GUILayout.Button("btn2");
str = GUILayout.TextField(str);
EditorGUI.EndDisabledGroup();
GUILayout.Button("btn3");
}
?效果和第一种方式相同 ?注意:在第一种方式中,使用的是GUI 的enabled 属性,enabled 的含义是:使能够、使可以、使实现 ,也就是说当它为true 时,是可以实现、可以显示 的,当它为false 时,才是不能显示 的;而在第二种方式中,在EditorGUI.BeginDisabledGroup() 方法的定义中,参数的名称为:disabled
public static void BeginDisabledGroup(bool disabled);
disabeld 的含义是使无效、使不能 ,也就是说当它为true时,是不能显示的 。
|