Unity 3D 官方文档 UGUI总览 IMGUI OnGUI Editor脚本初窥1
版本:unity 5.6.2 语言:C#
总起:
在脚本中添加OnGUI方法后,UI可以使用代码进行完全控制,虽然因为效率的问题现在已经很少使用了,但在Editor脚本中,如果你需要扩展一下Unity编辑器的功能,那掌握该GUI的编写还是非常必要的。
官方给出了三种该UI的用途:
1.游戏中Debug时需要显示一些简单的UI;
2.给Component脚本创建一个自定义的Inspector;
3.创建一个Editor Window,扩展Unity本身。
以下是一个OnGUI使用的小例子:
void OnGUI()
{
if (GUILayout.Button("点我"))
Debug.Log("Hello!");
}
把上面的方法放到任意一个脚本中,然后挂到场景中,运行后就能看到左上角一个按钮,点击就会执行if中的方法。
一些基本使用:
GUI.Button可以创建一个按钮、GUI.Box则能创建一些简单的信息,其中Box的第一个参数Rect需要四个int参数,前两个是对锚点的偏移,而后两个是Box本身的宽高。
在UGUI中,大家一开始就会接触锚点和轴点以保证UI的适配,而在OnGUI中没有那么明显的设置,需要通过Screen.Width和Screen.height获取当前屏幕的宽高来手动调节锚点。
举两个例子:
1.右上:new Rect(Screen.width - 100, 0, 100, 50);
2.*:new Rect((Screen.width - 100) / 2 , (Screen.heigth - 50) / 2, 100, 50)。
通常GUI的第一个参数就是上面的Rect,而第二个参数能控制显示具体的内容:string、Texture2D。
如果需要string和Texture2D同时显示,则可以使用GUIContent类,不过提供的显示效果有限,只能图片后面跟着文字。
显示控制:
这边介绍一些GUI常用的方法,比如GUI.Label可以创建一个文字标签。
当然比起GUI,更常用的是GUILayout,因为GUILayout可以自动进行布局,而GUI的所有控件的显示必须指定Rect,不过除了是否自动布局这点,其他的都是一样的。
♦ Label
单纯的显示一些文字图片,不能被点击。
♦ Button
按钮,在点击释放的时候就会触发if内的代码。
♦ RepeatButton
同样是按钮,不同的是,按住的时候每帧都会触发if中的事件。我们可以通过下图看到差别:
♦ TextField
提供了可交互功能的Label,用户可以输入文字,返回值是文本框内的文字,用法:tmpStr = GUILayout.TextField(tmpStr)。
♦ TextArea
文本区域,类似TextField,但是他提供了多行显示。
♦ Toggle
复选框,返回值是当前选项的bool值,当然功能没有UGUI的Toggle可以控制显示很多效果。
♦ Toolbar
Toolbar是一组按钮,在同一情况下只能被选中一个,返回值是当前选中的int。UGUI提供的组件比这边的少很多,原因是很多都能进行替代,比如这个Toolbar就可以使用UGUI中的Toggle实现。
♦ SelectionGrid
类似Toolbar,但可以显示多行按钮。
♦ HorizontalSlider
水平的滑动条,最小值和最大值需要自己指定。
♦ VerticalSlider
垂直的滑动条。
♦ HorizontalScrollbar
水平滚动条,其实跟Slider差不多,只是显示效果不太一样。
♦ VerticalScrollbar
垂直滚动条。
♦ ScrollView
滚动视图,自带两个滚动条,返回值是Vector2,指明当前滚动到的位置。参数中第二个Rect指明里面内容的大小。
♦ Window
一个可以拖动的窗口,这个可以看作是一个独立的UI页,需要单独显示在一起的UI组可以放到其中,并且在其回调方法中可以指定被拖动的范围。
// 位置大小设定
Rect rect = new Rect(20, 20, 120, 50);
void OnGUI()
{
rect = GUI.Window(0, rect, WindowFunction, "window");
}
// 拖动时执行的方法
void WindowFunction(int windowID)
{
// 窗口内部按钮
if (GUILayout.Button("btn"))
print("click");
// 指定可以拖动,该Rect并不是想象中的一个拖动范围,只是指定点窗口的哪个区域可以拖动
// 而且可拖动区域不会超过该窗口
GUI.DragWindow(new Rect(0, 0, 120, 50));
}
♦ GUI.changed
当前UI是否变化,可以通过该值来处理值变化后的一些情况。
OK,内容不算多,之后的内容等下一章再介绍。
个人:
这两天笔记本坏了,准备更换一台台式,就是现在显卡、内存条、SSD太贵了。