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);


        }
    }
}
相关推荐
熊猫悟道2 小时前
Unity shader 之,Shader内部时间离散处理
unity·游戏引擎·材质·着色器
PA_4 小时前
unity Component-Based Architecture游戏框架
游戏·unity·游戏引擎
yi碗汤园6 小时前
C#实现对UI元素的拖拽
开发语言·ui·unity·c#
jtymyxmz7 小时前
《Unity Shader》11.3.2 广告牌技术
unity·游戏引擎
jtymyxmz8 小时前
《Unity Shader》11.3.1 流动的河流
unity·游戏引擎
晚霞的不甘9 小时前
开源鸿蒙(OpenHarmony)实战入门:从 Hello World 到 UI 交互设计
ui·开源·harmonyos
小马过河R9 小时前
开发游戏需要哪些岗位和角色参与
游戏·游戏引擎·游戏程序
jtymyxmz12 小时前
《Unity Shader》11.3.1 续 流动的水流的阴影
unity·游戏引擎
世洋Blog12 小时前
Unity性能优化-2d游戏的DrawCall
游戏·unity·面试·性能优化·游戏引擎