Unity实现轮转图(Image)左右按钮控制轮转图轮转

实现图片的一个轮转效果,可左右拖拽面板进行轮转,也可点击左右按钮进行轮转

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相关知识哦!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不食卷心菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值