Unity制作随机数字抽奖小案例
1. 搭建 UI 界面
- Panel
- Main(橙色背景图)
- Numbers (空对象,用来存储抽奖格子)
- 想要几位数的抽奖格子就创建几个Image,Image子对象只有Text,用来显示数字
- Button (Luck Draw 按钮, 这是开始抽奖的按钮)
- CountDown (倒计时文本)
- Res (抽奖结果文本)
- Numbers (空对象,用来存储抽奖格子)
- Main(橙色背景图)
2. 实现思路
2-1. 创建 RandomNumber 类 [挂载在每个抽奖格子(Numbers下面的Image)]
思路:
- 让每一个抽奖格子都加上这个脚本,每个格子都有自己的随机数。
- 声明一个 num 来接收随机数。
- 由于会用协程来每帧调用, 所以封装成一个方法方便调用。
- 方法内部:
a. 生成随机数
b.更改 Text 文本
- 方法内部:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class RandomNumber : MonoBehaviour
{
[HideInInspector]
public int num = 0;
[HideInInspector]
public Text currentText;
private void Awake()
{
currentText = GetComponent<Text>();
}
// 获取随机数并返回
public int GetRandomNumber()
{
num = Random.Range(0, 10);
currentText.text = num.ToString();
return num;
}
}
2-2. 创建 StartLuckDraw 类 (挂载在Main游戏对象)
思路:
- 获取全部带有 RandomNumber 的组件脚本。
- 开启协程用while(true)循环调用 yield return null 来达成Update的效果,每帧调用脚本里面的 GetRandomNumber 方法获取随机数。
- 创建一个字符串变量(str), 用for循环将每一个 随机数 添加到 字符串 里面。
- 最后结果用两个for循环生成大奖的结果来跟 str 对比, 结果一样就中大奖。
public class StartLuckDraw : MonoBehaviour
{
[Header("抽奖的时间间隔")]
public float interval = 5f;
// 计时器
private float timer;
// 随机数脚本的父对象
private Transform numbers;
// 所有的随机数脚本
private RandomNumber[] randomNumbers;
// 开始抽奖的按钮
private Button btn;
// 开始抽奖的按钮文本
private Text btnText;
// 倒计时文本
private Text countDown;
// 抽奖结果的文本
private Text res;
// 获取抽奖结果的字符串
private string str;
// 大奖字符串
private string resStr;
// 是否是停止抽奖状态(默认是停止状态)
private bool isStop = true;
private void Awake()
{
numbers = transform.Find("Numbers");
randomNumbers = new RandomNumber[numbers.childCount];
for (int i = 0; i < numbers.childCount; i++)
{
// 获取 Text 对象上的 RandomNumber 脚本
randomNumbers[i] = numbers.GetChild(i).GetChild(0).GetComponent<RandomNumber>();
}
// 开始抽奖按钮的获取和绑定事件
btn = transform.Find("Button").GetComponent<Button>();
btn.onClick.AddListener(OnClickEvent);
// 开始抽奖按钮的文本
btnText = btn.transform.GetChild(0).GetComponent<Text>();
// 倒计时文本
countDown = transform.Find("CountDown").GetComponent<Text>();
// 最终结果的文本
res = transform.Find("Res").GetComponent<Text>();
}
private void Start()
{
timer = interval;
}
private void OnClickEvent()
{
// 如果不在抽奖
if(isStop)
{
// 开启协程
StartCoroutine("LuckDraw");
// 更改文本内容
btnText.text = "Stop";
// 改变抽奖状态
isStop = false;
// 将计时器恢复到设置的时间间隔
timer = interval;
// 将文本恢复到默认状态
res.text = "抽奖结果: 0000";
}
// 在抽奖时
else
{
// 关闭协程
StopCoroutine("LuckDraw");
// 改变抽奖状态
isStop = true;
// 返回结果的展示
ResultShow();
}
}
// 抽奖协程
private IEnumerator LuckDraw()
{
while(true)
{
// 将随机数字放到字符串中
str = "";
for (int i = 0; i < numbers.childCount; i++)
{
str += randomNumbers[i].GetRandomNumber();
}
timer -= Time.deltaTime;
countDown.text = "倒计时: " + timer.ToString("0");
// 时间到了,跳出协程
if (timer < 0)
{
isStop = true;
timer = interval;
ResultShow();
// 跳出
yield break;
}
yield return null;
}
}
private void ResultShow()
{
// 最终结果的判定,4个相同的数字即为中大奖
btnText.text = "Luck Draw";
res.text = "抽奖结果: " + str;
for(int i = 0; i < 10; i++)
{
resStr = "";
for(int j = 0; j < numbers.childCount; j++)
{
resStr += i;
}
// 如果结果相同
if(str == resStr)
{
res.text = " 中大奖(数字相同) " + str;
}
}
}
}
2-3. 最后效果
3. 随意切换多位数的抽奖结果(想要多少位数的抽奖都行)
复制 Numbers 下的 Image 即可添加数字, 不需要更改代码。
这里是5位数,抽奖结果也会变成对应的5位数。
删除 Numbers下的 Image 即可减少数字, 不需要更改代码
这里是3位数,抽奖结果也会变成对应的3位数。