当前位置: 首页 > article >正文

unity | 动画模块之卡片堆叠切换

一、预览动画

可以放很多图,可以自己往后加,可以调图片x轴和y轴间距,可以调图片飞出方向,可以调堆叠方向。

图1 图片堆叠动画预览

二、纯净代码

有粉丝问我这个效果,最近很忙,没有时间细写,先发上来给有需要的朋友用。

如果帮到你了,请给我一个赞,预制体同步上传

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

public class CardStack2D : MonoBehaviour,IPointerDownHandler,IPointerUpHandler
{
    //卡片移动速度
    [SerializeField] private float cardMoveSpeed = 8f;
    //按钮冷却时间
    private bool canUseHorizontalAxis = true;
    [SerializeField] private float buttonCooldownTime = 5f;
    
    //x轴间隔
    [SerializeField] private int xPowerDifference;
    //y轴间隔
    [SerializeField] private int cardYMultiplier = 32;
    //z轴间隔
    [SerializeField] private int cardZMultiplier = 32;
    //调整终点X
    [SerializeField] private int endXPos = 1280;

    //卡片
    [SerializeField] private int cardIndex;
    [SerializeField] private Transform[] cards;
    public bool isLeftGroup = true;
    [SerializeField] private Vector3[] cardPositions;

    //鼠标拖拽
    private bool isDraggingCard;
    private float lastMouseX;
    private float deltaX;

    private void Start()
    {
        //xPowerDifference = 9 - cards.Length;
        
        //卡片位置共有  x*2-1个
        cardPositions = new Vector3[cards.Length * 2 - 1];
        
        //左半部分卡片
        for (int i = cards.Length; i > -1; i--)
        {
            if (i < cards.Length - 1)
            {
                float positionX;
                if (isLeftGroup)
                {
                    positionX = -xPowerDifference+ cardPositions[i + 1].x;
                }
                else
                {
                    positionX = xPowerDifference+ cardPositions[i + 1].x;
                }
                
                //设置卡片的初始位置
                cardPositions[i] = new Vector3(positionX, cardYMultiplier * Mathf.Abs(i + 1 - cards.Length), cardZMultiplier * Mathf.Abs(i + 1 - cards.Length));
            }
            else
            {
                cardPositions[i] = Vector3.zero;
            }
        }
        
        //右半部分卡片
        for (int i = cards.Length; i < cardPositions.Length; i++)
        {
            cardPositions[i] = new Vector3(endXPos + 4 * (i - cards.Length), 0, -2 + -2 * (i - cards.Length));
        }
    }

    private void Update()
    {
        for (int i = 0; i < cards.Length; i++)
        {
            cards[i].localPosition = Vector3.Lerp(cards[i].localPosition, cardPositions[i + cardIndex],
                Time.deltaTime * cardMoveSpeed);
            if (Mathf.Abs(cards[i].localPosition.x - cardPositions[i + cardIndex].x) < 0.01f)
            {
                cards[i].localPosition = cardPositions[i + cardIndex];
                
                if (cards[i].localPosition.x == 0)
                {
                    cards[i].gameObject.GetComponent<CanvasGroup>().interactable = true;
                }
                else
                {
                    cards[i].gameObject.GetComponent<CanvasGroup>().interactable = false;
                }
            }
        }
    }

    private void LastCard()
    {
        if (!canUseHorizontalAxis||(cardIndex-1)<0) return;
        
        cardIndex--;
        StartCoroutine(ButtonCooldown());
    }

    private void NextCard()
    {
        if (!canUseHorizontalAxis||(cardIndex+1)>=cards.Length) return;
        
        cardIndex++;
        StartCoroutine(ButtonCooldown());
    }

    private IEnumerator ButtonCooldown()
    {
        canUseHorizontalAxis = false;
        yield return new WaitForSeconds(buttonCooldownTime);
        canUseHorizontalAxis = true;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isDraggingCard = true;
        lastMouseX = Input.mousePosition.x;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        if(!isDraggingCard) return;
        
        isDraggingCard = false;
        deltaX = Input.mousePosition.x - lastMouseX;
        Debug.Log(deltaX);
        
        switch (deltaX)
        {
            case > 50:
                NextCard();
                break;
            case < -50:
                LastCard();
                break;
        }
    }

    private void OnDisable()
    {
        cardIndex = 0;
    }
}


http://www.kler.cn/a/412033.html

相关文章:

  • docker如何安装redis
  • || 与 ??的区别
  • 网上蛋糕售卖店管理系(Java+SpringBoot+MySQL)
  • DAY133权限提升-Windows权限提升篇溢出漏洞土豆家族通杀全系补丁对比EXP筛选
  • D80【 python 接口自动化学习】- python基础之HTTP
  • 基础入门-Web应用架构搭建域名源码站库分离MVC模型解析受限对应路径
  • 34 基于单片机的指纹打卡系统
  • 林业产品推荐系统:Spring Boot技术内幕
  • java实现归并排序和快速排序
  • Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)
  • 【Linux】/proc/sys/vm/drop_caches
  • 使用 Nginx 在 Ubuntu 22.04 上安装 LibreNMS 开源网络监控系统
  • i春秋-文件包含绕过(PHP伪协议的使用)
  • Altium Designer学习笔记 22-23 PCB快捷键设置_PCB模块化布局
  • JDBC 设置 PostgreSQL 查询中 any(?) 的参数
  • Vue 的 computed 如何实现接受一个参数
  • 【模型学习之路】PyG的使用+基于点的任务
  • Mybatis---MyBatis映射文件SQL深入、多表查询
  • Amazon AWS公司介绍
  • docker部署的服务器数据备份
  • 16.迭代器模式设计思想
  • Python学习指南 + 谷歌浏览器如何安装插件
  • 【通俗理解】神经网络中步长缩小的奥秘:优化算法与卷积操作的影响
  • 研0找实习【学nlp】14--BERT理解
  • 【C语言】指针与数组的例题详解:深入分析与高级用法
  • C/C++绘制爱心