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

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

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

相关文章

Git 小白入门到进阶—(基本概念和常用命令)

一.了解 Git 基本概念和常用命令的作用 (理论) 基本概念 1、工作区 包含.git文件夹的目录&#xff0c;主要用存放开发的代码2、仓库 分为本地仓库和远程仓库&#xff0c;本地仓库是自己电脑上的git仓库(.git文件夹);远程仓库是在远程服务器上的git仓库git文件夹无需我们进行操…

ZYNQ AXI4 FDMA内存读写

1 概述 如果用过ZYNQ的都知道,要直接操作PS的DDR 通常是DMA 或者VDMA,然而用过XILINX 的DMA IP 和 VDMA IP,总有一种遗憾,那就是不够灵活,还需要对寄存器配置,真是麻烦。对于我们搞 FPGA 的人来说,最喜欢直接了当,直接用FPGA代码搞定。现在XILINX 的总线接口是AXI4总线…

echarts(6大基础图表)的使用

目录 一、vue2挂载 二、柱状图 2.1、基础柱状图介绍 2.2、标记&#xff1a;最大值\最小值(markPoint)、平均值(markLine) 2.3、显示&#xff1a;数值显示(label)、柱子宽度(barWidth)、横向柱状图 三、折线图 3.1、标记&#xff1a;最大值\最小值(markPoint)、平均值(ma…

正版软件 | Internet Download Manager 下载管理器

前言 IDM 是一个下载加速器&#xff0c;可将下载速度提高多达 8 倍&#xff0c;恢复、组织和安排下载。 30 天免费试用&#xff01;https://www.internetdownloadmanager.cc/ 新版本 Internet Download Manager v 6.40&#xff1a;添加了 Windows 11 兼容性。改进了媒体采集…

spring cloud config server源码学习(一)

文章目录 1. 注解EnableConfigServer2. ConfigServerAutoConfiguration2.1 ConditionalOnBean和ConditionalOnProperty2.2 Import注解2.2.1. EnvironmentRepositoryConfiguration.class2.2.2. CompositeConfiguration.class2.2.3. ResourceRepositoryConfiguration.class2.2.4.…

【高阶数据结构(七)】B+树, 索引原理讲解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多数据结构   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. B树讲解…

纽曼硬盘隐藏文件丢失怎么恢复?介绍几种有效的方法

纽曼硬盘作为存储设备中的佼佼者&#xff0c;以其高性能和稳定性受到了广大用户的青睐。然而&#xff0c;在使用过程中&#xff0c;有时我们可能会遇到一些意想不到的问题&#xff0c;比如隐藏文件的丢失。这对于依赖这些文件进行工作或生活的人来说无疑是一个巨大的困扰。那么…

电商api接口进行数据采集获取淘宝/天猫/京东/抖音多平台商品价格

在电商运营中&#xff0c;从品牌角度来看&#xff0c;品牌方通过电商数据采集API接口进行数据采集&#xff0c;获取多渠道商品价格信息的这一行为&#xff0c;能为品牌方带来诸多好处&#xff1a; 及时准确&#xff1a;API接口能为品牌提供实时数据&#xff0c;这意味着企业可…

常用目标检测预训练模型大小及准确度比较

目标检测是计算机视觉领域中的一项重要任务&#xff0c;旨在检测和定位图像或者视频中的目标对象。当人类观看图像或视频时&#xff0c;我们可以在瞬间识别和定位感兴趣的对象。目标检测的目标是使用计算机复制这种智能。 近年来&#xff0c;目标检测网络的发展日益成熟&#…

从git上拉取项目进行操作

1.Git的概念 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。它实现多人协作的机制是利用clone命令将项目从远程库拉取到本地库&#xff0c;做完相应的操作后再利用push命令从本地库将项目提交至远程库。 2.Git的工作流程…

奇门遁甲古籍1《奇门秘术》(双页版)PDF电子书

《奇门秘术》 全书共102页 时间有限&#xff0c;仅上传部分图片&#xff0c;结缘私&#xff01;

OrangePi AIpro初体验,码农的第一台个人AI云电脑

介绍 香橙派联合华为精心打造&#xff0c;建设人工智能新生态 官网地址&#xff1a;Orange Pi AIpro Orange Pi官网-香橙派 Orange Pi论坛&#xff1a;Orange Pi论坛 昇腾社区&#xff1a;为开发者免费提供数百个代码参考样例昇腾社区-官网丨昇腾万里 让智能无所不及 学习…

C++模板方法模式

文章目录 1. 定义抽象基类&#xff08;Abstract Class&#xff09;2. 实现具体子类&#xff08;Concrete Class&#xff09;3. 使用模板方法模板方法模式的优点模板方法模式的应用场景注意事项实现示例抽象类&#xff08;模板&#xff09;具体实现类客户端代码 总结 模板方法模…

政府鼓励社会力量建设气膜体育场馆—轻空间

2023年12月1日&#xff0c;国家体育安全总局发布的《关于政协第十四届全国委员会第一次会议第00374号&#xff08;文体宣传类020号&#xff09;提案答复的函》中指出&#xff0c;2016年和2020年国务院发布的文件中均涉及推动气膜场馆建设及完善装配式建筑相关政策。下一步&…

Mysql | select语句导入csv后再导入excel表格

需求 从mysql数据库中导出数据到excel 解决方案 sql导出csv文件 sql SELECT col1,col2 FROM tab_01 WHERE col3 xxx INTO OUTFILE /tmp/result.csv FIELDS TERMINATED BY , ENCLOSED BY " LINES TERMINATED BY \n;csv文件导出excel文件 1、【数据】-【导入数据】 …

绕过防火墙过滤规则传输ICMP

ICMP和ICMPv6 ICMP和ICMPv6是Internet的主要协议。这些协议设计用于在数据包未到达目的地时进行连接测试和错误信令。接收ICMP消息让应用程序了解故障原因&#xff1a;数据包太大&#xff0c;没有可用路由等。 ICMP消息 出于不同的目的&#xff0c;ICMP [v6]消息由两个编码为…

仿冒、钓鱼、入侵……警惕邮件安全这些“坑”

为了保证用户对电子邮箱系统的安全使用&#xff0c;保证个人的隐私和财产的安全&#xff0c;我们呼吁每个人都要加强自己的网络安全意识&#xff0c;在对电子邮件进行处理的时候&#xff0c;要对钓鱼邮件进行认真的识别&#xff0c;同时还需要设定一个客户的密码来保证你的邮箱…

苹果手机怎么看海拔高度?快速掌握使用技巧

手机不仅能满足我们日常的通讯需求&#xff0c;还内置了许多实用的功能&#xff0c;其中包括查看海拔高度。无论是登山、徒步、骑行还是只是好奇地想要了解所在地的海拔高度&#xff0c;苹果手机都能够满足您的需求。苹果手机怎么看海拔高度&#xff1f;在本文中&#xff0c;我…

css3 笔记02

目录 01 过渡 02 rotate旋转 03 translate函数 04 真正的3D 05 动画 06 阴影 07 自定义字体库 08 自定义动画库 01 过渡 过渡属性的使用: transition-property:要过渡的css属性名 多个属性用逗号隔开 过渡所有属性就写all transition-duration: 过渡的持续时间 s秒 …

算法课程笔记——素数朴素判定埃氏筛法

算法课程笔记——素数朴素判定&埃氏筛法 sqrt返回浮点数&#xff0c;而且这样可防溢出 优化i*i会更快