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;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python开发环境搭建+conda管理环境

下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后&#xff0c;下拉到最后找到Miniconda3-latest前缀的文件&#xff0c;或者网页中直接搜索Miniconda3-latest&#xff0c;都可以找…

Git——本地仓库链接并推送到多个远程仓库

步骤 1. 新建仓库init 或 删除已有仓库远程链接 // 1.新建init git init// 2.已有仓库&#xff0c;查看链接的远程仓库 git remote -v// 3.已有远程连接仓库&#xff0c;需要删除连接 git remote rm origin(或对应远程仓库名) 2.新建远程仓库 在gitee、github等托管平台创建…

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…

Ubuntu20.04+ROS 进行机械臂抓取仿真:环境搭建(一)

目录 一、从官网上下载UR机械臂 二、给UR机械臂添加夹爪 三、报错解决 本文详细介绍如何在Ubuntu20.04ROS环境中为Universal Robots的UR机械臂添加夹爪。首先从官方和第三方源下载必要的软件包&#xff0c;包括UR机械臂驱动、夹爪插件和相关依赖。然后&#xff0c;针对gazeb…

23省赛区块链应用与维护(房屋租凭【下】)

23省赛区块链应用与维护(房屋租凭) 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔市场。目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同,房屋租赁费用通过中介或…

数字化转型的架构蓝图:从理论到实践的全面指导

在数字经济的高速发展中&#xff0c;企业正面临全新的竞争压力。为了在数字化浪潮中保持竞争力&#xff0c;许多企业都在寻求一种系统化的方法来实现其数字化转型。这种变革不仅涉及技术创新&#xff0c;还包括业务流程的彻底重塑与组织文化的转型。要成功实现数字化转型&#…

关于node全栈项目打包发布linux项目问题总集

1.用pm2部署nest 说明&#xff1a;如果一开始将nest直接打包放到linux服务器上用pm2执行则会报错&#xff0c;这是因为tsconfig.build.tsbuildinfo文件的路径以及相关依赖问题。 报错会为&#xff1a;什么东西找不到.... 所以建议以下为步骤一步一步配置 将整个nest添加压缩包直…

实验三 z变换及离散时间LTI系统的z域分析

实验原理 有理函数z 变换的部分分式展开 【实例2-1】试用Matlab 命令对函数 X ( z ) 18 18 3 − 1 − 4 z − 2 − z − 3 X\left(z\right)\frac{18}{183^{-1} -4z^{-2} -z^{-3} } X(z)183−1−4z−2−z−318​ 进行部分分式展开&#xff0c;并求出其z 反变换。 B[18]; A…

sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk

目录 1. 脚本代码 2. 执行情况 3. 代码详解 &#xff08;1&#xff09;BEGIN 过程 &#xff08;2&#xff09;主过程 &#xff08;3&#xff09;END 过程 &#xff08;4&#xff09;支持函数 4. 附加说明 这是一个基于 UNIX spell 程序的名为 spellcheck 的 awk 脚本&a…

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序源码助力品牌共建:价值、策略与实践

摘要&#xff1a;在当今数字化商业环境下&#xff0c;品牌构建已演变为企业与消费者深度共建的过程。本文聚焦于“开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序源码”&#xff0c;探讨其如何融入品牌建设&#xff0c;通过剖析品牌价值构成&#xff0c;阐述该技术工具在助力…

基于Springboot的流浪宠物管理系统

基于javaweb的流浪宠物管理系统 介绍 基于javaweb的流浪宠物管理系统的设计与实现&#xff0c;后端框架使用Springbootmybatis&#xff0c;前端框架使用Vuehrml&#xff0c;数据库使用mysql&#xff0c;使用B/S架构实现前台用户系统和后台管理员系统&#xff0c;和不同权限级别…

深度学习与持续学习:人工智能的未来与研究方向

文章目录 1. 持续学习与深度学习1.1 深度学习的局限1.2 持续学习的定义 2. 目标与心智2.1 奖励假说2.2 心智的构成 3. 对研究方法的建议3.1 日常写作记录3.2 中立对待流行趋势 1. 持续学习与深度学习 1.1 深度学习的局限 深度学习注重“瞬时学习”&#xff0c;如ChatGPT虽在语…

Pod 动态分配存储空间实现持久化存储

配置 Pod 以使用 PersistentVolume 作为存储 ​ 关于持久卷的介绍&#xff0c;可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/ ​ 持久卷根据存储位置&#xff0c;可以使用本地存储和云存储&#xff0c;如果有云服务平台&#xff0c…

应急响应靶机——linux2

载入虚拟机&#xff0c;打开虚拟机&#xff1a; 居然是没有图形化界面的那种linux&#xff0c;账户密码&#xff1a;root/Inch957821.&#xff08;注意是大写的i还有英文字符的.&#xff09; 查看虚拟机IP&#xff0c;192.168.230.10是NAT模式下自动分配的 看起来不是特别舒服&…

DAMODEL丹摩 | 关于我部署与使用FLUX.1+ComfyUI生成了一位三只手的jk美少女这回事

DAMODEL丹摩 | 关于我部署与使用FLUX.1ComfyUI生成了一位三只手的jk美少女这回事 最终效果图FLUX.1简介部署流程1. 创建资源2. 登录实例3. 部署ComfyUI4. 部署FLUX.1 使用流程1. 运行FLUX.1 导入工作流 声明&#xff1a;非广告&#xff0c;为用户使用体验分享 最终效果图 FLUX.…

Linux介绍与安装指南:从入门到精通

1. Linux简介 1.1 什么是Linux&#xff1f; Linux是一种基于Unix的操作系统&#xff0c;由Linus Torvalds于1991年首次发布。Linux的核心&#xff08;Kernel&#xff09;是开源的&#xff0c;允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…

钉钉授权登录

一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后&#xff0c;点击自己【新建的应用】&#xff0c;进入详细页面 四。进入应用详细页面。左边【分享设置】 注意&#xff1a;进…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…

VUE_使用el.animate实现自定义指令抖动效果

// 在 Vue 2 中注册自定义指令 Vue.directive(shake,{// 当被绑定的元素插入到 DOM 中时inserted(el, binding){let value binding.valueconsole.log(el, binding)// 设置 transform-origin 样式el.style.transformOrigin center bottom;const keyframes [{ transform: rota…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊&#xff0c;时代发展这么快&#xff0c;在时代的洪流下&#xff0c;我们个人能抓住些什么呢。我问了大模型&#xff0c;文心一言是这样回答的&#xff1a; 在快速发展的时代背景下&#xff0c;个人确实面临着诸多挑战&#xff0c;但同时也充满…