Unity 不使用ScrollView实现有限物体的无限循环

话不多说,先献上效果图:
6个物体无限循环:
在这里插入图片描述

3个物体无限循环:
在这里插入图片描述

实现的原理:
其实从上面的3个循环的动画可以看出实现原理了。
在这里插入图片描述

1.首先创建对应的item循环节点,放在一个父物体下面统一管理。
2.父物体添加EventTrigger组件,用于取代scroll view监听拖拽事件。
3.在脚本里面通过遍历所有item,使用dotween对item进行位移,同时重新设置子item的层级
核心脚本

//改变位置 层级
    private void __changePos(int moveIndex)
    {
        for (int i = 1; i <= btnList.Count; i++)
        {
            var sequence = DOTween.Sequence();
            if (moveIndex > 0)
            {
                int v = moveIndex - 1;//除去自身
                float moveTime = aniTime / moveIndex;//计算动画时间
                for (int k = v; k >= 0; k--)//遍历所有步骤
                {
                    int temp = i - k;
                    if (temp < 1)
                    {
                        temp += btnList.Count;
                    }
                    sequence.Append(btnList[i - 1].DOMove(prevBtnPos[temp - 1], moveTime).SetEase(Ease.Linear));
                    sequence.Join(btnList[i - 1].DOScale(
                        new Vector3(scaleList[temp - 1], scaleList[temp - 1], scaleList[temp - 1]), 
                        moveTime).SetEase(Ease.Linear));
                }
            }
            else
            {
                int v = Mathf.Abs(moveIndex) - 1;
                float moveTime = aniTime / Mathf.Abs(moveIndex);//计算动画时间
                for (int k = v; k >= 0; k--)//遍历所有步骤
                {
                    int temp = i + k;
                    if (temp > btnList.Count)
                    {
                        temp -= btnList.Count;
                    }
                    sequence.Append(btnList[i - 1].DOMove(prevBtnPos[temp - 1], moveTime).SetEase(Ease.Linear));
                    Debug.Log("移:" + temp);
                    Debug.Log("移:" + scaleList[temp - 1]);
                    sequence.Join(btnList[i - 1].DOScale(
                        new Vector3(scaleList[temp - 1], scaleList[temp - 1], scaleList[temp - 1]), 
                        moveTime).SetEase(Ease.Linear));
                }
            }
            btnList[i - 1].transform.SetAsFirstSibling();//层级
            sequence.AppendCallback(() => {
                if (isClick)
                { }
                isClick = false;
            });
        }
        parent.transform.GetChild(0).SetSiblingIndex(campCount - 2);//左1
    }

也可以通过点击item进行跳转

 //直接点击item进行跳转
    private void ClickCamp(Transform btn)
    {
        int moveIndex = 0;
        for (int i = 1; i <= btnList.Count; i++)
        {
            if (btnList[i - 1] == btn)
            {
                int val = i - 1;
                if (val < Mathf.Ceil(campCount / 2))
                {
                    moveIndex = -val;
                }
                else
                {
                    moveIndex = campCount - val;
                }
                ChangeList(moveIndex);
                return;
            }
        }
    }

也支持自己设置循环item的数量

//设置Item数量
//@param number 数量
public void SetCampCount(int number)
    {
        campCount = number;
        int halfNum = number / 2;
        //
        for (int i = 1; i <= halfNum - 1; i++)
        {
            scaleList.Add(1 - 0.3f * i);
        }
        if (!IsOuNumber(number))
        {
            scaleList.Add(1 - 0.3f * (scaleList.Count - 1));
        }
        int _num = halfNum;
        for (int i = 1; i <= halfNum; i++)
        {
            scaleList.Add(1 - 0.3f * _num);
            _num--;
        }

        for (int i = 1; i <= number; i++)
        {
            btnList.Add(parent.transform.Find("Image" + i).transform);
            prevBtnPos.Add(btnList[i - 1].position);
        }
    }

资源是付费资源,不够一杯奶茶钱。学生可加我QQ,免费送你学习!
项目资源地址:https://download.csdn.net/download/lq1340817945/77115834

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lq1340817945

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

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

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

打赏作者

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

抵扣说明:

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

余额充值