实现图片的一个轮转效果,可左右拖拽面板进行轮转,也可点击左右按钮进行轮转
1.效果图
2.代码实现
创建对应对象,将此脚本挂在背景图对象上即可
using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Rotate2D : MonoBehaviour, IDragHandler, IEndDragHandler
{
[SerializeField]
Image img; //实例的图片对象 (可以理解为预制体)
float space = 300; //间隔
int n = 5; //5个图片
float r = 0; //半径
float rad = 0; //弧度
float max = 1f; //图片最大尺寸
float min = 0.3f; //图片最小尺寸
float moveRad = 0; //偏移量
float speed = 300; //速度
bool canDrag = true; //可以拖拽
List<Transform> imgs = new List<Transform>(); //存放所有图片
List<Transform> sorts = new List<Transform>(); //用于排序
public Button left_btn, right_btn;
// Start is called before the first frame update
void Start()
{
// 圆的周长公式: C=2πr r=C/(2*π)
r = (img.rectTransform.sizeDelta.x + space) * n / (2 * Mathf.PI); //求圆的半径
rad = 2 * Mathf.PI / n; //求弧度
Move();
//按钮事件
left_btn.onClick.AddListener(() =>
{
if (canDrag)
{
canDrag = false;
DOTween.To((x) =>
{
moveRad = x;
Move();
}, moveRad, moveRad + rad, 1).OnComplete(() => //加上一个弧度即可
{
canDrag = true;
});
}
});
right_btn.onClick.AddListener(() =>
{
if (canDrag)
{
canDrag = false;
DOTween.To((x) =>
{
moveRad = x;
Move();
}, moveRad, moveRad - rad, 1).OnComplete(() => //减上一个弧度即可
{
canDrag = true;
});
}
});
}
private void Move()
{
//生成图片
for (int i = 0; i < n; i++)
{
float x = Mathf.Sin(i * rad + moveRad) * r;
float y = Mathf.Cos(i * rad + moveRad) * r;
if (i >= imgs.Count)
{
GameObject go = Instantiate(img.gameObject, transform);
go.transform.localScale = Vector3.one;
go.GetComponent<Image>().sprite = Resources.Load<Sprite>("Image/card_1_" + (i + 1));
go.name = i.ToString();
imgs.Add(go.transform);
sorts.Add(go.transform);
}
imgs[i].transform.localPosition = new Vector3(x, 0, 0); // 注意y为0 y不为0就不在同一水平线上
// 设置尺寸 近大远小效果
float scale = Mathf.Lerp(min, max, (r + y) / (r * 2));
imgs[i].transform.localScale = Vector3.one * scale;
}
img.gameObject.SetActive(false); //失活实例对象
// 排序
sorts.Sort((a, b) =>
{
return (int)(a.localScale.z * 100 - b.localScale.z * 100);
});
// 更改 每个图片 在该层级视图中的位置 ( 最前面 (尺寸最大) 的就是 最后一个 子对象 )
//for (int i = 0; i < n; i++)
//{
// sorts[i].transform.SetSiblingIndex(i);
//}
}
public void OnDrag(PointerEventData eventData)
{
if (canDrag)
{
moveRad += eventData.delta.x / r;
Move();
}
}
public void OnEndDrag(PointerEventData eventData)
{
if (canDrag)
{
canDrag = false;
float off = Mathf.Abs(moveRad) % rad;
float needMove = 0;
if (off >= rad / 2)
{
needMove = rad - off;
}
else
{
needMove = -off;
}
if (moveRad < 0)
{
needMove = -needMove;
}
float t = Mathf.Abs(needMove * r / speed);
DOTween.To((x) =>
{
moveRad = x;
Move();
}, moveRad, moveRad + needMove, t).OnComplete(() =>
{
canDrag = true;
});
}
}
}
付出才有回报,祝愿大家都越来越优秀!
小菜不易,感谢观看,学到了就留下个支持的赞吧!
关注我,了解更多Unity相关知识哦!