100个 Unity小游戏系列五 -Unity 抽奖游戏专题三老虎机游戏

一、演示效果

二、知识点讲解

2.1 布局

public void CreateItems(SlotsData[] slotsData){isInited = false;slotsPrizeList = new List<SlotsData>();for (int i = 0; i < slotsData.Length; i++){var item = slotsData[i];slotsPrizeList.Add(item);}float bottomY = -itemPadding * frontItemCount;slotEdge = new Vector2(bottomY + itemPadding * slotsPrizeList.Count, bottomY);slotWheelsIds = new int[slotWheels.Length][];slotsStopIdx = new int[slotWheels.Length];for (int i = 0; i < slotWheelsIds.Length; i++){slotWheelsIds[i] = new int[slotsPrizeList.Count];for (int j = 0; j < slotWheelsIds[i].Length; j++){slotWheelsIds[i][j] = slotsPrizeList[j].id;}int halfLen = slotsPrizeList.Count / 2;for (int j = 0; j < halfLen; j++){int randSwapIdx = UnityEngine.Random.Range(0, halfLen + 1);int swapIdx2 = slotsPrizeList.Count - randSwapIdx - 1;int tmpPrizeId = slotWheelsIds[i][swapIdx2];slotWheelsIds[i][swapIdx2] = slotWheelsIds[i][randSwapIdx];slotWheelsIds[i][randSwapIdx] = tmpPrizeId;}}for (int i = 0; i < slotWheels.Length; i++){var wheel = slotWheels[i];for (int j = 0; j < slotWheelsIds[i].Length; j++){var prizeId = slotWheelsIds[i][j];var reward_data = LuckyManager.Instance.GetDataById(rewardDatas, prizeId, out int index);var item = Instantiate(slot_Item, wheel);var pos = item.transform.localPosition;pos.y = slotEdge.y + j * itemPadding;item.transform.localPosition = pos;item.transform.localScale = Vector3.one * itemSize;var reward_img = item.GetComponentInChildren<Image>();reward_img.sprite = itemImgs[reward_data.type - 1];reward_img.SetNativeSize();item.GetComponentInChildren<TextMeshProUGUI>().text = string.Format("{0}", reward_data.amount);item.SetActive(true);}}isInited = true;}

2.2、转动逻辑

 private void OnClickSpin(){if (!isInited || IsRolling){return;}GetSelectIndex();RollSlots(SpinComplete);}public void RollSlots(Action<bool, SlotsData> onSpinCompleted){IsRolling = true;int rewardId = LuckyManager.Instance.CalculateRewardId(rewardDatas);var reward_data = LuckyManager.Instance.GetDataById(rewardDatas, rewardId, out int slot_index);bool isMatched = CalculateSlotStopIndex(reward_data, out slotsStopIdx);int slotWheelsCount = slotWheels.Length;int roundNum = 5;for (int i = 0; i < slotWheels.Length; i++){var wheel = slotWheels[i];var stopIdx = slotsStopIdx[i];float rollDistance = roundNum * (slotEdge.x - slotEdge.y);var offsetY = wheel.GetChild(stopIdx).localPosition.y;rollDistance += offsetY < 0 ? Mathf.Abs(offsetY - slotEdge.y) + slotEdge.x : offsetY;float preframePosY = 0f;float curPosY = 0f;float rollTime = 2.5f;if (rollStyle2){rollTime = 2.5f + i * 0.5f;}else if (rollStyle3){rollTime = 4.5f - i * 0.5f;}else if (rollStyle4){rollTime = 2.5f + i * 2.5f;}var rollAnim = DOTween.To(() => curPosY, (x) => curPosY = x, rollDistance, rollTime);rollAnim.SetEase(Ease.OutQuart);rollAnim.onUpdate = () =>{float deltaY = curPosY - preframePosY;for (int j = 0; j < wheel.childCount; j++){var item = wheel.GetChild(j);float nextPosY = item.transform.localPosition.y - deltaY;var localPosition = item.transform.localPosition;localPosition.y = nextPosY < slotEdge.y ? slotEdge.x - (slotEdge.y - nextPosY) : nextPosY;item.transform.localPosition = localPosition;}preframePosY = curPosY;};rollAnim.onComplete = () =>{if (--slotWheelsCount <= 0){IsRolling = false;onSpinCompleted.Invoke(isMatched, reward_data);}};}}

三、代码完整链接

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

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

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

相关文章

学习sam的过程

一、抓包 我平时都是用花瓶去抓包的&#xff0c;配置也很简单。就是下载软件&#xff0c;然后一步步安装。下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 。然后配置手机代理 对于那些走http协议的app是可以的&#xff0c;https的还是…

SAP锁机制(SAP Locks)经验小结

1. 数据一致性与锁 为什么要有锁机制&#xff1f;其背后的核心逻辑在于“保证数据的一致性”。 当数据被应用程序修改时&#xff0c;我们必须要保证修改后的数据具有一致性。在SAP系统中&#xff0c;将一致的数据状态从一个状态变动到另一个一致状态的时间跨度被称为LUW&…

应对意外断电:气膜建筑的安全防护与智能管理—轻空间

气膜建筑以其独特的结构和高效的建设方式&#xff0c;广泛应用于各类场馆、仓储设施和临时展馆。然而&#xff0c;当遇到意外断电导致气膜内部无法送风时&#xff0c;如何避免气膜倒塌&#xff0c;确保建筑安全呢&#xff1f; 断电应急响应 气膜建筑配备了先进的智能控制系统&a…

记录一次Redisson使用synchronized和分布式锁不生效的原因

最近在开发的过程中&#xff0c;遇到了一个并发场景&#xff0c;用户进行方案复制的时候&#xff0c;当快速点击两次操作的时候&#xff0c;出现了复制方案重名的情况&#xff0c;实际上是复制方案的方案名称&#xff0c;是由后端根据数据库已有的方案名称和当前要复制的方案名…

【退役之重学Java】总结

带着一把伤心的吉他&#xff0c;我背井离乡 你居然想要成为别人的老婆 只有代码 不伤人心 一、深入理解 JVM 底层原理 运行时数据区域 JVM 运行时数据区域&#xff0c;分为栈区、堆区、方法区、程序计数器、本地方法栈 栈区存放的是变量的最浅层的值&#xff0c;如果是基本数据…

git新电脑下载配置记录

1、官网下载 2、安装 3、配置 &#xff08;1&#xff09;先生成密钥 ssh-keygen -t rsa -C “XXXqq.com” &#xff08;2&#xff09;生成两个文件&#xff0c;复制.pub,在GitHub的setting里面设置ssh&#xff0c; &#xff08;3&#xff09;验证远程是否配置成功 ssh -T g…

Python轻量级的插件框架库之pluginbase使用详解

概要 在软件开发中,插件系统是一个常见的需求。插件系统允许开发者动态加载和卸载功能模块,从而提高应用程序的灵活性和可扩展性。Python的pluginbase库是一个轻量级的插件框架,旨在简化插件系统的构建过程。pluginbase库提供了一套简单易用的API,使开发者能够快速集成插件…

【408真题】2009-23

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

Windows电脑高颜值桌面便利贴,便签怎么设置

在这个看颜值的时代&#xff0c;我们不仅在衣着打扮上追求时尚与美观&#xff0c;就连电脑桌面也不愿放过。一张唯美的壁纸&#xff0c;几款别致的小工具&#xff0c;总能让我们的工作空间焕发出不一样的光彩。如果你也热衷于打造高颜值的电脑桌面&#xff0c;那么&#xff0c;…

探索智能零售的未来商机与运营策略

探索智能零售的未来商机与运营策略 在智能零售的广阔图景中&#xff0c;无人售货机加盟赫然矗立为一股不可小觑的力量&#xff0c;预示着零售业态未来的转型与机遇。其核心优势多维展开&#xff0c;具体阐述如下&#xff1a; 1. **全天候服务**&#xff1a;无人售货机的运行跨…

优思学院:什么是DMADV模式?和DMAIC有何区别?

在现代企业管理中&#xff0c;质量管理是一项至关重要的工作。六西格玛管理法作为一种高效的质量管理方法&#xff0c;已在全球范围内得到了广泛应用。它不仅在制造业中发挥了巨大的作用&#xff0c;在服务业和其他行业中也同样表现出了强大的生命力。六西格玛管理法主要有两种…

SQL 语言:触发器

文章目录 基本概述创建触发器更改和删除触发器总结 基本概述 存储过程&#xff0c;类似于高阶语言的函数或者方法&#xff0c;包含SQL语句序列&#xff0c;是可复用的语句&#xff0c;保存在数据库中&#xff0c;在服务器中执行。特点是复用&#xff0c;提高了效率&#xff0c…

B3956 [GESP202403 三级] 字母求和

[GESP202403 三级] 字母求和 题目描述 小杨同学发明了一种新型密码&#xff0c;对于每一个小写英文字母&#xff0c;该小写字母代表了一个正整数&#xff0c;即该字母在字母顺序中的位置&#xff0c;例如字母 a 代表了正整数 1 1 1&#xff0c;字母 b 代表了正整数 2 2 2&a…

【30天精通Prometheus:一站式监控实战指南】第10天:blackbox_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

Java——执行流程

一、执行流程 1、示例 //第一个Java程序 public class Hello{public static void main(String[] args){System.out.println("Hello World!");} } 编译&#xff1a; 执行&#xff1a; 我们可以看到这里的是类名&#xff0c;而不是字节码文件名 Hello.class &#…

通过 coze 快速构建自己的智能体机器人

通过 coze 快速构建自己的智能体机器人 coze 的使用 一&#xff09;coze 是什么 「Coze 扣子」AI Bot 开发平台。任何用户都可以快速、低门槛地搭建自己的 Chatbot&#xff0c;且平台支持用户将其一键发布到飞书、微信公众号、豆包等渠道。 二&#xff09;coze 怎么注册 1. …

【网络层】ICMP 因特网控制协议

文章目录 ICMP 含义以及作用ICMP协议解析结合ICMP协议和ping常见问题 ICMP 含义以及作用 ICMP&#xff1a;Internet control massage protocol 因特网控制协议 Internet控制报文协议ICMP是网络层的一个重要协议。 ICMP协议用来在网络设备间传递各种差错和控制信息&#xff0c;…

js 不同源的情况下 iframe还可以通讯吗

是的。即使在不同源的情况下&#xff0c;iframe之间仍然可以通过postMessage API进行通信。postMessage方法允许来自不同源的脚本采用异步方式进行有限的通信&#xff0c;这对于实现跨域通信非常有用。 基本原理 发送消息&#xff1a;使用window.postMessage方法从一个窗口向另…

QT6.2.4 MSVC2019 连接MySql5.7数据库,无驱动问题

1.下载 查询一下数据库驱动 qDebug()<<QSqlDatabase::drivers(); 结果显示&#xff0c;没有QMYSQL的驱动。 QList("QSQLITE", "QMARIADB", "QODBC", "QPSQL") MySql6.2.4驱动下载地址&#xff0c;如果是别的版本&#xff0c;…

在 OpenKylin 上安装 Docker

在 OpenKylin 上安装 Docker 可能会遇到与 Ubuntu 略有不同的包管理问题。以下是一个更详细的过程&#xff0c;确保你能正确添加 Docker 仓库并安装 Docker&#xff1a; 1. 确保系统更新 首先&#xff0c;更新系统包索引&#xff1a; sudo apt-get update2. 安装必要的依赖包…