2D轮转图
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
public class LZT : MonoBehaviour,IDragHandler,IEndDragHandler
{
    public Image playeriamge;
    public Image prefab;
    public int num;
    public float spacing;
    public float distance;
    public float max = 1;
    public float min = 0.5f;
    public CombinePlayer player;
    float r;
    float l;
    float ang;
    float speed = 10;
    List<GameObject> objs = new List<GameObject>();
    List<Transform> sorts = new List<Transform>();
    // Start is called before the first frame update
    void Start()
    {
        sorts.Add(playeriamge.transform);
        l = (prefab.rectTransform.rect.width + spacing) * num;
        r = l / (Mathf.PI * 2);
        ang = Mathf.PI * 2 / num;
        Move();
    }
    public void Move()
    {
        float moveang = distance / r;
        for (int i = 0; i < num; i++)
        {
            float x = Mathf.Sin(i * ang + moveang) * r;
            float z = Mathf.Cos(i * ang + moveang) * r;
            if (i >= objs.Count)
            {
                GameObject o = Instantiate(prefab.gameObject, transform);
                o.GetComponent<Image>().sprite = Resources.Load<Sprite>("Image/image_" + i);
                o.AddComponent<Button>();
                o.name = i.ToString();
                objs.Add(o);
                sorts.Add(o.transform);
            }
            
            objs[i].transform.localPosition = new Vector3(x, 0, 0);
           
            float p = (r + z) / (r + r);
            float scale = p * (max - min) + min;
            objs[i].transform.localScale = Vector3.one * scale;
        }
        sorts.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 < sorts.Count; i++)
        {
           
            if (sorts[i].name=="Image")
            {
                sorts[i].SetSiblingIndex(sorts.Count - 2);
            }
            else
            {
                sorts[i].SetSiblingIndex(i);
            }
            
        }
    }
    public void OnDrag(PointerEventData eventData)
    {
        distance += eventData.delta.x;
        Move();
    }
    public void OnEndDrag(PointerEventData eventData)
    {
        float time = Mathf.Abs(eventData.delta.x) / speed;
        time = time > 2 ? 2 : time;
        DOTween.To((float a) =>
        {
            distance += a;
            Move();
        }, eventData.delta.x, 0, time).OnComplete(() => 
        {
            Anign(int.Parse(sorts[num - 1].name));
        });
    }
    public void Anign(int n)
    {
        int i = int.Parse(sorts[num - 1].name);
        int s = n - i;
        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(sorts[num - 1].localPosition.x / r)+s3*ang;
        float moveDis = moveAng * r;
        float moveTime = Mathf.Abs(moveDis)  / (speed*8);
        DOTween.To((float a) => { distance = a; Move(); }, distance, distance - moveDis, moveTime).OnComplete(() =>
        {
            //print(sorts[num - 1].name);
        });
    }
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号