想要实现2D轮转图的效果,需要在场景里面创建一个空对象,然后创建生成轮转图的脚本,
创建好脚本之后,我们需要先明确几个变量:
1.生成物体的数量
2,物体移动的弧度
3,生成物体范围的半径
4,图片的最大值 最小值
[SerializeField]
Image img;
int count = 12;
float rad;
float r;
float maxScale = 1f;
float minScale = 0.5f;
float moveRad;
float speed = 300;
int index;
List<GameObject> games = new List<GameObject>();
List<Transform> sort = new List<Transform>();
之后就开始计算弧度以及半径
void Start()
{
rad = 2 * Mathf.PI / count;
r = (img.rectTransform.sizeDelta.x + 100) * count / (2 * Mathf.PI);
Move();
}
然后开始执行方法 生成物体 按照物体的大小进行排序 设置image的层级
使用接口进行拖拽
void Move()
{
for (int i = 0; i < count; i++)
{
float x = Mathf.Sin(i * rad + Mathf.PI + moveRad) * r;
float y = Mathf.Cos(i * rad + Mathf.PI + moveRad) * r;
if (games.Count <= i)
{
GameObject go = Instantiate(img.gameObject);
go.transform.SetParent(transform, false);
go.name = i.ToString();
games.Add(go);
sort.Add(go.transform);
}
games[i].transform.localPosition = new Vector3(x, 0, 0);
float scale = Mathf.Lerp(minScale, maxScale, (-y + r) / (2 * r));
games[i].transform.localScale = new Vector3(scale, scale, scale);
}
sort.Sort((a, b) =>
{
float v = a.transform.localScale.x - b.transform.localScale.x;
if (v > 0)
{
return 1;
}
else
{
return -1;
}
});
for (int i = 0; i < sort.Count; i++)
{
sort[i].transform.SetSiblingIndex(i);
}
}
public void OnDrag(PointerEventData eventData)
{
moveRad -= eventData.delta.x / r * 0.5f;
Move();
}
public void OnEndDrag(PointerEventData eventData)
{
float radl = Mathf.Asin(sort[sort.Count - 1].localPosition.x / r);
float dis = radl * r;
float t = Mathf.Abs(dis / speed);
DT.To((a) =>
{
moveRad = a;
Move();
}, moveRad, moveRad + radl, t);
}