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;
}
}
UGUI卡片左右切换效果
猜你喜欢
转载自blog.csdn.net/qq_27050589/article/details/129076620
今日推荐
周排行