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

一、演示效果

二、知识点讲解

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.mzph.cn/web/17494.shtml

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

相关文章

Python解析网页-requests_html

目录 1、什么是requests_html 2、安装与配置 3、快速入门 4、图片下载 1.什么是requests_html requests_html是一个Python库&#xff0c;用于从Web页面中提取数据。 它提供了对HTML内容的解析和处理功能&#xff0c;使您可以轻松地从网页中提取文本、链接、图像和其他元素。…

嵌入式UI开发-lvgl+wsl2+vscode系列:4、动画(Animations)

文章目录 一、前言二、动画示例1、示例1&#xff08;基础按钮label的组合动画&#xff09;2、示例2&#xff08;回放效果动画&#xff09;3、示例3&#xff08;贝塞尔曲线3动画&#xff09;4、示例4&#xff08;动画时间轴&#xff09; 三、最后 一、前言 接下来我们进行动画的…

Golang | Leetcode Golang题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; func isSymmetric(root *TreeNode) bool {u, v : root, rootq : []*TreeNode{}q append(q, u)q append(q, v)for len(q) > 0 {u, v q[0], q[1]q q[2:]if u nil && v nil {continue}if u nil || v nil {return false}if …

JWT使用方法

目录 基础概念 依赖 生成令牌 工具类 控制层 解析令牌 工具类 网关过滤器 效果 基础概念 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519).该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点…

深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

弘君资本:沪指跌0.46%,电力板块逆市爆发,半导体板块强势

28日&#xff0c;沪指早盘窄幅震动&#xff0c;午后回落走低&#xff1b;深证成指、创业板指大幅下探&#xff1b;两市成交额小幅萎缩。 截至收盘&#xff0c;沪指跌0.46%报3109.57点&#xff0c;深证成指跌1.23%报9391.05点&#xff0c;创业板指跌1.35%报1806.25点&#xff0c…

Windows 11 HBuilder X的安装和环境搭建教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 HBuilder X是一个由DCloud推出的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于构建基于HTML、CSS和JavaScript的跨平台应用程序&#xff0c;如微信小程序、App、H5等。它提供了丰富的功能…

【Unity】颜色混合计算

在图形渲染中&#xff0c;颜色混合&#xff08;Color Blending&#xff09;是指将多个颜色值组合在一起以生成最终显示的颜色。颜色混合技术广泛用于处理半透明效果、光照效果和后期处理效果。以下是一些常见的颜色混合模式&#xff1a; 1. 正常混合&#xff08;Normal Blendi…

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建

简单四步完成基于云服务器ARL资产侦察灯塔系统搭建及使用 前言 官网介绍&#xff1a;ARL全称-Asset Reconnaissance Lighthouse&#xff0c;中文含义&#xff1a;资产侦察灯塔系统。 旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 协助甲方安全团队或…

DragonKnight CTF复现(一)

这次的 re 题也是挺难的&#xff0c;按 wp 来学习一波 elec_go 下次遇到这种给了很多东西&#xff0c;又不知道怎么分析的&#xff0c;先百度一下。 Electron程序逆向&#xff08;asar归档解包&#xff09;_asar解包-CSDN博客 [原创] electron开发、打包与逆向分析-软件逆向-…

AutoDL搭建 ChatGLM3

租用新实例 这里选择的西北 B 区、RTX 409024GB 创建虚拟环境并激活 # 安装虚拟环境至数据盘 conda create --prefix /root/autodl-tmp/envs/chatglm3-demo python3.10# 激活虚拟环境 conda activate /root/autodl-tmp/envs/chatglm3-demo拉取ChatGLM3仓库代码 # 开启学术…

代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、 15. 三数之和、18. 四数之和

454.四数相加II 题目链接&#xff1a; 454.四数相加II 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;没想到考虑重复的情况&#xff01; 题解&#xff1a; public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {// 结果计数…

Python调用科大讯飞在线语音合成API --内附完整项目

一&#xff0c;注册讯飞账号&#xff0c;并实名制。 讯飞开放平台-以语音交互为核心的人工智能开放平台 (xfyun.cn) 二、找到音频合成&#xff0c;按页面提示申请免费试用。 在线语音合成_免费试用-讯飞开放平台 (xfyun.cn) 三、申请免费使用后&#xff0c;找到API信息如下…

vscode远程登录阿里云服务器【使用密钥方式--后期无需再进行密码登录】【外包需要密码】

1&#xff1a;windows主机上生成【私钥】【公钥】 1.1生成公钥时不设置额外密码 1.2生成公钥时设置额外密码【给外包人员使用的方法】 2&#xff1a;在linux服务器中添加【公钥】 3&#xff1a;本地vscode连接linux服务器的配置 操作流程如下 1.1本地终端中【生成免密登录…

从0到100,渠道码如何成为SaaS企业增长的加速器

在当今数字化时代&#xff0c;企业的增长策略已不再是单一和线性的。渠道码的出现&#xff0c;为SaaS&#xff08;软件即服务&#xff09;企业提供了一种全新的、多维度的增长途径&#xff0c;真正实现了从0到100的快速增长。 一、渠道码的高可定制性和灵活性&#xff0c;为Sa…

基于.NetCore和ABP.VNext的项目实战二:Swagger

Mag.Blog.Swagger层添加Volo.Abp.AspNetCore和Swashbuckle.AspNetCore包,引用实体层.Domain 添加模块类MagBlogSwaggerModule.cs,依赖MagBlogDomainModule模块,并且重写ConfigureServices和OnApplicationInitialization方法 namespace Mag.Blog.Swagger {[DependsOn(typeof…

错误提示:“由于找不到steam_api.dll,无法继续执行代码”修复方法,缺少steam_api.dll文件原因

在尝试运行某些游戏或程序时&#xff0c;用户可能会遇到一个常见的错误提示&#xff1a;“由于找不到steam_api.dll&#xff0c;无法继续执行代码”。这个错误信息表明&#xff0c;系统在启动程序或游戏时无法定位到必要的steam_api.dll文件&#xff0c;这是一个关键的动态链接…

香橙派 AIpro的NPU随手记体验日记

昇腾AI 技术路线 8TOPS INT8&#xff08;FP16&#xff09;AI算力 LPDDR4X 8GB/16GB &#x1f4c5; 20240525 开放了原理图和源码&#xff0c;功能接口就不描述了手册都有描述&#xff0c;新手好好学习可以从底层覆盖到应用一个载板拿下 完成香橙派AIpro上手体验 镜像安装&am…

C++学习---string模拟实现(2)

1.随机插入一个字符串 &#xff08;1&#xff09;insert函数插入一个字符的方法我们在之前的模拟实现里面已经搞过了&#xff0c;那个里面要注意的是这个全体向后挪动的循环过程&#xff0c;这个里面我们要实现的是插入字符串的模拟实现&#xff1b; &#xff08;2&#xff0…

网上3d全景虚拟交互展馆沉浸式体验让客户和使用者都满意

在数字化浪潮席卷而来的今天&#xff0c;3D场景网站已成为众多行业展现创意与实力的新舞台。然而&#xff0c;传统的3D建模软件往往因其复杂性和高门槛&#xff0c;让许多渴望创建逼真3D场景的用户望而却步。 幸运的是&#xff0c;华锐视点推出了搭建3D场景网站的编辑器——一款…