UGUI卡片左右切换效果

using DG.Tweening;
using System.Collections.Generic;
using UnityEngine;

public class ImageMove : MonoBehaviour
{
    
    
    //从左到右依次排列的物体
    public List<Transform> sortTransform = new List<Transform>();

    //上一个状态
    private List<Vector3> originalScales = new List<Vector3>();
    private List<Vector3> originalPositions = new List<Vector3>();
    private List<int> originalLay = new List<int>();

    private bool isMoving;

    private void Awake()
    {
    
    
        //初始化原来的尺寸和位置
        for (int i = 0; i < sortTransform.Count; i++)
        {
    
    
            originalPositions.Add(sortTransform[i].position);
            originalScales.Add(sortTransform[i].localScale);
        }
        //层级与位置顺序不同,需要单独记录
        for (int i = 0; i < transform.childCount; i++)
        {
    
    
            originalLay.Add(transform.GetChild(i).GetSiblingIndex());
        }
    }

    /// <summary>
    /// 左移前重新排列物体顺序及记录层级
    /// </summary>
    public void LeftResetData()
    {
    
    
        List<Transform> tempTransform = new List<Transform>();
        for (int i = 1; i < sortTransform.Count + 1; i++)
        {
    
    
            if (i == sortTransform.Count)
            {
    
    
                tempTransform.Add(sortTransform[0]);
            }
            else
            {
    
    
                tempTransform.Add(sortTransform[i]);
            }
        }
        sortTransform = tempTransform;

        originalPositions.Clear();
        originalScales.Clear();
        originalLay.Clear();
        for (int i = 0; i < sortTransform.Count; i++)
        {
    
    
            originalPositions.Add(sortTransform[i].position);
            originalScales.Add(sortTransform[i].localScale);
        }
        for (int i = 0; i < transform.childCount; i++)
        {
    
    
            originalLay.Add(transform.GetChild(i).GetSiblingIndex());
        }
    }

    /// <summary>
    /// 右移前重新排列物体顺序及记录层级
    /// </summary>
    public void RightResetData()
    {
    
    
        List<Transform> tempTransform = new List<Transform>();
        for (int i = -1; i < sortTransform.Count - 1; i++)
        {
    
    
            if (i == -1)
            {
    
    
                tempTransform.Add(sortTransform[sortTransform.Count - 1]);
            }
            else
            {
    
    
                tempTransform.Add(sortTransform[i]);
            }
        }
        sortTransform = tempTransform;

        originalPositions.Clear();
        originalScales.Clear();
        originalLay.Clear();
        for (int i = 0; i < sortTransform.Count; i++)
        {
    
    
            originalPositions.Add(sortTransform[i].position);
            originalScales.Add(sortTransform[i].localScale);
        }
        for (int i = 0; i < transform.childCount; i++)
        {
    
    
            originalLay.Add(transform.GetChild(i).GetSiblingIndex());
        }

    }

    /// <summary>
    /// 左移
    /// </summary>
    public void LeftMove()
    {
    
    
        //防止重复点击导致动画异常
        if (isMoving)
        {
    
    
            return;
        }
        isMoving = true;

        LeftResetData();
        for (int i = 0; i < sortTransform.Count; i++)
        {
    
    
            Transform tr = sortTransform[i];
            if (i == 0)
            {
    
    
                tr.DOMove(originalPositions[originalPositions.Count - 1], 1);
                tr.DOScale(originalScales[originalScales.Count - 1], 1);
            }
            else
            {
    
    
                tr.DOMove(originalPositions[i - 1], 1);
                tr.DOScale(originalScales[i - 1], 1);
            }
        }

        //层级根据卡牌的顺序来排列,距离中间相同距离的物体层级接近,中间物体层级最高,只适用于奇数
        for (int i = 0; i < sortTransform.Count / 2 + 1; i++)
        {
    
    
            if (i == sortTransform.Count / 2)
            {
    
    
                Transform tr = sortTransform[i];
                tr.SetSiblingIndex(originalLay[originalLay.Count - 1]);
            }
            else
            {
    
    
                Transform tr1 = sortTransform[i];
                Transform tr2 = sortTransform[sortTransform.Count - 1 - i];
                //左移右移为保证效果层级对应有一些变化
                tr1.SetSiblingIndex(originalLay[i * 2 + 1]);
                tr2.SetSiblingIndex(originalLay[i * 2]);
            }
        }
        Invoke("ResetMoveState", 1);
    }

    /// <summary>
    /// 右移
    /// </summary>
    public void RightMove()
    {
    
    
        if (isMoving)
        {
    
    
            return;
        }
        isMoving = true;

        RightResetData();
        for (int i = 0; i < sortTransform.Count; i++)
        {
    
    
            Transform tr = sortTransform[i];
            if (i == transform.childCount - 1)
            {
    
    
                tr.DOMove(originalPositions[0], 1);
                tr.DOScale(originalScales[0], 1);
            }
            else
            {
    
    
                tr.DOMove(originalPositions[i + 1], 1);
                tr.DOScale(originalScales[i + 1], 1);
            }
        }

        //层级根据卡牌的顺序来排列,距离中间相同距离的物体层级接近,中间物体层级最高,只适用于奇数
        for (int i = 0; i < sortTransform.Count / 2 + 1; i++)
        {
    
    
            if (i == sortTransform.Count / 2)
            {
    
    
                Transform tr = sortTransform[i];
                tr.SetSiblingIndex(originalLay[originalLay.Count - 1]);
            }
            else
            {
    
    
                Transform tr1 = sortTransform[i];
                Transform tr2 = sortTransform[sortTransform.Count - 1 - i];
                //左移右移为保证效果层级对应有一些变化
                tr1.SetSiblingIndex(originalLay[i * 2]);
                tr2.SetSiblingIndex(originalLay[i * 2 + 1]);
            }
        }
        Invoke("ResetMoveState", 1);
    }

    private void ResetMoveState()
    {
    
    
        isMoving = false;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_27050589/article/details/129076620