Unity实现透视滑动列表
本文实例为大家分享了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、最终效果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 手机厂商抢占京东6·18