当前位置: 首页 > news >正文

⭐ Unity 横向滑动列表 首尾相连 轮转图

效果如下:

场景挂载:

代码部分:

using DG.Tweening;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing.Printing;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class Create2dLzt : MonoBehaviour, IDragHandler, IEndDragHandler
{
    public Image prefab;
    float r;
    float c;
    float ang;
    float space = 400;//间距
    float n = 7;

    public List<Image> Images = new List<Image>();
    public List<Transform> lists = new List<Transform>();

    float moveAng = 0;

    /// <summary>
    /// 缩放最大小值
    /// </summary>
    float max = 3;
    float min = 1f;


    // Start is called before the first frame update
    void Start()
    {
        c = (space + prefab.rectTransform.rect.width) * n;
        r = c / (2 * Mathf.PI);
        ang = (2 * Mathf.PI) / n;

        Move();
    }

    private void Move()
    {
        for (int i = 0; i < n; i++)
        {
            if (Images.Count <= i)
            {
                Images.Add(Instantiate(prefab, transform));
                Images[i].sprite = Resources.Load<Sprite>("Img_" + i);
                lists.Add(Images[i].transform);
                Images[i].name = "Img_" + i;
            }
            float x = Mathf.Sin(ang * i + moveAng) * r;
            float z = Mathf.Cos(ang * i + moveAng) * r;
            float p = (r + z) / (2 * r);
            float scale = (max - min) * p + min;
            Images[i].transform.localScale = Vector3.one * scale;
            Images[i].rectTransform.anchoredPosition = new Vector2(x, 0);
        }

        lists.Sort((a, b) =>
        {
            if (a.localScale.x < b.localScale.x)
            {
                return -1;
            }
            else if (a.localScale.x == b.localScale.x)
            {
                return 0;
            }
            else
            {
                return 1;
            }

        });

        for (int i = 0; i < lists.Count; i++)
        {
            lists[i].SetSiblingIndex(i);
        }
    }

    public void OnDrag(PointerEventData eventData)
    {
        float dis = eventData.delta.x;
        float ang = dis / r;
        moveAng += ang;
        Move();
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        float dis = eventData.delta.x;
        float time = Mathf.Abs(dis) / 100;
        DOTween.To((a) =>
        {
            float ang = a / r;
            moveAng += ang;
            Move();
        }, dis, 0, time).OnComplete(() =>
        {
            Align();
        });
    }

    private void Align()
    {
        float ang = Mathf.Asin(lists[lists.Count - 1].localPosition.x / r);
        float dis = ang * r;
        float time = Mathf.Abs(dis) / 100;
        DOTween.To((a) =>
        {
            moveAng = a;
            Move();
        }, moveAng, moveAng - ang, time);
    }
}

相关文章:

  • 在Linux上安装和使用Docker
  • 嵌入式linux利用标准字符驱动模型控制多个设备方法
  • STM32 USB 设备的描述信息作用
  • 【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析⑰】
  • git,gitea - tool - creat Gitea Empty Rep Dir
  • 【异常错误】pycharm debug view变量的时候显示不全,中间会以...显示
  • nginx负载均衡, 解决iphash不均衡的问题之consistent
  • 【时时三省】(C语言基础)用N-S流程图表示算法
  • ok113i平台——多媒体播放器适配
  • “让App玩捉迷藏:Android教育平板的‘隐身术’开发实录”
  • 尚硅谷爬虫note009
  • 第一章:前端性能的定义与指标
  • DeepSeek联网搜索
  • Docker:3、在VSCode上安装并运行python程序或JavaScript程序
  • windows系统本地部署DeepSeek-R1全流程指南:Ollama+Docker+OpenWebUI
  • GitLab 概念
  • Python自动化测试
  • 【分布式理论12】事务协调者高可用:分布式选举算法
  • 详解Virtualhome环境搭建教程 | 智能体
  • ES12的逻辑操作符 ,数字分隔符,字符串的replaceAll,FinalizationRegistry的用法以及使用场景
  • 崔登荣任国家游泳队总教练
  • 美政府以拨款为要挟胁迫各州服从移民政策,20个州联合起诉
  • 加拿大总理宣布新内阁名单
  • 上海北外滩开发建设五周年交出亮眼答卷,未来五年有何新目标?
  • 新闻1+1丨婚姻登记服务,如何跑出幸福加速度?
  • 海北州委常委、常务副州长桑本履新青海省供销社理事会主任