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/657370.html

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

相关文章

AI赋能数字人:打造与语音节奏完美匹配的高质量手势动画

在数字化时代,人机交互正以前所未有的速度进化,而AI数字人的发展正是这一进程中的重要里程碑。近期,一项旨在根据语音内容自动生成匹配手势的技术方案引起了广泛关注,该技术不仅增强了数字人的表现力,也为远程沟通、教育、娱乐等多个领域带来了革新性的应用潜力。本文将深…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代&#xff0c;人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天&#xff0c;AI写作软件的出现&#xff0c;让很多自媒体创作者都会想到在手机上面进内容创作&#xff0c;这样不仅能提高工作效率&#xff0c;而且工作的自由度会更高…

APM2.8如何做加速度校准

加速度的校准建议准备一个六面平整&#xff0c;边角整齐的方形硬纸盒或者塑料盒&#xff0c;如下图所示&#xff0c;我们将以它作为APM校准时的水平垂直姿态参考&#xff0c;另外当然还需要一块水平的桌面或者地面 首先用双面泡沫胶或者螺丝将APM主板正面向上固定于方形盒子上&…

农产品产品防伪防窜货+二维码防伪+溯源系统源码全平台一物一码数字化防伪防窜货和溯源查询系统

农产品产品防伪防防窜货二维码防伪溯源系统源码全平台一物一码数字化防伪防窜货和溯源查询系统 产品防伪防防窜货二维码防伪溯源系统源码&#xff0c;该系统采用最简单易用的phpMySQL进行搭建&#xff0c;拥有完善的网站前后台&#xff0c;通过对每件产品生产线上的单品、二级…

【数据结构与算法 经典例题】返回单链表的倒数第 k 个节点

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录 一、问题描述 二、解题思路 方法一:计数器方式 方法…

leetCode.84. 柱状图中最大的矩形

leetCode.84. 柱状图中最大的矩形 题目思路 代码 class Solution { public:int largestRectangleArea( vector<int>& h ) {int n h.size();vector<int> left( n ), right( n );stack<int> st;// 求每个矩形的第一个小于左边界的矩形 - 用单调栈for ( …

Java基础:面向对象(二)

Java基础&#xff1a;面向对象&#xff08;二&#xff09; 文章目录 Java基础&#xff1a;面向对象&#xff08;二&#xff09;1. 面向对象编程思想2. 类与对象2.1 类2.1.1 类的定义2.1.2 成员变量2.1.3 局部变量 2.2 对象2.2.1 对象的定义2.2.2 对象的使用2.2.3 对象创建的原理…

gmssl vs2010编译

1、虚拟机win10 x64&#xff0c;离线安装vs2010和2010sp1补丁&#xff1b; 2、安装ActivePerl_v5.28.1.0000和nasm-2.16.03-installer-x64均是默认完整安装&#xff1b; nasm官网下载&#xff1a; Index of /pub/nasm/releasebuilds/2.16.03/win64https://www.nasm.us/pub/nas…

JavaScript基础(十)

上一篇学了各种数组方法&#xff0c;正好先做个练习回忆一下: 排序并去重 我随便写一组数&#xff0c;要求排好并去掉重复的: var arr [2,8,1,7,2,6,1,5,2,7,6,5]; for (var i0; i<arr.length; i){ for (var ji1; j<arr.length; j){ if(arr[i]arr[j]){ arr.splice(j,1)…

七个很酷的GenAI LLM技术性面试问题

不同于互联网上随处可见的传统问题库&#xff0c;这些问题需要跳出常规思维。 大语言模型(LLM)在数据科学、生成式人工智能(GenAI)和人工智能领域越来越重要。这些复杂的算法提升了人类的技能&#xff0c;并在诸多行业中推动了效率和创新性的提升&#xff0c;成为企业保持竞争…

PHP:phpmyadmin 将查询数据导出csv

1、输入你的SQL查询出结果 2、查出数据以后拖到最下方【导出】 3、导出CSV

搜维尔科技:拒绝毒品行为能力评估与训练系统应用案例

用户名称&#xff1a;山西医科大学 主要产品&#xff1a;虚拟现实复吸风险评估与干预系统 虚拟现实复吸风险评估与干预系统主要是为了解决物质使用障碍患者在临床治疗及康复回归正常生活出现的高复发现象⸺对毒品失控的渴求难以预测控制的问题。 整套系统由软件和硬件两部分…

RK3568平台(camera篇)V4L2查询获取设置设备

一.查询设备能力VIDIOC_QUERYCAP struct v4l2_capability cap; ioctl(fd, VIDIOC_QUERYCAP, &cap) struct v4l2_capability 结构体描述了视频采集设备的 driver 信息。 struct v4l2_capability { __u8 driver[16]; // 驱动名字 __u8 card[32]; // 设备名字 __u8 bus_inf…

基础技术-ELF系列2-ELF文件进阶与libelf库

成就更好的自己 本篇是基础技术系列中ELF相关技术的第二篇&#xff0c;将会详细介绍一下ELF文件的结构。 没有看过之前的文章的朋友请重新开始&#xff0c;博主观点比较清奇&#xff0c;否则可能会有一些不太明白的地方&#xff1a; 基础技术-ELF系列(1)-ELF文件基础-CSDN博…

STM32Cube系列教程11:使用STM32 RNG硬件随机数模块生成彩票号码

文章目录 配置RNG模块编写代码获取生成的随机数运行测试 今天写段代码测试一下STM32U083RC的(RNG)硬件随机数模块 顺便写个小demo生成7位真随机数的彩票号码&#xff0c;帮助那些买彩票还有选择困难症的人群 (doge)(手动狗头)。 全部代码以上传到github&#xff1a;https://gi…

Java注释

Java注释有三种&#xff1a; ①单行注释&#xff1a;// 注释内容 ②多行注释&#xff1a;/* 注释内容 */ ③文档注释&#xff1a;/** 注释内容(有要求) */ 文档注释内容必须为 Javadoc标签。 一行一个&#xff0c;以*开头&#xff0c;加标签和标签内容。 例如&#xff1a;…

【RocketMQ】安装RocketMQ5.2.0(单机版)

下载 官网下载地址&#xff1a;下载 | RocketMQ github地址&#xff1a;Tags apache/rocketmq GitHub 选择对应的版本下载。https://dist.apache.org/repos/dist/release/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip 5.2.0的二进制包&#xff1a;下载地址 5.2.0的…

Dolphinscheduler不重启加载Oracle驱动

转载自刘茫茫看山 问题背景 某天我们的租户反馈数据库连接缺少必要的驱动&#xff0c;我们通过日志查看确实是缺少部分数据库的驱动&#xff0c;因为DolphinScheduler默认只带了Oracle和MySQL的驱动&#xff0c;并且需要将pom文件中的test模式去掉才可以在打包的时候引入。我…

python mp3转mp4工具

成品UI 安装moviepy库 pip install moviepy 转换demo from moviepy.editor import *# 创建一个颜色剪辑&#xff0c;时长与音频相同 audioclip AudioFileClip(r"C:\Users\Administrator\PycharmProjects\pythonProject44\test4\赵照 - 灯塔守望人.mp3") videoclip…

基于FMEA保证汽车电控系统的可靠性

随着汽车技术的飞速发展&#xff0c;电控系统已成为现代汽车的“大脑”&#xff0c;掌控着车辆的方方面面。然而&#xff0c;这一复杂的系统也面临着诸多潜在失效风险&#xff0c;如何确保汽车电控系统的可靠性&#xff0c;成为汽车制造业亟待解决的问题。幸运的是&#xff0c;…