
- 📢前言
- 🎬轉盤抽獎小程式制作
- 🏳??🌈第一步:打開UnityHub新建一個Unity工程
- 🏳??🌈第二步:搭建一個簡單的轉盤抽獎UI
- 🏳??🌈第三步:寫轉盤抽獎的腳本代碼
- 🏳??🌈第四步:改進抽獎機制,增加可控抽獎概率
- 🎁原始碼工程下載
- 👥總結
- 🚀往期優質文章分享
- 【游戲開發愛好者社區】活動進行中,每周打卡送書籍等禮品,期待你的加入

📢前言
-
今天給大家帶來一個
轉盤抽獎的小專案 -
在游戲開發日常中,抽獎的需求可算是超級常見了
-
那今天就來做這個小專案,順便了解一下抽獎一般都有什么內幕吧!
🎬轉盤抽獎小程式制作
首先來說一下轉盤抽獎小程式的組成,
轉盤抽獎 主要是由兩部分組成,一個是轉盤,另一個是指標,
旋轉的邏輯也有兩種,一個是指標不動,轉盤旋轉;另一個則是轉盤不動,指標旋轉,
不論是哪種情況,其實原理都是一樣的,我們只需要把旋轉的物體改成我們想要的那個即可,
所以這里采用一個 指標固定,轉盤旋轉 的思路整起!
下面就來一步一步的介紹一下這個轉盤抽獎小程式的制作程序吧!
🏳??🌈第一步:打開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 從0到1的 系統學習 路線【全面總結-建議收藏】!
- 🧡花一天時間做一個高質量飛機大戰游戲,過萬字Unity完整教程!漂亮學妹看了直呼666!
- 💛通宵一晚做出來的一款類似CS的第一人稱射擊游戲Demo!原來做游戲也不是很難
- 💚重回童年的經典系列??|【貪吃蛇小游戲】近兩萬字完整制作程序+決議+原始碼 【建議收藏學習】
- 🤍重回童年的經典系列??| 【皇室戰爭 】 的 即時戰斗類 復刻游戲Demo!兩萬多字游戲制作程序+決議!
- 💙重回童年的經典系列??| 【橫版街機格斗游戲】類似“恐龍快打” 該如何制作? | 一起來學習 順便送原始碼【建議收藏學習】
- 💜重回童年的經典系列??|【炸彈人小游戲】制作程序+決議 | 收藏起來跟曾經的小伙伴一起夢回童年!
| 🚀 優質專欄分享 🚀 |
- 🎄如果感覺文章看完了不過癮,可以來我的其他 專欄 看一下哦~
- 🎄比如以下幾個專欄:Unity基礎知識學習專欄、Unity游戲制作專欄、Unity實戰類專案 和 演算法學習專欄
- 🎄可以學習更多的關于Unity引擎的相關內容哦!直接點擊下面顏色字體就可以跳轉啦!
【游戲開發愛好者社區】活動進行中,每周打卡送書籍等禮品,期待你的加入
| 🚀 社區活動,重磅來襲 🚀 |
【游戲開發愛好者社區】在本周重磅新推出【每日打卡】活動
🎁 新玩法,獎勵升級!游戲開發愛好者社區: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模板和各種游戲原始碼素材等等資料,更多內容可自行查看哦!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/392268.html
標籤:其他
