1.创建一个父物体,生成一个image的预制体
代码如下:
首先计算出圆的周长,半径,弧度
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;
public class Set2dRotation : MonoBehaviour,IDragHandler,IEndDragHandler
{
public Image prefeb;
public int num = 14;
public float space = 10;
public float max = 1;
public float min = 0.5f;
float l, r, ang;
public float dec = 10;
float allang = 0;
public List<GameObject> list = new List<GameObject>();
public List<Transform> trans = new List<Transform>();
// Start is called before the first frame update
void Start()
{
l = num * (prefeb.rectTransform.sizeDelta.x +space);
r=l/(2*Mathf.PI);
ang=2*Mathf.PI/num;
Move();
}
public void Move()
{
for(int i = 0; i < num; i++)
{
if(list.Count<=i)
{
list.Add(Instantiate(prefeb.gameObject, transform));
trans.Add(list[i].transform);
}
float x = Mathf.Sin(i * ang + allang) * r;
float z = Mathf.Cos(i * ang + allang) * r;
float p = (z + r) / (r + r);
float scale = max * (1 - p) + min * p;
list[i].transform.localPosition = new Vector3(x, 0, 0);
list[i].transform.localScale = Vector3.one * scale;
}
trans.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 < trans.Count; i++)
{
trans[i].SetSiblingIndex(i);
}
}
物体添加到集合中,根据物体的大小进行排序
public void OnDrag(PointerEventData eventData)
{
allang -= eventData.delta.x / r;
Move();
}
public void OnEndDrag(PointerEventData eventData)
{
float dis = eventData.delta.x;
float time=Mathf.Abs(dis / dec);
DOTween.To((a) =>
{
allang -= a / r;
Move();
}, dis, 0, time).OnComplete(() =>
{
float moveang = Mathf.Asin(trans[num - 1].localPosition.x / r);
float moveanging = Mathf.Abs(moveang * r / dec);
DOTween.To((b) =>
{
allang = b;
Move();
},allang,allang+moveang,moveanging);
});
}
由于是ui物体,所以直接使用拖拽接口,运用dotween插件实现惯性缓动效果并且实现对齐效果
效果如下: