这段时间工作比较空闲,想做个抽奖系统,发现网上的抽奖系统看不懂,然后自己做了一个可以随意定义奖品概率,不管什么时候停下来指针最终都会转到指定的奖品哪。。。
废话不多说,动手一步一步来。
这个抽奖系统就使用了两张图片,一个指针,一个圆形的图片。
然后做一个预制体,图片就是圆形图片,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,名称