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

Unity实现透视滑动列表

程序员文章站 2022-03-26 09:11:24
本文实例为大家分享了unity实现透视滑动列表的具体代码,供大家参考,具体内容如下1、目的有时候,为了实现更好的美术效果,需要实现一些特殊的滑动列表,例如轨迹滑动,也有透视滑动。注意:本文里所展示的效...

本文实例为大家分享了unity实现透视滑动列表的具体代码,供大家参考,具体内容如下

1、目的

有时候,为了实现更好的美术效果,需要实现一些特殊的滑动列表,例如轨迹滑动,也有透视滑动。
注意:本文里所展示的效果是未经测试的试验版,如果用于实际项目中,应该还需要优化代码和测试性能

2、思考

透视滑动列表可以有两种方式来实现:

第一种方法是,通过shader实现,其核心原理是,定义一个中心点坐标(centerx,centery),再定义一个透视系数_ offsetperspective,在vert函数中,对于每个顶点,计算其偏移值,距离自己定义的中心点越远的顶点,其偏移值越大,简单概括就是距离中心点越远的顶点,就越把往中心点拉回去。实际算法就是:

out.worldposition.x += (_centery + v.vertex.y - _offsetx) / 1000 * (v.vertex.x - _centerx) * _offsetperspective
这是我所使用的计算公式,其中,_offsetx是自定义的偏移值,用于对所有顶点进行整体偏移;/ 1000是偏移值的缩放倍数,此值越小偏移程度越高。

注意:用这个方法做出来的透视滑动列表,主要的问题是一些交互控件的偏移问题,因为视觉效果偏移了,但是实际上可交互控件的位置没有变,所以其点触范围是没有透视效果时的范围,这就会导致偏移的时候其点触范围不一样,所以需要第二种方法。

第二种方法是使用纯c#来实现,其核心原理是,通过遍历所有子节点的image和text节点,同样使用第一种方法的思路修改其vertexhelper中顶点的偏移值,再将修改完的顶点设置回vertexhelper中,然后重新生成一个mesh,并将mesh设置为canvasrenderer的mesh。为了得到正确的点触范围,还需要在节点中添加meshcollider组件,通过代码设置meshcollider组件的mesh属性,并将image或text节点的raycast target属性取消勾选,这样就能保证最正确的点触范围了。
然后,因为滑动列表是可以滑动的,所以还需要滑动的时候一直通过上述方法动态修改节点,这里使用滑动列表自带的onvaluechange函数就行

注意:使用过多的meshcollider对性能必定有消耗,不过image和text生成的mesh都是比较简单的,具体的性能消耗还是需要进行测试才能得出结果

3、自定义实现轨迹滑动

核心原理已经在上面说了,这里直接上代码:

因为需要获取到image组件或text组件的顶点辅助类vertexhelper,所以需要通过graphic类的onpopulatemesh函数来获取vertexhelper类,但是onpopulatemesh函数是受保护的函数,因为需要在graphic类中添加一个公用的函数onpopulatemesh_public:

4、问题

一、首先就是性能方面的消耗,因为滑动时是会一直有计算顶点的消耗的
二、还有就是初始化的问题,在start函数中已经调用过一次修改顶点的函数了,但是在unity编辑器模式下的实际效果并没有显示出来,需要手动滑一下才会显示出正确的效果。即使在start函数中调用两次也是会出现这个问题

5、最终效果

Unity实现透视滑动列表

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。