IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity实战篇 | 自己制作一个《大转盘抽奖》 小程序,顺便带你看看抽奖的水可以有多深 -> 正文阅读

[游戏开发]Unity实战篇 | 自己制作一个《大转盘抽奖》 小程序,顺便带你看看抽奖的水可以有多深

在这里插入图片描述

请添加图片描述


📢前言

  • 今天给大家带来一个 转盘抽奖 的小项目

  • 在游戏开发日常中,抽奖的需求可算是超级常见了

  • 那今天就来做这个小项目,顺便了解一下抽奖一般都有什么内幕吧!


🎬转盘抽奖小程序制作

首先来说一下转盘抽奖小程序的组成。

转盘抽奖 主要是由两部分组成,一个是转盘,另一个是指针

旋转的逻辑也有两种,一个是指针不动,转盘旋转另一个则是转盘不动,指针旋转

不论是哪种情况,其实原理都是一样的,我们只需要把旋转的物体改成我们想要的那个即可。

所以这里采用一个 指针固定,转盘旋转 的思路整起!

下面就来一步一步的介绍一下这个转盘抽奖小程序的制作过程吧!


🏳??🌈第一步:打开UnityHub新建一个Unity工程

新建工程这一步就不做过多解释了,要做饭先买菜!
在这里插入图片描述
打开UnityHub新建一个工程,Unity版本随意,然后等待工程加载完毕。
在这里插入图片描述
然后在Assets下新建一个Scene场景和一个Scripts脚本
在这里插入图片描述
准备过程完毕,下面开始制作这个转盘抽奖的小项目!


🏳??🌈第二步:搭建一个简单的转盘抽奖UI

既然是转盘抽奖,那么我们首先来搭建一个简单的抽奖UI画面!

来看一下我简单搭建的一个UI,有一个转盘指针,和一个开始抽奖停止抽奖的按钮。
在这里插入图片描述
看起来很简陋没关系!我们先把架子搭建起来,然后后面可以找素材一键换上即可!

只要把转盘抽奖的关键元素添加上即可,这里的关键元素就是指的 转盘指针


🏳??🌈第三步:写转盘抽奖的脚本代码

既然是小项目,那自然代码是必不可少的一部分。

下面我们就来写一下这个转盘抽奖的脚本代码怎么写吧。

直接上代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class zDemo : MonoBehaviour
{
    /// <summary>
    ///转盘旋转的四种状态
    /// </summary>
    public enum RollState
    {
        None,
        SpeedUp,
        SpeedDown,
        End
    }

    public Transform RollPanel;//旋转的转盘
    public Button startButton;//开始抽奖的按钮

    RollState curState; //当前转盘的状态


    float allTime = 0;//旋转时间  总的时间
           
    #region 变速段
    float MaxSpeed = 1000;//最大速度
    float factor;//速度因子
    float accelerateTime = 1;//加速到最大速度的时间 ---暂定为1
    float speedUpTime = 3;//加速段的总时间

    float bufferSpeed=1;//减速
    #endregion

    void Start()
    {
        startButton.onClick.AddListener(StartTurnWheel);
    }

    void Update()
    {
        if (curState == RollState.None)
        {
            return;
        }
        allTime += Time.deltaTime;

        //进入加速阶段
        if (curState == RollState.SpeedUp)
        {
            factor = allTime / accelerateTime;
            factor = factor > 1 ? 1 : factor;
            Debug.Log("在加速中:" + factor);
            //转动转盘
            RollPanel.Rotate(new Vector3(0, 0, -1) * factor * MaxSpeed * Time.deltaTime, Space.Self);
        }

        //当旋转时间大于等于了加速段的时间就开始进行减速
        if (allTime >= speedUpTime && curState == RollState.SpeedUp)
        {
            bufferSpeed -= Time.deltaTime;
            bufferSpeed = bufferSpeed > 0 ? bufferSpeed : 0;

            Debug.Log("在减速中:"+ bufferSpeed);
            RollPanel.Rotate(new Vector3(0, 0, -1) * bufferSpeed * 500 * Time.deltaTime, Space.Self);

            if (bufferSpeed <= 0)
            {
                curState = RollState.SpeedDown;
            }
        }
        //减速完毕,转盘停止转动
        if (curState == RollState.SpeedDown)
        {
            Debug.Log("转盘停止了!");
            curState = RollState.None;
            bufferSpeed = 1;
        }
    }

    /// <summary>
    /// 开始旋转转盘
    /// </summary>
    public void StartTurnWheel()
    {
        if (curState != RollState.None)
        {
            return;
        }
        allTime = 0;
        curState = RollState.SpeedUp;
    }
}

将脚本挂在场景中的Canvas上,然后将开始抽奖的Button赋值。

还有转盘的游戏对象也要拖到脚本中去,然后就可以运行程序看一下效果了!

效果演示如下:
请添加图片描述
上面这个脚本代码已经可以对转盘进行转动了。

但是他只是随机进行一个转动,我们并不能控制它的旋转角度。

也就是说在转盘的各个角度的概率都是相同的。

但是这咋行呢!这也太公平了,大奖岂不是都要被别人拿走了!

所以请看下一步改进代码,增加抽奖概率!


🏳??🌈第四步:改进抽奖机制,增加可控抽奖概率

我们对脚本代码进行改进,必须增加一个任务控制的概率才可以!

顺便找一个转盘的素材给他换上,只需要更改转盘和指针即可!

改进后的脚本代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NewLuckyRoll : MonoBehaviour
{
    /// <summary>
    /// 转盘旋转的四种状态
    /// </summary>
    public enum RollState
    {
        None,
        SpeedUp,
        SpeedDown,
        End
    }
    public GameObject ResultUI;
    public Text resultTxt;
    public Transform RollPanel;//旋转的转盘
    public Button startBtn;

    RollState curState; //当前转盘的状态
    int rollID;//旋转结果ID--此案例的转盘分为6份

    float allTime = 0;//旋转时间  总的时间
    float endAngle;//最终的角度


    #region 变速段
    float MaxSpeed = 1500;//最大速度
    float factor;//速度因子
    float accelerateTime = 1;//加速到最大速度的时间 ---暂定为1
    float speedUpTime = 3;//加速段的总时间

    float tempAngle;//开始减速段时转盘此时的旋转角度
    float k = 2f; //减速阶段的速度系数 --减速快慢由此决定 

    #endregion

    void Start()
    {
        rollID = 0;
        ResultUI.SetActive(false);
        startBtn.onClick.AddListener(StartTurnWheel);
    }

    void Update()
    {
        if (curState == RollState.None)
        {
            return;
        }
        allTime += Time.deltaTime;
        //先进入加速阶段
        if (curState == RollState.SpeedUp)
        {
            factor = allTime / accelerateTime;
            factor = factor > 1 ? 1 : factor;
            RollPanel.Rotate(new Vector3(0, 0, -1) * factor * MaxSpeed * Time.deltaTime, Space.Self);
        }
        //当旋转时间大于等于了加速段的时间就开始进行减速
        if (allTime >= speedUpTime && curState == RollState.SpeedUp)
        {
            curState = RollState.SpeedDown;
            tempAngle = GetTempAngle();
            Debug.Log("tempAngle:" + tempAngle);
        }
        if (curState == RollState.SpeedDown)
        {
            //通过差值运算实现旋转到指定角度(球型插值无法实现大于360°的计算)
            tempAngle = Mathf.Lerp(tempAngle, endAngle, Time.deltaTime * k);
            RollPanel.rotation = Quaternion.Euler(0, 0, tempAngle);
            //RollPanel.eulerAngles = new Vector3(0, 0, tempAngle);

            //旋转结束
            if (Mathf.Abs(tempAngle - endAngle) <= 1)
            {
                curState = RollState.None;
                ResultUI.SetActive(true);
            }
        }
    }
    /// <summary>
    /// 开始旋转转盘
    /// </summary>
    public void StartTurnWheel()
    {
        ResultUI.SetActive(false);
        if (curState != RollState.None)
        {
            return;
        }
        allTime = 0;
        tempAngle = 0;
        rollID = GetRandomID();
        Debug.Log("rollID: " + rollID);
        endAngle = (-1) * rollID * 55;
        curState = RollState.SpeedUp;
    }

    /// <summary>
    /// 得到当前转盘的旋转角度
    /// </summary>
    /// <returns></returns>
    private float GetTempAngle()
    {
        Debug.Log("RollPanel.eulerAngles.z: " + RollPanel.eulerAngles.z);
        return (360 - RollPanel.eulerAngles.z) % 360;
    }

    //(0,60)(60,120)(120,180)(180,210)(210,270)(270,360)
    //获取旋转的结果,通过设定的概率然后随机得到结果,我们可以自定义概率
    private int GetRandomID()
    {
        //转盘倒着数,因为顺时针旋转,旋转角度为负数
        int id = 0;
        int a = Random.Range(0, 100);
        if (a <= 1)//%1
        {
            id = 6;
            resultTxt.text = "恭喜你获得1G流量";
        }
        else if (1 < a && a <= 3)  //%2
        {
            id = 5;
            resultTxt.text = "恭喜你获得500M流量";
        }
        else if (3 < a && a <= 10)  //%7
        {
            id = 4;
            resultTxt.text = "恭喜你获得100M流量";
        }
        else if (10 < a && a <= 30) // %20
        {
            id = 10;
            resultTxt.text = "恭喜你获得50M流量";
        }
        else if (30 < a && a <= 60) //%30
        {
            id =9;
            resultTxt.text = "恭喜你获得30M流量";
        }
        else   //%40
        {
            id = 8;
            resultTxt.text = "恭喜你获得10M流量";
        }
        return id;
    }

}

效果如下:
请添加图片描述

好咧,一个简单的抽奖旋转就写好了,换上一个简单的UI之后还是有模有样的!

代码增加了一个抽奖概率,在我们点击抽奖的那一刻,其实奖品就已经有结果了。

只不过是增加了一个转圈的过程耽误我们的时间罢了。

而且在抽奖的角度来说,每一个奖项的概率应该都是一样的,毕竟是六等分!

但是我们在代码中早已经加了一个概率,抽中最大奖项的概率只有1%

所以说我们有时候表面上看到的公平其实都是假象

在背地里的概率早都已经写好了,就等着你入坑呢。


🎁源码工程下载

这个转盘抽奖的小程序就算写完了,源码工程在这里,有需要的下载体验即可。

转盘抽奖小项目下载地址:https://download.csdn.net/download/zhangay1998/68820401


👥总结

  • 本篇文章制作了一个简单的《大转盘抽奖》小程序
  • 只需要一个脚本就可以搞定了,是不是很简单又实用呢!
  • 有了这个转盘抽奖的小项目,我们就可以在抽奖的时候进行使用了。
  • 可以将UI换上我们自己的奖品,然后使用代码自定义抽奖概率。
  • 这样一个简单的转盘小程序就完成了,抽奖概率还可以自己掌控。
  • 那本篇文章就到这里结束了,喜欢的话记得点一波三连哦!

🚀往期优质文章分享


🚀 优质专栏分享 🚀
  • 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 🎄比如以下几个专栏:Unity基础知识学习专栏Unity游戏制作专栏Unity实战类项目 算法学习专栏
  • 🎄可以学习更多的关于Unity引擎的相关内容哦!直接点击下面颜色字体就可以跳转啦!
?? 游戏制作专栏 ??
🧡 Unity系统学习专栏 🧡
💛 Unity实战类项目 💛
💚 算法千题案例 💚
💙 Python零基础到入门 💙

【游戏开发爱好者社区】活动进行中,每周打卡送书籍等礼品,期待你的加入

🚀 社区活动,重磅来袭 🚀

【游戏开发爱好者社区】在本周重磅新推出【每日打卡】活动

🎁 新玩法,奖励升级!游戏开发爱好者社区:https://bbs.csdn.net/forums/unitygame

社区中心思想今天你学到了什么?

在社区你可以做些什么: 每日强化知识点,白嫖书籍礼品!

一个人可以走的很快,一群人才能走的更远!🔥爆C站的游戏开发爱好者社区欢迎您的加入!

本期送书如下:
在这里插入图片描述
《Unity 实战(第2版)》京东链接:https://item.jd.com/12498427.html

  • 介绍如何使用Unity编写游戏。有经验的程序员可以把它当成Unity的入门书籍。本书的目标十分明确:带领有一些编程经验但没有Unity经验的读者使用Unity开发游戏。
  • 讲授开发1好的方式是完成示例项目,学生通过制作示例来学习,这正是本书采用的方式。本书的各个主题展现为构建游戏示例的步骤,当浏览本书时,鼓励读者在Unity中构建这些游戏。每几章挑选不同的项目来讲解,而不是整本书只开发一个项目。其他有些书籍采用“一个完整项目”的方法讲解,不足之处是如果对前面的章节不感兴趣,就很难跳到中间的章节。
  • 《Unity 实战(第2版)》比大多数Unity书籍(特别是入门书籍)有更严格的编程内容。如果不知道如何编写计算机程序,1好先使用Codecademy之类的资源学习,在学会如何编写程序之后再回到本书。
  • 不要担心具体的编程语言,本书大量使用了C#,也可以使用其他语言的技能。本书的第Ⅰ部分会花时间介绍新的概念,会小心谨慎、一步一步地在Unity中开发第1款游戏,但剩下的章节将更快速地推进,让读者了解多个游戏类型。本书1后会描述部署到各种平台(如Web和移动平台),但本书的主旨不会提及1终的部署目标,因为Unity与平台无关。
  • 至于游戏开发的其他方面,广泛覆盖的美术学科会稀释本书涵盖的Unity知识,加大Unity外部软件(例如,所使用的动画软件)的比重。关于美术任务的讨论将仅限于Unity或所有游戏开发者都应该知道的方面。

《Python爬虫与反爬虫开发从入门到精通 》京东链接:https://item.jd.com/13345900.html

  • 学爬虫:知原理,抓数据,做分析,用自动化解放双手
  • 会反爬:懂框架,会部署,见招拆招,攻防兼备
  • 在攻与防的对立统一中寻求爬虫技术突破

更多白嫖活动详情:https://bbs.csdn.net/forums/unitygame?typeId=19603


在这里插入图片描述

温馨提示: 点击下面卡片可以获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!
请添加图片描述

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:33:05  更:2021-12-26 22:35:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 3:23:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码