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);
});
}
}

posted @ 2023-01-29 14:11  陈晨111  阅读(25)  评论(0)    收藏  举报