UGUI学习笔记之ScrollView以及ScrollRect和Mask组件

 一、ScrollView介绍

  ScrollView是滚动视图,当我们要呈现的内容长宽大于显示区域时,就可以用到ScrollView,用户可以在指定区域内拖拽而查看内容的全貌(如下图)。

 (ScrollView例子)

   举个实例,游戏“守望先锋”当中有很多设置,都通过同一个界面显示,在Unity中实现这个功能就可以用ScrollView来做。

  

二、结构拆分

  1.结构看似繁琐,但只要稍微理一下,还是比较容易理清的。大体可以看作三个部分:

    (1).最外层的ScrollView,

    (2)内层的Viewport

    (3)内层的Scrollbar Horizontal和Scrollbar Vertical

  下面由简入繁,挨个击破。

三、Scrollbar Horizontal和Scrollbar Vertical

  不管是Scrollbar Horizontal还是Scrollbar Vertical,都只是一个普通的Scrollbar。只不过他们在这里与要展示的内容绑定了(怎么绑定下面有提)

    当要展示的内容宽度超过了显示区域的宽度,就可以用Scrollbar Horizontal水平移动

    当要展示的内容长度超过了显示区域的长度,就可以用Scrollbar Vertical竖直移动

四、Viewport

  Viewport包含两层:外层的Viewport和内层的Content。Content就是我们要显示的内容。Viewport即视口,意为显示窗口,或者理解为显示区域。

  Viewport最需要搞清楚的就是mask组件

 

  1.Mask组件介绍(mask组件官方文档:https://docs.unity3d.com/cn/current/Manual/script-Mask.html

    (1)Mask组件需要和Image组件一起用,二者同时挂在同一个物体上。该物体就变成了一个遮罩层,它的子物体只有在它的范围内(也就是Image的范围内)的部分才会显示出来。在ScrollView中,Mask组件被挂在了Viewport物体上,因此Content只会在Viewport的范围内显示,超出部分隐藏。

 (可以看见图片的矩形区域就是Viewport的大小,所显示的图片比该区域要大,但只显示该矩形区域部分)

    

    (2).Mask的属性

      只有一个Show Mask Graphic属性:是否显示image组件的图片。

    (3).在Viewport上添加mask组件后就会出现神奇的效果。

(viewport没mask组件)

 (viewport有mask组件)

五、ScrollView

  最外层的ScrollView物体包含两个特别的组件:Image组件和ScrollRect组件。其中Image仅仅作为背景图片使用,不需要背景图片或背景颜色即可删除。这里着重记录ScrollRect组件

  (1)Scroll Rect组件的属性

属性  说明
Content 要展示的内容,其他UI控件。即Viewport物体的子项Content物体。
Horizontal 水平方向是否可以拖拽
Vertical   垂直方向是否可以拖拽
Movement Type

移动类型(自己动手尝试一下会比较好理解)

Unrestricted:不受限制的

Elastic:弹性,就像有四条弹簧分别把Content的四边与Viewport的四边绑定了(没有指定Viewport时,就像Content四边与Scroll Rect的四边绑定)

    当把content的边界拖拽进显示区域依然继续拖拽,松开鼠标就会有一个弹性效果。

    Elasticity:弹性强度

Clamped:显示出边界就不能继续拖拽那边了

 Inertia    

是否有惯性。当我们往某个方向拖拽,松开鼠标后,

它是否会因为惯性继续往该方向移动一段距离 

  Deceleration Rate: 减速率。它决定开启惯性后,Content要多久才停下来,0是立马停下来,1是永远不停下来,大于1就移动的越来越块。

 Scroll Sensitivity  使用滚轮和触控板滚动的灵敏度
Viewport

一般是指content的父控件的引用。即前面说过的Viewport物体,作为显示区域而存在。因为mask组件的特性,我们要把需要展示的内容(Content)作为观察窗口的子物体。因此这里把content的父项viewport拖拽进来就行。

注意:当我们制定了Horizontal Scrollbar和Vertical Scrollbar时,将不能通过拖拽的方式调整viewport的大小,而是通过Spacing属性调节

Horizontal Scrollbar

 当内容(Content)横向超出了显示区域之后,用来横向移动的scrollbar

Visibility:可见性

  Permanent:水平scrollbar滚动条总是可见

  Auto Hide:当Content水平长度小于显示区域时,将会隐藏水平滚动条,反之会显示。

  Auto Hide And Expand Viewport:此项要求必须指定Viewport,并且Viewport和horizontal scrollbar均为scroll rect组件所在物体的子物体。选择此项会多出一个Spacing属性,用来调节Viewport的宽度(暂时没看懂有啥用,多了此项后不能通过拖拽随意改变viewport大小) 

Vertical Scrollbar

 

同上

三、Scroll Rect的On Value Changed事件(参考slider的事件处理方式)  

 public void ScrollRectValueChange(Vector2 v)
    {
        Debug.Log("vector2 :"+v);
    }


 六、关于互动范围

  拖拽互动检测范围:ScrollView物体及其任意子物体中,所有包含Raycast Target属性的组件构成的范围。这么说可能不够生动,举个简单的例子:在ScrollView物体新建两个子项Image和Text,其分别包含有Image组件和Text组件,这两个组件都有Raycast Target属性。这两个物体所在范围也会充当ScrollView拖拽的检测范围。

六、简单练习:重组一个ScrollView

  1.新建一个Image作为最外层的ScrollView物体:Hierarchy面板右键->UI->Image,并重命名为ScrollView

 

   2.给该物体添加ScrollRect组件

   3.在ScrollView下新建子项Viewport:在ScrollView上右键->UI->Image,重命名为Viewport,并将Image的Color属性改为绿色。

 

  4. 给Viewport物体添加Mask组件

   5.再在Viewport下新建子项作为要显示的内容Content:在Viewport上右键->UI->Image,重命名为Content,并调整大小。

  6.回到ScrollView的ScrollRect组件上,把刚才新建的Viewport和Content拖拽进对应属性。效果:

   7.最后再搞两个Scrollbar,简单的ScrollView就完工了。

作者:一白梦人

出处:https://www.cnblogs.com/ybmr/p/ugui_scollview.html

版权:本文版权归作者和博客园共有

转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

posted @ 2021-01-30 15:54  一白梦人  阅读(2410)  评论(0编辑  收藏  举报