欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity 3D 官方文档 UGUI总览 IMGUI OnGUI Editor脚本初窥1

程序员文章站 2022-03-26 23:19:35
...

版本: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中的事件。我们可以通过下图看到差别:

Unity 3D 官方文档 UGUI总览 IMGUI OnGUI Editor脚本初窥1

Unity 3D 官方文档 UGUI总览 IMGUI OnGUI Editor脚本初窥1


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太贵了。