Unity UGUI实现卡片椭圆方向滚动
程序员文章站
2022-06-30 11:22:06
本文实例为大家分享了ugui实现卡片椭圆方向滚动的具体代码,供大家参考,具体内容如下
搭建简单的场景
运行效果
卡片移动动画通过插件dotween实现
控制...
本文实例为大家分享了ugui实现卡片椭圆方向滚动的具体代码,供大家参考,具体内容如下
搭建简单的场景
运行效果
卡片移动动画通过插件dotween实现
控制脚本:
using unityengine; using system.collections; using unityengine.ui; using dg.tweening; public class cardmove : monobehaviour { gameobject[] sprites; int halfsize; vector2 screencenterpos; public float startangle;//中间卡牌的角度 public float deltaangle;//相邻卡牌的角度差值 public float movespeed;//移动动画的速度 public vector3 center;//椭圆中心点 public float a = 1;//long axis public float b = 1;//short axis int cardcount; // use this for initialization void start () { init (); } // update is called once per frame void update () { } /// <summary> /// 初始化卡牌显示位置 /// </summary> void init(){ screencenterpos = new vector2 (screen.width*0.5f,screen.height*0.5f); cardcount = transform.childcount; halfsize = (cardcount - 1) / 2; sprites=new gameobject[cardcount]; for (int i = 0; i < cardcount; i++) { sprites [i] = transform.getchild (i).gameobject; setposition (i,false); setdeeps (i); } } /// <summary> /// 椭圆的半长轴为a,半短轴为b,计算椭圆上一点的位置 /// x=a*cos(angle),y=b*sin(angle) /// </summary> /// <param name="index">index.</param> /// <param name="usertweener">是否使用tween动画.</param> void setposition(int index,bool usertweener=true){ //计算每一张卡片在椭圆上相对中间卡牌的角度 float angle = 0; if(index<halfsize){//left angle=startangle-(halfsize-index)*deltaangle; }else if(index>halfsize){//right angle = startangle + (index - halfsize) * deltaangle; }else{//medim angle=startangle; } //通过卡牌的角度,计算对应的位置 float xpos = a*mathf.cos((angle/180)*mathf.pi);//+center.x; float ypos = b*mathf.sin((angle/180)*mathf.pi);//+center.y; debug.log ("index="+index+",xpos="+xpos+",ypos="+ypos); vector2 pos = new vector2 (xpos,ypos); // debug.log ("screenpos="+screenpos+",wordpos="+wordpos); //通过dotween控制卡片移动动画 if(!usertweener){ sprites [index].getcomponent<image> ().recttransform.domove(new vector2(screencenterpos.x+pos.x,screencenterpos.y+pos.y),0f); }else sprites [index].getcomponent<image> ().recttransform.domove(new vector2(screencenterpos.x+pos.x,screencenterpos.y+pos.y),1f); } /// <summary> /// 计算每一张卡片的层级 /// </summary> /// <param name="index">index.</param> void setdeeps(int index){ int deep = 0; if (index < halfsize) {//左侧卡牌层级,从左侧到中间,层级依此递增 deep=index; } else if (deep > halfsize) {//右侧卡牌层级,从中间到右侧,层级依此递减 deep=sprites.length-(index+1); } else { deep = halfsize; } sprites [index].getcomponent<recttransform> ().setsiblingindex (deep); } /// <summary> /// 左侧按钮点击,向左移动 /// </summary> public void onleftbtnclick(){ int length = sprites.length; gameobject temp=sprites[0]; for (int i = 0; i < length; i++) {//移动卡片在数组中的位置,依此向前移动一位 if (i == length - 1) sprites [i] = temp; else sprites [i] = sprites [i + 1]; } for (int i = 0; i < length; i++) {//跟新数组卡片需要显示的位置和层级 setposition (i); setdeeps (i); } } /// <summary> /// 右侧按钮点击,向右移动 /// </summary> public void rightbtnclick(){ int length = sprites.length; gameobject temp=sprites[length-1]; for (int i = length-1; i >=0; i--) { if (i == 0) sprites [i] = temp; else sprites [i] = sprites [i - 1]; } for (int i = 0; i < length; i++) { setposition (i); setdeeps (i); } } }
源码下载:地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 秦始皇的一个兵马俑值多少钱?有人是拿“命”来换的?
下一篇: 老子是什么样的人?不争的智慧