首先用引入一个DoTween
看看代码就可以了原理很简单
PI=圆周率 R=半径
周长=2*PI *R R= 周长/2*PI 弧度=2*PI 弧度= 周长/半径 周长=半径乘以弧度
基本原理
2D轮转图排序 和3D轮转图排序区别
2D 排序是缩放x 值 (大小) 3D排序的是z (远近)
计算缩放比值,例如:半径是1,最近是-1最远是1,所以要算直径的比值,将最近和最远都+1,得出0到2的值,用它与直径2作比较
public int num;
public float ang;
public float r;
float dis;
public GameObject[] go;
List<GameObject> obj = new List<GameObject>();
List<Transform> sortobj = new List<Transform>();
void Start()
{
ang = (Mathf.PI * 2) / num;
OnMove();
}
void OnMove()
{
float moveang = dis / r;
for (int i = 0; i < num; i++)
{
float x = Mathf.Sin(ang * i + moveang) * r;
float y = Mathf.Cos(ang * i + moveang) * r;
if (obj.Count <= i)
{
obj.Add(Instantiate(go[i].gameObject));
sortobj.Add(obj[i].transform);
}
obj[i].transform.position = new Vector3(x, 0, y);
}
sortobj.Sort((a, b) =>
{
if (a.position.z < b.position.z)
{
return -1;
}
else if (a.position.z == b.position.z)
{
return 0;
}
else
{
return 1;
}
});
}
public void OnDrag(PointerEventData eventData)
{
dis -= eventData.delta.x / transform.GetComponent<RectTransform>().rect.width;
OnMove();
}
public void OnEndDrag(PointerEventData eventData)
{
float start = eventData.delta.x / transform.GetComponent<RectTransform>().rect.width;
float end = 0;
float time = Mathf.Abs(start);
DT.To((a) => {
dis -= a;
OnMove();
}, start, end, time).OnComplete(() => {
Alginling(obj.IndexOf(sortobj[0].gameObject));
});
}
void Alginling(int n)
{
print("执行了对齐函数");
int i = obj.IndexOf(sortobj[0].gameObject);
int s = i - n;
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(sortobj[0].transform.position.x / r) + s3 * ang;
float movedis = moveang * r;
float time = Mathf.Abs(moveang);
DT.To((a) =>
{
dis = a;
OnMove();
}, dis, dis + movedis, time).OnComplete(() => {
print( sortobj[num-1].transform.name);
});
}