NanDaEnvironmentalProtection/Assets/Scripts/TSQ/CardCarousel.cs

164 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CardCarousel : MonoBehaviour
{
[Header("垂直布局设置")] public float startOffset = -1; // 起始Y位置顶部
public float endOffset = 1; // 结束Y位置底部
public float cardSpacing = 100; // 卡片垂直间距
[Header("运动控制")] public float slideSpeed = 100f; // 垂直移动速度
public bool slideDownward = false; // 向下滑动为true向上滑动为false
public bool isPlaying = true;
private List<RectTransform> imageList;
private void Start()
{
InitializeCarousel();
}
private void InitializeCarousel()
{
imageList = new List<RectTransform>();
float currentYPosition = startOffset; // 从顶部开始
foreach (RectTransform child in transform)
{
imageList.Add(child);
// 设置垂直位置X保持为0
child.anchoredPosition = new Vector2(0f, currentYPosition);
currentYPosition -= cardSpacing; // 向下排列,所以减去间距
}
Debug.Log($"初始化了 {imageList.Count} 个卡片起始Y: {startOffset}, 间距: {cardSpacing}");
}
private void Update()
{
if (!isPlaying || imageList.Count == 0) return;
// 计算垂直移动量
float verticalDirection = slideDownward ? -1f : 1f;
float deltaY = verticalDirection * slideSpeed * Time.deltaTime;
foreach (var image in imageList)
{
// 垂直移动
image.anchoredPosition += new Vector2(0f, deltaY);
// 检查是否需要回收
if (slideDownward)
{
// 向下滑动卡片移动到endOffset(底部)以下时,回收到顶部
if (image.anchoredPosition.y < endOffset)
{
// 找到当前最高的卡片
float highestY = GetHighestCardPosition();
image.anchoredPosition = new Vector2(0f, highestY + cardSpacing);
}
}
else
{
// 向上滑动卡片移动到startOffset(顶部)以上时,回收到底部
if (image.anchoredPosition.y > startOffset)
{
// 找到当前最低的卡片
float lowestY = GetLowestCardPosition();
image.anchoredPosition = new Vector2(0f, lowestY - cardSpacing);
}
}
}
}
/// <summary>
/// 获取当前最高卡片的位置最大的Y值
/// </summary>
private float GetHighestCardPosition()
{
if (imageList.Count == 0) return startOffset;
float highestY = imageList[0].anchoredPosition.y;
foreach (var card in imageList)
{
if (card.anchoredPosition.y > highestY)
{
highestY = card.anchoredPosition.y;
}
}
return highestY;
}
/// <summary>
/// 获取当前最低卡片的位置最小的Y值
/// </summary>
private float GetLowestCardPosition()
{
if (imageList.Count == 0) return endOffset;
float lowestY = imageList[0].anchoredPosition.y;
foreach (var card in imageList)
{
if (card.anchoredPosition.y < lowestY)
{
lowestY = card.anchoredPosition.y;
}
}
return lowestY;
}
/// <summary>
/// 添加新卡片到轮播
/// </summary>
public void AddCard(RectTransform newCard)
{
if (newCard == null) return;
newCard.SetParent(transform);
newCard.localScale = Vector3.one;
// 获取当前最高卡片位置,新卡片放在它下面
float highestY = GetHighestCardPosition();
newCard.anchoredPosition = new Vector2(0f, highestY - cardSpacing);
imageList.Add(newCard);
}
/// <summary>
/// 设置播放状态
/// </summary>
public void SetPlaying(bool playing)
{
isPlaying = playing;
}
/// <summary>
/// 设置滑动方向true=向下false=向上)
/// </summary>
public void SetDirection(bool downward)
{
slideDownward = downward;
}
/// <summary>
/// 切换滑动方向
/// </summary>
public void ToggleDirection()
{
slideDownward = !slideDownward;
Debug.Log($"滑动方向切换为: {(slideDownward ? "" : "")}");
}
/// <summary>
/// 获取所有卡片位置信息(用于调试)
/// </summary>
public void DebugCardPositions()
{
for (int i = 0; i < imageList.Count; i++)
{
Debug.Log($"卡片 {i}: Y位置 = {imageList[i].anchoredPosition.y}");
}
}
}