首页 > 编程语言 >C#2D轮转图

C#2D轮转图

时间:2023-02-25 08:44:05浏览次数:38  
标签:轮转 C# float list Mathf 2D int using public

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;

public class RotationChart2D : MonoBehaviour,IDragHandler,IEndDragHandler
{
    public Image prefab;//预制体
    public float max = 1;//缩放最大值
    public float min = 0.5f;//缩放最小值
    public int n = 10;//个数
    public float spacing = 100;//UI间距的单位是像素
    public float cut = 10;//减速度
    float c;//周长
    float r;//半径
    float ang;//弧度
    List<Image> list = new List<Image>();
    List<Transform> sortlist = new List<Transform>();
    float moveAng = 0;//拖动的弧度
    // Start is called before the first frame update
    void Start()
    {
        c = (prefab.rectTransform.rect.width + spacing) * n;
        r = c / (2 * Mathf.PI);
        ang = 2 * Mathf.PI / n;

        Move();
    }

    public void Move()
    {
        for (int i = 0; i < n; i++)
        {
            if (list.Count <= i)
            {
                list.Add(Instantiate(prefab, transform));
                list[i].transform.GetComponent<Image>().sprite = Resources.Load<Sprite>("Image/image_" + i);
                sortlist.Add(list[i].transform);
            }
            float x = Mathf.Sin(i * ang + moveAng) * r;
            float z = Mathf.Cos(i * ang + moveAng) * r;

            float p = (z + r) / (2 * r);

            float scale = (max - min) * p + min;

            list[i].rectTransform.anchoredPosition = new Vector2(x, 0);
            list[i].transform.localScale = Vector3.one * scale;
        }
        sortlist.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 < sortlist.Count; i++)
        {
            sortlist[i].SetSiblingIndex(i);
        }

    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void OnDrag(PointerEventData eventData)
    {
        float dis = eventData.delta.x;

        float dragAng = dis / r;

        moveAng += dragAng;

        Move();
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        float speed = eventData.delta.x;
        float time = Mathf.Abs(speed) / cut;
        DOTween.To((a) =>
        {
            //通过距离计算弧度
            float dragAng = a / r;
            moveAng += dragAng;
            Move();
        },speed,0,time).OnComplete(()=> 
        {
            Align(list.IndexOf(sortlist[n - 1].GetComponent<Image>()));
        });
    }
    public void Align(int id)
    {
        //当前下标
        int index = list.IndexOf(sortlist[n - 1].GetComponent<Image>());
        //指定下标与当前下标的间隔
        int sp = id - index;
        //计算另一个旋转方向需要的间隔
        int sp0 = n - Mathf.Abs(sp);
        //一个方向是顺时针另一个一定是逆时针 所以一个是正另一个一定是负
        sp0 = sp > 0 ? -sp0 : sp0;
        //选择两个方向中间隔娇小的一方旋转
        int end = Mathf.Abs(sp) < Mathf.Abs(sp0) ? sp : sp0;
        //计算间隔的弧度
        float spAng = end * ang;
        //需要旋转的弧度 = 中间偏差的弧度 + 间隔的弧度
        float AlignAng = Mathf.Asin(sortlist[n - 1].GetComponent<RectTransform>().anchoredPosition.x / r) + spAng;
        //通过需要旋转的弧度计算需要旋转的距离
        float Aligndis = AlignAng * r;
        //通过需要旋转的距离计算旋转的时间
        float time = Mathf.Abs(Aligndis) / cut;
        DOTween.To((a) =>
        {
            moveAng = a;
            Move();
        },moveAng,moveAng - AlignAng,time);
    }
}

 

标签:轮转,C#,float,list,Mathf,2D,int,using,public
From: https://www.cnblogs.com/bazi/p/17153732.html

相关文章

  • P8738 [蓝桥杯 2020 国 C] 天干地支
    题目传送门题目大意给定一个公元纪年的年份\(n\),请输出这一年的天干地支年份。解题思路将天干和地支分别存到\(a,b\)数组里;因为天干是\(10\)年一轮回,地支是\(12......
  • c语言:辗转相除求最大公约数 函数
    #include<stdio.h>//求最大公约数:辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。//319377:319%377=319377%319=58319%58=2958%29=0......
  • C语言:更损相减法求最大公约数 函数应用
    #include<stdio.h>//<<九章算术>>更相减损法:可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。//以等数约之。///第......
  • WebAssembly+gRPC web=未来?
    WebAssembly+gRPCweb=未来?WebAssembly是什么WebAssembly是一个可以使C#,Java,Golang等静态强类型编程语言,运行在浏览器中的标准,浏览器厂商基于此标准实现执行引擎。 ......
  • [LeetCode] 1247. Minimum Swaps to Make Strings Equal
    Youaregiventwostrings s1 and s2 ofequallengthconsistingofletters "x" and "y" only.Yourtaskistomakethesetwostringsequaltoeachother.......
  • error:0308010C:digital envelope routines::unsupported
    Node.jsv18.14.1运行项目node:internal/crypto/hash:71this[kHandle]=new_Hash(algorithm,xofLen);^Error:error:0308010C:digitalenve......
  • Docker配置https证书案例
    目录一.安装harbor1.安装docker2.安装dockercompose3.解压harbor软件包二.配置harbor服务器配置https证书1.修改harbor配置文件2.使得配置生效3.测试服务三.配置harbor服......
  • 【講座】正確認識 ChatGPT
    澄清误解没有事先固定选项,不是“罐头回答”运行时没有“联网”,不是“网络搜索”ChatGPT这个语言模型,真正在做的事情是【文字接龙】。训练策略自监督学习:爬大量网路......
  • 利用Github Action自动化部署SpringBoot项目
    环境准备一台拥有公共IP的1核1G以上配置的Linux云服务器。笔者选用的Linux发行版为CentOSLinuxrelease7.0.1406(Core)已安装好JDK8与Maven。若是还未安装,可以参考以......
  • 因外部依赖包内方法签名修改而导致线上NoSuchMethodError异常
    NoSuchMethodError异常问题描述修复大数据组件包包中的漏洞,将hive-common3.1.2版本升级到3.1.3,导致在连接hive表,查询schema时出现NosuchMethodError异常。报错堆栈信息......