unity卡牌循环滚动列表

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;


public class RotationPageView : MonoBehaviour
{
    public Vector2 ItemSize;
    public List<Sprite> SpriteList;
    private List<PageItem> ItemList;
    private List<ItemPosData> ItemPosList;
    private List<ItemIdData> itemIdList;

    public float ScareMax;
    public float ScareMin;
    public float YMax;
    public float YMin;
    public float AlphaMin;
    public float OffSetX;
    public float OffSety;

    void Start()
    {
        ItemList = new List<PageItem>();
        ItemPosList = new List<ItemPosData>();
        itemIdList = new List<ItemIdData>();
        CreateItem();
        CaculateData();
    }

    private GameObject CreateTempate()
    {
        GameObject temp = new GameObject("Template");

        temp.AddComponent<PageItem>();
        temp.AddComponent<RectTransform>().sizeDelta = ItemSize;
        temp.AddComponent<Image>();
        return temp;
    }

    private void CreateItem()
    {
        GameObject temp = CreateTempate();
        for (int i = 0; i < SpriteList.Count; i++)
        {
            PageItem item = Instantiate(temp).GetComponent<PageItem>();

            item.Index = i;
            item.SetImage(SpriteList[i]);
            item.SetParent(transform);
            item.AddEventlistenr(change);
            
            ItemList.Add(item);
        }
    }

    public void change(float offX) {
        int symbol = 0;
        symbol = offX > 0 ? 1 : -1;
        rotateItem(symbol);
    }

    private void rotateItem(int symbol) {

        int allNums = itemIdList.Count;
        int lens = allNums - 1;
        int maxValues = lens;

        for (int i = 0; i < ItemPosList.Count; i++)
        {
            int index = ItemList[i].Index;

            if (symbol < 0)
            {
                if (index == 0)
                {
                    index = maxValues;
                }
                else
                {
                    index = index + symbol;
                }
            }
            else {
                if (index == maxValues)
                {
                    index = 0;
                }
                else
                {
                    index = index + symbol;
                }
            }
            ItemList[i].Index = index;
        }

        for (int i = 0; i < allNums; i++) {
            int index = ItemList[i].Index;
            ItemList[i].SetPositon(ItemPosList[index]);
        }
    }

    private void CaculateData()
    {

        float lengthx = (ItemSize.x + OffSetX) * 4;
        float lengthy = (ItemSize.y + OffSety) * 4;
        float radio = 1.0f / SpriteList.Count;

        float tempRadio = 0f;

        for (int i = 0; i < SpriteList.Count; i++)
        {
            ItemPosData pos = new ItemPosData();
            ItemIdData itemId = new ItemIdData();
            itemId.Id = i;

            pos.X = GetX(tempRadio, lengthx);
            pos.Y = GetY(tempRadio, YMax, YMin);
            pos.Alpha = GetAlpha(tempRadio, AlphaMin);
            pos.ScareTimes = GetScaraTimes(tempRadio, ScareMax, ScareMin);

            tempRadio += radio;
            pos.Order = i;

            ItemPosList.Add(pos);
            itemIdList.Add(itemId);

        }
        itemIdList = itemIdList.OrderBy(u => ItemPosList[u.Id].ScareTimes).ToList();

        for (int i = 0; i < itemIdList.Count; i++)  //根据缩放有小到大,排列了id列表
        {
            int id = itemIdList[i].Id;
            ItemPosList[id].Order = i;
        }

        for (int i = 0; i < ItemPosList.Count; i++)
        {
            ItemList[i].SetPositon(ItemPosList[i]);
        }
    }

    private float GetX(float radio, float length)
    {
        if (radio < 0 || radio > 1)
        {
            Debug.Log("系数错误");
            return 0;
        }

        if (radio >= 0 && radio <= 0.25f)
        {
            return radio * length;
        }
        else if (radio > 0.25 && radio < 0.75f)
        {
            return (0.5f - radio) * length;
        }
        else
        {
            return (radio - 1f) * length;
        }
    }
    private float GetAlpha(float radio, float length)
    {
        if (radio < 0 || radio > 1)
        {
            Debug.Log("系数错误");
            return 0;
        }

        if (radio >= 0 && radio <= 0.25f)
        {
            return 1;
        }
        else if (radio > 0.25 && radio < 0.75f)
        {
            return length;
        }
        else
        {
            return 1;
        }
    }
    private float GetY(float radio, float scareMax, float scareMin)
    {
        float scareSub = scareMax - scareMin;

        if (radio < 0f || radio > 1f)
        {
            Debug.Log("系数错误");
            return 0;
        }

        if (radio == 0 || radio == 1f)
        {
            return scareSub;
        }

        if (radio > 0 && radio <= 0.5f)
        {
            return (1 - radio) * scareSub;//0.5 ~ 1
        }
        else
        {
            return radio * scareSub;
        }
    }
    private float GetScaraTimes(float radio, float scareMax, float scareMin)
    {
        float scareSub = scareMax - scareMin;

        if (radio < 0f || radio > 1f)
        {
            Debug.Log("系数错误");
            return 0;
        }

        if (radio == 0 || radio == 1f)
        {
            return scareSub;
        }

        if (radio > 0 && radio <= 0.5f)
        {
            return (1 - radio) * scareSub;//0.5 ~ 1
        }
        else
        {
            return radio * scareSub;
        }
    }
}


public class ItemPosData
{
    public float X;         //位置
    public float Y;         //位置
    public float ScareTimes;//缩放
    public float Alpha;     //Alpha
    public int Order;       //层级参数
}

public class ItemIdData
{

    public int Id;

}

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

public class PageItem : MonoBehaviour,IDragHandler,IEndDragHandler
{


    private float X;
    private int index;
    private float ScareTimes;
    private float offX = 0;
    private Action<float> MoveAction;

    private Image myImage;

    private Image MyImage
    {
        get {

            if (myImage == null)
                myImage = GetComponent<Image>();

            return myImage;
        
        }
    }

    private RectTransform myRect;

    private RectTransform MyRect {

        get {
            if (myRect == null)
                myRect = GetComponent<RectTransform>();

            return myRect;
        
        }
    }


    public int Index
    { 
        get=> index; set => index = value;
    }


    void Start()
    {
        
    }

    // Update is called once per frame
    //void Update()
    //{

    //}


    public void SetParent(Transform parent) {
        transform.SetParent(parent);
    }

    public void SetPositon(ItemPosData posData) {
        //MyRect.DOAnchorPos(Vector2.right * posData.X, 1.0f);
        MyRect.DOAnchorPosX(posData.X, 1.0f);
        MyRect.DOAnchorPosY(-posData.Y, 1.0f);
        MyRect.GetComponent<Image>().DOFade(posData.Alpha, 1.0f);
        MyRect.DOScale(Vector2.one * posData.ScareTimes, 1.0f);

        StartCoroutine(wait(posData.Order));
    }

    IEnumerator wait(int order) {
        yield return new WaitForSeconds(0.5f);
        transform.SetSiblingIndex(order);
    }

    public void SetImage(Sprite sprite) {
        MyImage.sprite = sprite;
    }


    public void AddEventlistenr(Action<float> move) {
        MoveAction = move;
    }

    public void OnDrag(PointerEventData eventData)
    {
        offX += eventData.delta.x;
        //Debug.Log("offX=========" + offX);
    }

    public void OnEndDrag(PointerEventData eventData)
    {

        MoveAction(offX);
        offX = 0;
    }
}

在这里插入图片描述
效果如下
在这里插入图片描述
借鉴自

https://blog.csdn.net/Y_fly_tiger/article/details/107086560

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值