100个 Unity小游戏系列六 -Unity 抽奖游戏专题四 翻卡游戏

news/2024/7/22 13:52:55/文章来源:https://blog.csdn.net/m0_61164038/article/details/139262419

一、演示效果

二、知识点讲解

2.1 布局

  void CreateItems(){reward_data_list = reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i = 0; i < ItemCount; i++){GameObject item;if (i + 1 <= itemParent.childCount){item = itemParent.GetChild(i).gameObject;}else{item = Instantiate(itemParent.GetChild(0).gameObject, itemParent);}item.transform.localPosition = initPosArr[i];item.transform.localScale = Vector3.one;var cardGraphics = item.transform.Find("Graphics").GetComponent<RectTransform>();RefreshCardData(cardGraphics, false, rewardDatas[i]);SetCardOpen(false, item.GetComponent<Button>(), true, rewardDatas[i]);}StartAnim(rewardDatas);}/// <summary>/// 明牌,洗牌动画/// </summary>private void StartAnim(RewardData[] rewardsArr){CardSelectable = false;if (rewardsArr.Length != itemParent.childCount){Debug.LogErrorFormat("rewards length is not equals cards count:{0}", itemParent.childCount);return;}isSwapCard = true;var seqAnim = DOTween.Sequence();seqAnim.AppendInterval(2f);seqAnim.AppendCallback(() =>{int overCount = itemParent.childCount;for (int i = 0; i < itemParent.childCount; i++){SetCardOpen(false, itemParent.GetChild(i).GetComponent<Button>(), false, null, 0.2f, () =>{//所有卡片翻回去之后开始洗牌if (--overCount <= 0){List<int> cardsList = new List<int>();for (int childIndex = 0; childIndex < itemParent.childCount; childIndex++){cardsList.Add(childIndex);}SwapCards(cardsList, 10, () =>{RefreshCardADState(false);CardSelectable = true;});}});}});}

2.2 转动逻辑

 private void SwapCards(List<int> cardsList, int swapCount, Action onComplete){if (swapCount <= 0){onComplete?.Invoke();return;}SwapCardAnim(cardsList, () =>{ListRandom(cardsList);SwapCards(cardsList, --swapCount, onComplete);});}public static void ListRandom<T>(List<T> sources){int index;T temp;for (int i = 0; i < sources.Count; i++){index = UnityEngine.Random.Range(0, sources.Count);if (index != i){temp = sources[i];sources[i] = sources[index];sources[index] = temp;}}}/// <summary>/// 洗牌动画/// </summary>/// <param name="onSwapOver"></param>private void SwapCardAnim(List<int> cardsindexList, Action onSwapOver){if (itemParent.childCount % 2 != 0){Debug.LogError("cardsRoot 卡片个数不能为奇数");return;}int moveMission = itemParent.childCount;TweenCallback onMoveOver = () =>{if (--moveMission <= 0){onSwapOver?.Invoke();}};for (int i = 0; i < cardsindexList.Count; i += 2){var indexA = cardsindexList[i];var indexB = cardsindexList[i + 1];var cardA = itemParent.GetChild(indexA);var cardB = itemParent.GetChild(indexB);float moveDuration = Vector2.Distance(initPosArr[indexA], initPosArr[indexB]) / 1500;moveDuration = Mathf.Clamp(moveDuration, 0, 0.18f);cardA.DOLocalMove(initPosArr[indexB], moveDuration).onComplete = onMoveOver;cardB.DOLocalMove(initPosArr[indexA], moveDuration).onComplete = onMoveOver;}}private void SetCardOpen(bool isUser, Button cardBt, bool isOpen, RewardData reward = null, float duration = 0.2f, Action onCardAnimOver = null){if (isOpen && reward == null){Debug.LogError("翻卡传入奖励数据为null");return;}if (isUser && !CardSelectable){return;}CardSelectable = false;int texIndex = 0;int colorIndex = 0;string tmStr = string.Empty;Vector3 halfRotate = new Vector3(0, 90, 0);if (isOpen){texIndex = reward.type;colorIndex = reward.type - 1;tmStr = reward.amount.ToString();halfRotate.y = 270;}cardBt.interactable = !isOpen;var card = cardBt.transform;var cardGraphics = card.Find("Graphics").GetComponent<RectTransform>();var seqAnim = DOTween.Sequence();seqAnim.Append(cardGraphics.DOLocalRotate(halfRotate, duration).SetEase(Ease.Linear));seqAnim.AppendCallback(() =>{RefreshCardData(cardGraphics, isOpen, reward);});seqAnim.Append(cardGraphics.DOLocalRotate(halfRotate + Vector3.up * 90, duration).SetEase(Ease.Linear));seqAnim.onComplete = () =>{if (!isUser){//CardSelectable = true;onCardAnimOver?.Invoke();}};if (isUser){card.SetSiblingIndex(itemParent.childCount);//float moveDuration = Vector2.Distance(card.transform.localPosition, Vector3.zero) / 400;//moveDuration = Mathf.Clamp(moveDuration, 0, 0.4f);//card.DOMove(Vector3.zero, moveDuration);//card.DOScale(1.4f, moveDuration).onComplete = () =>//{//    var moveSeq = DOTween.Sequence();//    moveSeq.AppendInterval(1.0f);//    moveSeq.AppendCallback(() =>//    {//        var smallCard = smallCardsRoot.GetChild(CurClaimIndex);//        moveDuration = Mathf.Clamp(Vector2.Distance(card.position, smallCard.position) / 10, 0, 0.4f);//        card.DOScale(smallCard.GetComponent<RectTransform>().sizeDelta.x / card.GetComponent<RectTransform>().sizeDelta.x, moveDuration);//        card.DOMove(smallCard.position, moveDuration).onComplete = () =>//        {//            CardSelectable = true;//            GF.Sound.PlaySound("poker_end.wav", false);//            //加奖励//            GF.UserData.ClaimReward(UserDataType.LuckpokerRedpacket, reward, GF.UserData.GameUIForm.gameMainView.levelSocreTxt.transform);//            onCardAnimOver?.Invoke();//        };//    });//};CardSelectable = true;onCardAnimOver?.Invoke();}}

三 、完整代码逻辑

https://github.com/lixianjun0903/luckydraw-master.git

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

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

相关文章

母婴商城购物网站,基于 SpringBoot+Vue+MySQL 开发的前后端分离的母婴商城购物网站设计实现

目录 一. 前言 二. 功能模块 2.1. 前台功能 2.2. 用户信息管理 2.3. 商品分类管理 2.4. 商品信息管理 2.5. 商品资讯管理 三. 部分代码实现 四. 源码下载 一. 前言 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&a…

多输入多输出 | MATLAB实现BiTCN(双向时间卷积神经网络)多输入多输出预测

多输入多输出 | MATLAB实现BiTCN(双向时间卷积神经网络)多输入多输出预测 目录 多输入多输出 | MATLAB实现BiTCN(双向时间卷积神经网络)多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BiTCN双向时间卷积神经网络多输入多输出预测 1.data为数据…

Mac连接虚拟机(Linux系统)

1.确定虚拟机的IP地址 ifconfig //终端命令&#xff0c;查询ip地址 sudo apt install net-tools 安装完成后再次执行 ifconfig&#xff1a; 2.安装SSH&#xff08;加密远程登录协议&#xff09; (1).安装OpenSSH服务器软件包&#xff1a; sudo apt-get install openssh-ser…

【最优化方法】实验一 熟悉MATLAB基本功能

实验一  熟悉MATLAB基本功能 实验的目的和要求&#xff1a;在本次实验中&#xff0c;通过亲临使用MATLAB&#xff0c;对该软件做一全面了解并掌握重点内容。 实验内容&#xff1a; &#xff11;、全面了解MATLAB系统 &#xff12;、实验常用工具的具体操作和功能 学习建…

机器学习大模型驱动:未来的趋势与应用

文章目录 &#x1f4d1;前言一、什么是机器学习大模型&#xff1f;1.1 大模型的特点1.2 大模型的技术基础 二、大模型的技术实现2.1 Transformer 架构2.2 预训练和微调2.3 模型并行和数据并行 三、大模型的应用场景3.1 自然语言处理&#xff08;NLP&#xff09;3.2 计算机视觉&…

vue学习汇总

目录 一、vue基本语法 1.插值表达式 {{}} 2.显示数据(v-text)和(v-html) 3.事件处理(v-on) 4.循环遍历(v-for) 5.判断语法(v-if) 6.元素显示与隐藏(v-show) 7.动态设置属性(v-bind) 8.数据双向绑定(v-model) 9.计算属性 二、vue组件 1.使用组件的三个步骤 2.注册组…

采用Java+ SpringBoot+ IntelliJ+idea开发的ADR药物不良反应监测系统源码

采用Java SpringBoot IntelliJidea开发的ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统具有广泛的应用场景&#xff0c;以下是一些主要的应用场景&#xff1a…

建立FTP服务器

文章目录 建立FTP服务器1. 使用VMware安装CentOS 7虚拟机。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&#xff08;onboot改为yes&#xff09;并重启网络服务&#xff0c;查看相应IP地址&#xff0c;并使用远程连接软件进行连接。3.配置yum源&#xff0…

深入了解Nginx(一):Nginx核心原理

一、Nginx核心原理 本节为大家介绍Nginx的核心原理,包含Reactor模型、Nginx的模块化设计、Nginx的请求处理阶段. &#xff08;本文源自微博客,且已获得授权&#xff09; 1.1、Reactor模型 Nginx对高并发IO的处理使用了Reactor事件驱动模型。Reactor模型的基本组件包含时间收集…

Python爬虫实战(实战篇)—17获取【CSDN某一专栏】数据转为Markdown列表放入文章中

文章目录 专栏导读背景结果预览1、页面分析2、通过返回数据发现适合利用lxmlxpath3、进行Markdown语言拼接总结 专栏导读 在这里插入图片描述 &#x1f525;&#x1f525;本文已收录于《Python基础篇爬虫》 &#x1f251;&#x1f251;本专栏专门针对于有爬虫基础准备的一套基…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面&#xff0c;登陆管理员账号 &#xff08;测试服务器安装的gitlab&#xff0c;浏览器输入ip或配置的gitlab地址&#xff09; 创建新项目 使用gitlab创建项目 创建一个新项目&#xff08;忽略分组&#xff09; &#xff08;忽略分组&#xff09; 在创建工…

【CTF Web】CTFShow web5 Writeup(SQL注入+PHP+位运算)

web5 1 阿呆被老板狂骂一通&#xff0c;决定改掉自己大意的毛病&#xff0c;痛下杀手&#xff0c;修补漏洞。 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\…

深入分析 Android Activity (一)

文章目录 深入分析 Android Activity (一)1. Activity 的窗口管理2. Activity 的生命周期管理onCreateonStartonResumeonPauseonStoponDestroyonRestart 3. Activity 与 Fragment 的交互添加 FragmentFragment 的生命周期 4. Activity 的任务和返回栈5. 配置变化处理 总结 深入…

【实用的 IDEA 配置和操作技巧总结】

前置知识 IDEA的设置快捷键为ctrlalts键&#xff0c;后文介绍IDEA常见的配置就不再赘述这一点了。 基础配置 取消默认打开上次项目 日常开发都会打开不同的项目&#xff0c;初次安装IDEA之后&#xff0c;每次打开IDEA都会开启上一次启动的项目&#xff0c;所以我们需要进入设…

微软MSBuild大会发布Copilot+PC:技术革新还是隐私噩梦?

微软在最近的MSBuild 2024大会上发布了全新的CopilotPC概念&#xff0c;这一技术结合了高通骁龙X Elite芯片&#xff0c;将人工智能与PC紧密结合。此次发布引起了广泛关注&#xff0c;不仅是因为其技术创新&#xff0c;还因为潜在的隐私问题。甚至连Elon Musk也对此表示担忧&am…

Springboot项目——网页版本五子棋

网页五子棋&#xff1a;本项目简单实现了网页版本的五子棋对战功能&#xff0c;同时会根据用户的天梯分数来匹配&#xff0c;可供多位用户同时提供对战功能。大致可分为三个模块&#xff0c;用户模块&#xff0c;匹配模块&#xff0c;对战模块&#xff0c;下面重点介绍以下三个…

一款220V降12V恒压芯片电路原理图WT5114

一款220V降12V恒压芯片电路原理图WT5114&#xff0c;电路图简示如下&#xff1a; 一款220V降12V恒压芯片线路图WT5114 WT5114是一款高性能、高精度、低成本的PWM电源开关&#xff0c;适用于非隔离降压和反激式应用。它集成了专用电流模式PWM控制器&#xff08;采用SOP8封装的高…

【机器学习300问】102、什么是混淆矩阵?

一、混淆矩阵的定义 混淆矩阵是一种用于评估分类模型性能的评估指标。当模型对数据进行预测并将数据分配到预定义的类别时&#xff0c;混淆矩阵提供了一种直观的方式来总结这些预测与数据实际类别之间的对应关系。具体来说&#xff0c;它是一个表格。 二、分类模型性能评估一级…

SWM181系列应用

一、SWM181系列 ISP功能 1.1、注意&#xff1a;ISP引脚为B0&#xff0c;VCC&#xff0c;GND是UART-RX、UART-TX 下载引脚。所有型号的UART-RX - - > A0&#xff0c;UART-TX - - > A1。 1.2、注意&#xff1a;板级设计必须留出ISP引脚&#xff0c;防止调试过程中芯片锁死后…

【赠书第25期】C#项目开发实战(微视频版)

文章目录 前言 1 项目构思与需求分析 1.1 项目构思 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…