unity开发抽奖系统

本文介绍了如何在Unity中创建一个可自定义奖品概率的抽奖转盘系统。通过使用两张图片、一个指针和一个圆形图片,作者详细讲解了从界面布局到代码实现的全过程,包括奖品预制体、UI布局、脚本逻辑(Slot.cs和DialRotate.cs)以及如何处理旋转和停止。用户可以通过K、L键修改奖品信息,空格键启动抽奖,鼠标右键随时停止转盘并获取奖品。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段时间工作比较空闲,想做个抽奖系统,发现网上的抽奖系统看不懂,然后自己做了一个可以随意定义奖品概率,不管什么时候停下来指针最终都会转到指定的奖品哪。。。

废话不多说,动手一步一步来。

这个抽奖系统就使用了两张图片,一个指针,一个圆形的图片。

然后做一个预制体,图片就是圆形图片,image type选择filled,fill amount控制这个图片的面积大小,同时也是该图片的概率,Text组件是该奖品的名称。

再接下来就做一下界面布局的工作

Bg就是那个灰色的图片,Rotate是个空物体,用来挂在脚本的(DialRotate.cs和Slot.cs),cloneParent也是个空物体,作为预制体的父物体,要注意的是cloneParent中心那个蓝色的圆圈要和Rotate的蓝色的圈的位置一致,界面布局工作完成。

接下来到代码了,Slot.cs脚本,一开始会实例化奖品,K键和L键可以随意修改奖品名称,概率(这里概率做了限制,需要使用的自己修改一下代码即可),空格键会随机抛出物品,并且开始旋转,鼠标右键是停止转动(想什么时候停下来都行,最后都会得到所抛出的物体)DialRotate.cs脚本用于处理旋转的。这两个脚本涉及到一些数学计算,慢慢理解即可。

以下是这个工程的脚本,需要的话直接复制黏贴即可使用

Slot.cs

 

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

public class Slot : MonoBehaviour {

    private DialRotate dialRotate;      
    /// <summary>
    /// 奖品数据
    /// </summary>
    private class GrifData
    { 
     /// <summary>
    /// 奖品的名称
    /// </summary>
        public string mText;
        /// <summary>
        /// 图片的Amount值
        /// </summary>
        public float point;
        /// <summary>
        /// 奖品停留在指针时父物体要旋转的角度
        /// </summary>
        public float angle;
        /// <summary>
        /// 该奖品对应UI面板上的名称
        /// </summary>
        public string mtran;
        /// <summary>
        /// 该奖品的ID
        /// </summary>
        public int gID;
    }
     /// <summary>
     /// 奖品的描述信息
     /// </summary>
    private class GrifInfo
    {
        public Text mText;
        public string msg;
    }

    private List<GrifInfo> mListSD = new List<GrifInfo>();
    /// <summary>
    /// 奖品的id和概率对应
    /// </summary>
    private Dictionary<int, float> mPoints = new Dictionary<int, float>();
    /// <summary>
    /// 用于储存奖品信息(顺序排列)(奖品的id,名称,所占的百分比)
    /// </summary>
    private List<GrifData> grigtData = new List<GrifData>();
    /// <summary>
    /// 这个也是用于储存奖品信息,不过是乱序排列(奖品的id,名称,所占的百分比)
    /// </summary>
    private List<GrifData> randomData = new List<GrifData>();
    /// <summary>
    /// 20种奖品的Transform,(最多20个不用的奖励)
    /// </summary>
    private List<Transform> mTransLs = new List<Transform>();

    private List<Color> mColors = new List<Color>();

    private Transform cloneParent;
    private GameObject clonePrefab;
    /// <summary>
    /// 抽奖停止时父物体转动的角度
    /// </summary>
    public float tarAngle;
    /// <summary>
    /// 该奖品对应UI面板上的名称
    /// </summary>
    public string tarName;
    public int giftID;
    /// <summary>
    /// 用于检验概率有没有为100%
    /// </summary>
    private List<float> checkProbability = new List<float>();

    private void Start()
    {
        cloneParent = transform.Find("cloneParent");
        clonePrefab = Resources.Load<GameObject>("Clone");
        dialRotate = GetComponent<DialRotate>();
        Init();
    }
    void Update()
    {
        #region 测试修改奖品,概率
        if (Input.GetKeyDown(KeyCode.K))
        {
    &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值