Unity中的UI轮播(Ugui)

效果图:类似于这样的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;
    }
}
至于在canvas中拖拽物体,按照上面源码的顺序去拖就行了,还有每个父物体的缩放比例由父物体决定,image/button的缩放都为1。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值