此方法只需要一个空节点 脚本挂上即可
DOTWeen可以去官网下载 不用的只能拖动 没有结尾的惯性效果和对齐
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/// <summary>
/// 轮转图
/// </summary>
public class RationChart : MonoBehaviour, IDragHandler, IEndDragHandler
{
int num = 4;
public Image prefab;
float spacing=100;
float custSpeed=100;
float max = 1;
float min = 0.05f;
float c;
float r;
float ang;
float distance;
List<GameObject> list = new List<GameObject>();
List<Transform> sorts = new List<Transform>();
/// <summary>
/// 换装的脚本
/// </summary>
public Loading loading;
/// <summary>
/// 类型
/// </summary>
public static int chartindex=-1;
// Start is called before the first frame update
void Start()
{
c = (spacing + prefab.rectTransform.rect.width) * num;
r = c / (Mathf.PI * 2);
ang = (Mathf.PI * 2) / num;
Move();
}
protected void Move()
{
float moveAng = distance / r;
for (int i = 0; i < num; i++)
{
if (list.Count <= i)
{
GameObject go = Instantiate(Resources.Load<GameObject>("Image"),transform);
go.name = i.ToString();
list.Add(go);
sorts.Add(go.transform);
go.GetComponent<Image>().sprite = Resources.Load<Sprite>(i.ToString());
}
float x = Mathf.Sin(i * ang + moveAng) * r;
float z = Mathf.Cos(i * ang + moveAng) * r;
list[i].transform.localPosition = Vector3.right * x;
float y = (z + r) / (r + r);
float scale = (max - min) * y + min;
list[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++)
{
sorts[i].SetSiblingIndex(i);
}
}
/// <summary>
/// 拖拽中
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
{
distance += eventData.delta.x;
Move();
}
/// <summary>
/// 拖拽结束
/// </summary>
public void OnEndDrag(PointerEventData eventData)
{
float speed = eventData.delta.x;
float time = Mathf.Abs(speed) / custSpeed;
DOTween.To((a) =>
{
distance += a;
Move();
}, speed, 0, time).OnComplete(() =>
{
Align(list.IndexOf(sorts[num - 1].gameObject));
});
}
private void Align(int v)
{
int n = v;
loading.ChangeLoading(chartindex,n);
float aliAng = Mathf.Asin(list[n].transform.localPosition.x/r);
float aliDis=aliAng*r;
float time = Mathf.Abs(aliDis) / custSpeed;
DOTween.To((a) =>
{
distance = a;
Move();
}, distance, distance - aliDis, time).OnComplete(() =>
{
transform.GetChild(0).gameObject.SetActive(true);
});
}
}
最后 Inspector改变参数 值不是固定的