Unity制作随机数字抽奖小案例

1. 搭建 UI 界面

  • Panel
    • Main(橙色背景图)
      • Numbers (空对象,用来存储抽奖格子)
        • 想要几位数的抽奖格子就创建几个Image,Image子对象只有Text,用来显示数字
      • Button (Luck Draw 按钮, 这是开始抽奖的按钮)
      • CountDown (倒计时文本)
      • Res (抽奖结果文本)


在这里插入图片描述


2. 实现思路

2-1. 创建 RandomNumber 类 [挂载在每个抽奖格子(Numbers下面的Image)]

思路:

  1. 让每一个抽奖格子都加上这个脚本,每个格子都有自己的随机数。
  2. 声明一个 num 来接收随机数。
  3. 由于会用协程来每帧调用, 所以封装成一个方法方便调用。
    • 方法内部:
      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游戏对象)

思路:

  1. 获取全部带有 RandomNumber 的组件脚本。
  2. 开启协程用while(true)循环调用 yield return null 来达成Update的效果,每帧调用脚本里面的 GetRandomNumber 方法获取随机数。
  3. 创建一个字符串变量(str), 用for循环将每一个 随机数 添加到 字符串 里面。
  4. 最后结果用两个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位数。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/My_csdnQMDX/article/details/126385853