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

news2024/11/19 13:26:21

一、演示效果

二、知识点讲解

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.coloradmin.cn/o/1710157.html

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

相关文章

探索Python的包与模块:构建项目的基石

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、模块与包的基础认知 1. 模块的定义与创建 2. 包的组织与管理 二、模块与包的进阶使用…

【分支控制(if-else判断)】单分支-双分支-多分支-嵌套分支

程序流程控制 在程序中, 程序运行的流程控制决定程序是如何执行的, 是我们必须掌握的, 主要有三大流程控制语句. 顺序控制 (简单)分支控制 (判断)循环控制 (循环) 一. 顺序控制 顺序控制介绍 程序从上到下逐行地执行, 中间没有任何判断和跳转. 顺序控制举例和注意事项 Java中…

AUS GLOBAL 与 UNICEF 联合国儿童基金会共同帮助叙利亚和土耳其地震受灾居民

2023年2月6日,土耳其东南部和叙利亚发生两次强烈地震和数十次余震,数以千计的儿童和家庭面临危机。 成千上万的房屋被毁,许多家庭被迫流离失所,而在一年中的这个时候,气温经常低于冰点,雪和冻雨很常见。许多学校、医院以及其他医疗和教育设施被地震破坏或摧毁,这对儿童造成了巨…

马斯克开启军备竞赛,xAI筹集60亿美元

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

蓝桥杯—SysTick中断精准定时实现闪烁灯

在嵌入式系统中&#xff0c;SysTick_Handler 是一个中断服务例程&#xff08;Interrupt Service Routine, ISR&#xff09;&#xff0c;用于处理 SysTick 定时器的中断。SysTick 定时器通常用于提供一个周期性的定时中断&#xff0c;可以用来实现延时或者周期性任务。 SysTick…

AWS联网和内容分发之Transit Gateway

将Amazon VPC、AWS账户和本地网络连接到一个网关中。AWS Transit Gateway通过中央枢纽连接Amazon虚拟私有云&#xff08;VPC&#xff09;和本地网络。此连接简化了您的网络&#xff0c;并且结束了复杂的对等关系。Transit Gateway充当高度可扩展的云路由器&#xff0c;每个新的…

HLS入门(Xilinx Vivado 2019.2)——点亮LED仿真

HLS入门——点亮LED仿真 一、HLS简介&#xff08;一&#xff09;什么是HLS&#xff1f;&#xff08;二&#xff09;HLS能做什么&#xff1f;&#xff08;三&#xff09;HLS的使用&#xff08;四&#xff09;HLS的优势&#xff08;五&#xff09;HLS与VHDL/Verilog编程技术的关系…

【机器学习】【深度学习】正则化(Regularization)

概念 正则化&#xff08;Regularization&#xff09;是在机器学习模型中避免过拟合的一种技术。它通过引入一个惩罚项&#xff08;即正则项&#xff09;来限制模型的复杂度&#xff0c;以此来提防模型过度依赖训练数据&#xff0c;捕获数据中的噪音信息而导致过拟合现象。简单…

企业营收分析难?搞定收入认领月底不加班!

在当今日益激烈的市场竞争中&#xff0c;企业的营收分析不仅是衡量经营成果的关键指标&#xff0c;更是指导企业未来发展的重要依据。然而&#xff0c;对于许多企业来说&#xff0c;营收分析的过程往往繁琐且耗时&#xff0c;尤其是月底结账时&#xff0c;大量的数据和复杂的计…

【机器学习300问】95、什么是KNN算法?它和K-means什么关系?

一、KNN算法的定义 KNN&#xff08;K-Nearest Neighbors&#xff09;算法&#xff0c;是一种简单而有效的监督学习方法。它既可以用在分类任务&#xff0c;也可用在回归任务中。KNN算法的核心思想&#xff1a;在特征空间中&#xff0c;如果有一个数据点周围的大多数邻居属于某个…

10. C++异步IO处理库和使用libevent实现高性能服务器

C比较有名的异步IO处理库 libevent 这个主要使用的是epoll。libevthplibuvlibev 我们主要介绍libevent。 libevent重要函数 event_base_new 这个可以对应于epoll_create也就是创建一个实例。还可以初始化libevent所有管理相关的代码。比如说所能用到的队列&#xff0c;栈&a…

OFDM 802.11a的FPGA实现:发射部分的最终实现

目录 1.摘要 2.最终实现的ModelSim仿真 3.Matlab仿真和MoselSim仿真进行对比 4.完整工程 1.摘要 本系统在Xilinx的zynq 7000系列FPGA芯片上实现了一个基于IEEE 802.11a协议的OFDM基带处理发射机的功能。本系统包含了整个发射机的所有功能&#xff0c;包括序列训练符号、Si…

现代信号处理11_Spectral Analysis谱分析(CSDN_20240526)

谱分析与傅里叶变换 对于一个信号&#xff0c;一方面可以从时域上对其进行分析&#xff0c;另一方面也可以从频域上对其进行认识&#xff0c;对信号进行频谱分析能够帮助我们了解能量在频域上的分布。 确定性信号的能量通常是有限的&#xff0c;而平稳随机信号的能量通常是无限…

No input file specified.(‘.user.ini’文件问题宝塔复制到本地,其他情况可跳过)

症状 病因 一般是宝塔直接copy到本地的情况。 宝塔面板中的.user.ini文件是一个重要的配置文件&#xff0c;它主要用于配置PHP运行环境和网站环境。以下是.user.ini文件的主要作用和操作建议&#xff1a; 防止跨目录访问和文件跨目录读取。这是.user.ini文件的主要作用之一&a…

kafka-消费者组-点对点测试

文章目录 1、点对点测试1.1、获取 kafka-consumer-groups.sh 的帮助信息1.2、列出所有的消费者组1.3、创建消费者1并指定组 my_group11.4、创建消费者2并指定组 my_group11.5、创建消费者3并指定组 my_group11.6、创建生产者发送消息到 my_topic1 主题1.6.1、发送第一条消息rom…

用循环神经网络预测股价

循环神经网络可以用来对时间序列进行预测&#xff0c;之前我们在介绍循环神经网络RNN,LSTM和GRU的时候都用到了正弦函数预测的例子&#xff0c;其实这个例子就是一个时间序列。而在众多的时间序列例子中&#xff0c;最普遍的就是股价的预测了&#xff0c;股价序列是一种很明显的…

【PG16】后 EL 7 时代,PG 16 如何在 CentOS 7 上运行

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ ★ 本文写于 2023-09-29 PostgreSQL 16 Released 9/14, PostgreSQL 16 正式发布。从发布公告^1 和 Release Notes^2 可以看到 PG16 包含了诸多新特性和增强改进。 性能提升&#xff0c;查询计划…

ssm超市管理系统java超市进销存管理系统jsp项目

文章目录 超市进销存管理系统一、项目演示二、项目介绍三、系统部分功能截图四、七千字项目文档五、部分代码展示六、底部获取项目源码和七千字项目文档&#xff08;9.9&#xffe5;带走&#xff09; 超市进销存管理系统 一、项目演示 超市进销存管理系统 二、项目介绍 角色分…

Dynadot API调整一览

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

算法设计第七周(应用哈夫曼算法解决文件归并问题)

一、【实验目的】 &#xff08;1&#xff09;进一步理解贪心法的设计思想 &#xff08;2&#xff09;掌握哈夫曼算法的具体应用 &#xff08;3&#xff09;比较不同的文件归并策略&#xff0c;探讨最优算法。 二、【实验内容】 设S{f1,…,fn}是一组不同的长度的有序文件构…