Unity原生UGUI之Scroll View坑的地方

9 篇文章 0 订阅
8 篇文章 0 订阅

这两天在看Unity官方GUI,早在Unity4.6版本官方就发布了原生GUI,号称效率大大提高,而且听一些同学说虽然有一些坑,但是比较灵活,效率高,还有一个最重要的一点是有官方支持,所有有取代NGUI之势。

于是,为了了解基于UGUI开发的流程,顺便见识一下它的强大,做了一个界面,没想到刚开始就遇到了一个坑。是这样的:我想在一个界面里面做一个横向滚动列表,(可以想象为背包),这个列表里面的数量是动态变化的,在界面打开的时候会根据一个数值来初始化每个子项,每个子项根据各自的数据进行初始化。操作是:玩家可以随意拖动列表查看背包里面的物品信息。

这样的需求是一般游戏的基本需求,由于之前有做NGUI的经验,很自然想到看看Unity官方是否有滚动组件,一查看果然有,果断用上,这个组件叫“Scroll Rect”,表示是可拖动的区域,有一个Content字段标识可拖动的内容,通常把拖动列表放在这个GO下面,还有一个Viewport用来标识可见区域,通常这个字段存放的GO有一个遮罩组件。在做这个界面的时候,是这样理解的:Content存放列表的父物体A,Viewport存放可见区域物体,在界面打开时动态地把列表子项作为A的孩子节点。齐活!

结果在运行时候果然可以看到拖动滚动效果,然而拖动到最右边的时候却拖不动了,这是为啥?看下图


紫色区域是我手动设置的Content的区域,最右边拖不动。

这就是问题:为什么用这个组件没办法拖动到最后呢?以做NGUI的经验来说,在往里面添加子项时,父物体的内容区域会自动增加或者减少来匹配内容。这里的content却是一个恒定值。为了验证这一想法,手动增加了content的区域,运行,拖动,拖动到content区域最右边就无法拖动了。果然这里组件没有自动改变content内容区域,需要随着内容的增加或者减少来用代码来改变区域的大小。这就意味着:只要Content列表子项数量有变化时,都需要重新算一下Content的区域,就是下图这里:


需要根据列表是水平或者垂直拖动,动态改变这两个值。这个就比较蛋疼了。

以我这里水平滚动为例,需要写如下恶心的代码:

GridLayoutGroup gridGroup = npcSRect.content.GetComponent<GridLayoutGroup>();
float cellX = gridGroup.cellSize.x;
float cellY = gridGroup.cellSize.y;
float spaceX = gridGroup.spacing.x;
float spaceY = gridGroup.spacing.y;
float width = childCount*(cellX + spaceX);
float height = npcRT.rect.height;
npcSRect.content.sizeDelta = new Vector2(width, height);
其中,childCount是列表里面子项的总数,当总数有变化时,需要重新设置Content的sizeDelta,这里水平滚动主要改变的是width,通过子项总数和cell的大小及间隔,算出整个的宽度,然后赋值给sizeDelta.

同理,如果是垂直列表,需要改变height.

每个需要滚动的地方都要做这么个重新计算当然很蛋疼,所以需要抽象出来一个新的组件,对Scroll Rect进行完善,项目要用滚动列表时,需要调用自定义的这个组件,完成初始化,保证正确显示列表和滚动。这就是工作量。相信还有很多需要完善的控件。

____________________________________________________________________________________________________________________________

华丽的分割线,更新在这里,以上介绍的是在做滚动条的时候遇到的问题。

后来在网上看别人写的文章的时候发现,Unity不是没有做更新Content的事情,而是我没有发现,其实Unity已经提供了一个组件叫Content Size Fitter组件,它提供了两个可以设置的选项,代码级别的接口可以查看Api.基本能满足简单滚动列表的需求。

欧耶,原来不用写恶心的代码。错怪Unity了。不过这样真的好吗?不知道熟悉Unity自带组件的人是不是第一反应都已经开始“我XX”。嗯。应该熟悉Unity提供的所有关于UI的组件。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值