轮转图--DoTween

首先用引入一个DoTween 

看看代码就可以了原理很简单 

PI=圆周率         R=半径

周长=2*PI *R       R= 周长/2*PI      弧度=2*PI       弧度= 周长/半径        周长=半径乘以弧度 

基本原理   

2D轮转图排序 和3D轮转图排序区别

2D 排序是缩放x 值  (大小)  3D排序的是z (远近) 

  计算缩放比值,例如:半径是1,最近是-1最远是1,所以要算直径的比值,将最近和最远都+1,得出0到2的值,用它与直径2作比较


    public int num;
    public float ang;
    public float r;
    float dis;
    public GameObject[] go;
    List<GameObject> obj = new List<GameObject>();
    List<Transform> sortobj = new List<Transform>();
 
    void Start()
    {

        ang = (Mathf.PI * 2) / num;

        OnMove();
    }
    void OnMove()
    {
        float moveang = dis / r;
        for (int i = 0; i < num; i++)
        {
            float x = Mathf.Sin(ang * i + moveang) * r;
            float y = Mathf.Cos(ang * i + moveang) * r;
            if (obj.Count <= i)
            {
                obj.Add(Instantiate(go[i].gameObject));
                sortobj.Add(obj[i].transform);
           
            }

            obj[i].transform.position = new Vector3(x, 0, y);



        }

        sortobj.Sort((a, b) =>
        {
            if (a.position.z < b.position.z)
            {
                return -1;
            }
            else if (a.position.z == b.position.z)
            {
                return 0;
            }
            else
            {
                return 1;
            }


        });
    }


    public void OnDrag(PointerEventData eventData)
    {
        dis -= eventData.delta.x / transform.GetComponent<RectTransform>().rect.width;
        OnMove();
    }

    public void OnEndDrag(PointerEventData eventData)
    {

        float start = eventData.delta.x / transform.GetComponent<RectTransform>().rect.width;
        float end = 0;
        float time = Mathf.Abs(start);

        DT.To((a) => {

            dis -= a;
            OnMove();

        }, start, end, time).OnComplete(() => {

            Alginling(obj.IndexOf(sortobj[0].gameObject));
        });
    }


    void Alginling(int n)
    {
        print("执行了对齐函数");
        int i = obj.IndexOf(sortobj[0].gameObject);

        int s = i - n;

        int s2 = num - Mathf.Abs(s);
        s2 = s > 0 ? -s2 : s2;
        int s3 = Mathf.Abs(s) < Mathf.Abs(s2) ? s : s2;
        float moveang = Mathf.Asin(sortobj[0].transform.position.x / r) + s3 * ang;

        float movedis = moveang * r;
        float time = Mathf.Abs(moveang);
        DT.To((a) =>
        {
            dis = a;
            OnMove();

        }, dis, dis + movedis, time).OnComplete(() => {

            print(   sortobj[num-1].transform.name);
        });

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值