Unity实现UI图片面板滚动播放效果第二弹

效果:

场景结构:

特殊物体:panel下面用排列组件horizent layout group放置多个需要显示的面板,用mask遮罩好。

主要思路:

这次是要在最后一个toggle的地方,依然向左滚动回1,这是难点。因此实际上在4后面,还增加了一个1面板的副本,等滑动到4后面的1后,直接重设整个panel的recttransform,狸猫换太子,视觉欺骗。

代码:

cs 复制代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class RollControlPanel : MonoBehaviour
{
    private RectTransform rollPanel;
    private Vector2 startPos;

    private ToggleGroup toggleGroup;

    private Toggle[] toggles;

    private int preToggleIndex = 0;
    private int curToggleIndex = 0;

    private int toggleCount;

    public float moveValue = 756;
    private Tween slideTween;
    private List<Vector2> panelPos = new List<Vector2>();
    
    // Start is called before the first frame update
    void Start()
    {
        rollPanel = transform.Find("Mask/RollPanel").GetComponent<RectTransform>();
        toggleGroup = transform.Find("TogglePanel/ToggleGroup").GetComponent<ToggleGroup>();
        toggles = transform.GetComponentsInChildren<Toggle>();

        startPos = rollPanel.anchoredPosition;
        panelPos.Add(startPos);

        int panelCount = rollPanel.childCount;
        for (int i = 1; i < panelCount; i++)
        {
            Vector2 tmp = new Vector2(startPos.x - i * moveValue, startPos.y);
            panelPos.Add(tmp);
        }
        
        toggleCount = toggles.Length;
        for (int i = 0; i < toggleCount; i++)
        {
            Toggle toggle = toggles[i];
            toggles[i].onValueChanged.AddListener((arg0 =>
            {
                OnToggleOpen(toggle);
            }));
        }

        IEnumerator enumerator = MovePanel();
        Coroutine setTogglesetToggle= StartCoroutine(enumerator);
    }
    
    /// <summary>
    /// 只关注循环播放
    /// </summary>
    /// <returns></returns>
    IEnumerator MovePanel()
    {
        while (true)
        {
            yield return new WaitForSeconds(2f);
            if (curToggleIndex==toggleCount-1)
            {
                //挪到最后一个(也就是第一个的副本),偷偷重置位置
                slideTween = rollPanel.DOAnchorPosX(panelPos[panelPos.Count - 1].x, 0.5f).OnComplete((() =>
                {
                    rollPanel.anchoredPosition = startPos;
                }));
                
                for (int i = 0; i < toggleCount; i++)
                {
                    toggles[i].onValueChanged.RemoveAllListeners();
                }
                toggles[0].isOn = true;
                for (int i = 0; i < toggleCount; i++)
                {
                    Toggle toggle = toggles[i];
                    toggles[i].onValueChanged.AddListener((arg0 =>
                    {
                        OnToggleOpen(toggle);
                    }));
                }

                preToggleIndex = curToggleIndex;
                curToggleIndex = 0;
                
            }
            else
            {
                //正常相对于当前位置移动
                curToggleIndex++;
                slideTween = rollPanel.DOAnchorPosX(panelPos[curToggleIndex].x, 0.5f);
                
                for (int i = 0; i < toggleCount; i++)
                {
                    toggles[i].onValueChanged.RemoveAllListeners();
                }
                toggles[curToggleIndex].isOn = true;
                for (int i = 0; i < toggleCount; i++)
                {
                    Toggle toggle = toggles[i];
                    toggles[i].onValueChanged.AddListener((arg0 =>
                    {
                        OnToggleOpen(toggle);
                    }));
                }
                
                preToggleIndex = curToggleIndex;
            }
        }
    }

    // private void Update()
    // {
    //     if (Input.GetKeyDown(KeyCode.K))
    //     {
    //         StopAllCoroutines();
    //         slideTween.Kill();
    //         rollPanel.anchoredPosition = startPos;
    //     }
    // }

    void OnToggleOpen(Toggle toggle)
    {
        StopAllCoroutines();
        slideTween.Kill();

        if (toggle.isOn)
        {
            for (int i = 0; i < toggleCount; i++)
            {
                if (toggle == toggles[i])
                {
                    curToggleIndex = i;
                    break;
                }
            }
            
            //直接切换rect位置
            rollPanel.anchoredPosition = panelPos[curToggleIndex];
            
            IEnumerator enumerator = MovePanel();
            Coroutine setTogglesetToggle= StartCoroutine(enumerator);


        }
    }
}
相关推荐
大蓝头5 天前
安装包UI美化之路-nsNiuniuSkin全新UI调试与预览方法
ui·electron·安装包·截图控件·截屏控件
慧都小项5 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
魔士于安5 天前
unity 丑陋哥布林 哥布林有humannoid 动画没 带动画
unity·游戏引擎·材质·贴图·模型
小贺儿开发6 天前
Unity 家居视频遥控(细节优化)
科技·unity·程序员·udp·视频·工具·通信
淡海水6 天前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
兰亭妙微UI设计公司6 天前
兰亭妙微UI设计公司分享:EQUA 智能健康生态系统 UI/UX 设计深度解析
ui·交互
Cx330❀6 天前
Qt 常用控件属性与底层机制详解:从窗口半透明、浮点数陷阱到 QSS 与焦点策略
qt·ui·图形渲染
小小数媒成员6 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
Cx330❀6 天前
Qt 常用 UI 控件详解:从QPushButton到QLabel 核心用法解析
qt·ui·图形渲染
传奇开心果编程7 天前
【ArkUI 练中学】第15课:UI 界面设计与实战
学习·ui·华为·harmonyos