服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity UGUI实现卡片椭圆方向滚动

Unity UGUI实现卡片椭圆方向滚动

2022-07-09 09:14尘世喧嚣 C#

这篇文章主要为大家详细介绍了UGUI实现卡片椭圆方向滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了UGUI实现卡片椭圆方向滚动的具体代码,供大家参考,具体内容如下

搭建简单的场景

Unity UGUI实现卡片椭圆方向滚动

运行效果

Unity UGUI实现卡片椭圆方向滚动

卡片移动动画通过插件DoTween实现

控制脚本:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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);
  }
 }
}

源码下载:地址

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

原文链接:https://blog.csdn.net/u011484013/article/details/73571988

延伸 · 阅读

精彩推荐
  • C#Unity3D使用右键菜单打开工程

    Unity3D使用右键菜单打开工程

    这篇文章主要为大家详细介绍了Unity3D使用右键菜单打开工程的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    星空不语5352022-07-08
  • C#C#实现获取IIS站点及虚拟目录信息的方法

    C#实现获取IIS站点及虚拟目录信息的方法

    这篇文章主要介绍了C#实现获取IIS站点及虚拟目录信息的方法,可实现获取IIS站点信息及物理路径等功能,具有一定参考借鉴价值,需要的朋友可以参考下...

    蓝图12232021-10-28
  • C#C#中Socket通信用法实例详解

    C#中Socket通信用法实例详解

    这篇文章主要介绍了C#中Socket通信用法,以实例形式较为详细的分析了UDP及TCP两种通信方式的具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    C#教程网8772021-10-26
  • C#c#批量抓取免费代理并且验证有效性的实战教程

    c#批量抓取免费代理并且验证有效性的实战教程

    突破反爬虫限制的方法之一就是多用几个代理IP,下面这篇文章主要给大家介绍了关于利用c#批量抓取免费代理并且验证有效性的相关资料,文中通过示例代...

    张林-布莱恩特11372022-02-25
  • C#微信开发--企业转账到用户

    微信开发--企业转账到用户

    本文主要介绍了微信开发--企业转账到用户的实现方法与步骤。具有很好的参考价值,下面跟着小编一起来看下吧...

    stoneniqiu9272021-12-20
  • C#winform实现创建最前端窗体的方法

    winform实现创建最前端窗体的方法

    这篇文章主要介绍了winform实现创建最前端窗体的方法,涉及C#窗体属性设置的相关技巧,非常具有实用价值,需要的朋友可以参考下...

    我心依旧7702021-10-21
  • C#C#通过html调用WinForm的方法

    C#通过html调用WinForm的方法

    这篇文章主要介绍了C#通过html调用WinForm的方法,涉及html页面中使用JavaScript访问C#的相关技巧,需要的朋友可以参考下...

    且行且思8072021-11-18
  • C#WinForm中BackgroundWorker控件用法简单实例

    WinForm中BackgroundWorker控件用法简单实例

    这篇文章主要介绍了WinForm中BackgroundWorker控件用法,以一个简单实例形式分析了BackgroundWorker控件的定义、设置及使用技巧,具有一定参考借鉴价值,需要的朋友...

    我心依旧7282021-10-20