效果图:类似于这样的ui图点击去旋转 ,文章末尾附有源码
一、原理
每一个独立ui由一个空物体确定位置,image/button确定ui标识,在需要ui旋转过程中保证空物体不变,改变image/button父物体后归0即可实现,对于要去哪一个父物体,这里我分为了两部分,分别实现向左旋转以及向右旋转,具体思路在关键代码部分说明。本篇内容使用DoTween实现,不知道的可以参考我上一篇文章。
二、关键代码
int currentindex = Array.IndexOf(btns_Parent, btns[index].transform.parent.gameObject);//这列确定每个button位于整个ui空物体父物体数组的哪一个
if (currentindex <= btns_Parent.Length / 2)/判断需要向左旋转还是向右旋转
{
for (int j = 0; j < btns.Length; j++)
{
int x = Array.IndexOf(btns_Parent, btns[j].transform.parent.gameObject);
x = x - 1;
if (x < 0)
x = btns.Length - 1;
btns[j].transform.SetParent(btns_Parent[x].transform);//按钮父物体设置为下一个物体
btns[j].transform.DOLocalMove(Vector3.zero, uimovetime);//把按钮归0,代表移动到下一个父物体
btns[j].transform.DOScale(Vector3.one, uimovetime).OnComplete(() =>//缩放归1
{
OnBtnActive(true);
});
}
}
三、源码
public GameObject Middle;
public GameObject Middle_Back;
public GameObject Left01;
public GameObject Left01_Back;
public GameObject Right01;
public GameObject Right01_Back;
public GameObject Left02;
public GameObject Left02_Back;
public GameObject Right02;
public GameObject Right02_Back;
public GameObject Left03;
public GameObject Left03_Back;
public GameObject Right03;
public GameObject Right03_Back;
private float uimovetime = 0.5f;
public Button[] btns;
public GameObject[] btns_Parent;
public void Start()
{
btns_Parent = new GameObject[] { Middle, Left01, Left02, Left03, Left03_Back, Left01_Back, Left02_Back, Middle_Back, Right02_Back, Right01_Back, Right03_Back, Right03, Right02, Right01 };
for (int i = 0; i < btns.Length; i++)
{
int index = i;
btns[index].onClick.AddListener(() =>
{
PositionChange(index);
});
}
}
void PositionChange(int index)
{
if (btns[index].transform.parent.name != "Middle")
{
OnBtnActive(false);
int currentindex = Array.IndexOf(btns_Parent, btns[index].transform.parent.gameObject);
if (currentindex <= btns_Parent.Length / 2)
{
for (int j = 0; j < btns.Length; j++)
{
int x = Array.IndexOf(btns_Parent, btns[j].transform.parent.gameObject);
x = x - 1;
if (x < 0)
x = btns.Length - 1;
btns[j].transform.SetParent(btns_Parent[x].transform);//按钮父物体设置为下一个物体
btns[j].transform.DOLocalMove(Vector3.zero, uimovetime);//把按钮归0,代表移动到下一个父物体
btns[j].transform.DOScale(Vector3.one, uimovetime).OnComplete(() =>//缩放归1
{
OnBtnActive(true);
});
}
}
if (currentindex > btns_Parent.Length / 2)
{
for (int j = 0; j < btns.Length; j++)
{
int x = Array.IndexOf(btns_Parent, btns[j].transform.parent.gameObject);
x = x + 1;
if (x > btns.Length - 1)
x = 0;
btns[j].transform.SetParent(btns_Parent[x].transform);
btns[j].transform.DOLocalMove(Vector3.zero, uimovetime);
btns[j].transform.DOScale(Vector3.one, uimovetime).OnComplete(() =>
{
OnBtnActive(true);
});
}
}
}
}
void OnBtnActive(bool isActive)
{
foreach (var item in btns)
{
item.enabled = isActive;
}
}