这段时间工作比较空闲,想做个抽奖系统,发现网上的抽奖系统看不懂,然后自己做了一个可以随意定义奖品概率,不管什么时候停下来指针最终都会转到指定的奖品哪。
废话不多说,动手一步一步来。
这个抽奖系统就使用了两张图片,一个指针,一个圆形的图片。
然后做一个预制体、图片就是圆形图片、图像类型选择,填充量控制这个图片的面积大小,同时也是该图片的概率,文本组件是该奖品的名称。
再接下来就做一下界面布局的工作
Bg就是那个灰色的图片,旋转是个空物体,用来挂在脚本的(DialRotate.cs和Slot.cs), cloneParent也是个空物体,作为预制体的父物体,要注意的是cloneParent中心那个蓝色的圆圈要和旋转的蓝色的圈的位置一致,界面布局工作完成。
接下来到代码了,Slot.cs脚本,一开始会实例化奖品,K键和L键可以随意修改奖品名称,概率(这里概率做了限制,需要使用的自己修改一下代码即可),空格键会随机抛出物品,并且开始旋转,鼠标右键是停止转动(想什么时候停下来都行,最后都会得到所抛出的物体)DialRotate.cs脚本用于处理旋转的。这两个脚本涉及到一些数学计算,慢慢理解即可。
以下是这个工程的脚本,需要的话直接复制黏贴即可使用
Slot.cs
使用System.Collections.Generic; 使用UnityEngine; 使用UnityEngine.UI; 公共类槽:MonoBehaviour { 私人DialRotate DialRotate;///& lt; summary>///奖品数据///& lt;/summary> 私有类GrifData {///& lt; summary>///奖品的名称///& lt;/summary> 公共字符串多行文字;///& lt; summary>///图片的数量值///& lt;/summary> 公共浮动点;///& lt; summary>///奖品停留在指针时父物体要旋转的角度///& lt;/summary> 公共浮动角;///& lt; summary>///该奖品对应的UI面板上的名称///& lt;/summary> 公共字符串mtran;///& lt; summary>///该奖品的ID///& lt;/summary> 公共int gID; }///& lt; summary>///奖品的描述信息///& lt;/summary> 私有类GrifInfo { 公共文本多行文字; 公共字符串味精; } 私人ListmListSD=new List ();///& lt; summary>///奖品的id和概率对应///& lt;/summary> 私人Dictionary mPoints=new Dictionary ();///& lt; summary>///用于储存奖品信息(顺序排列)(奖品的id,名称,所占的百分比)///& lt;/summary> 私人List grigtData=https://www.yisu.com/zixun/new列表 ();>///<总结///这个也是用于储存奖品信息,不过是乱序排列(奖品的id,名称,所占的百分比)>///总结 私人列表 randomData=new ();>///<总结///20种奖品的变换,(最多20个不用的奖励)>///总结 私人列表<变换> mTransLs=new <变换> (); 私人列表<色调> mColors=new <颜色> (); 私人变换cloneParent; 私人GameObject clonePrefab;>///<总结///抽奖停止时父物体转动的角度>///总结 公共tarAngle浮动;>///<总结///该奖品对应的UI面板上的名称>///总结 公共字符串tarName; 公共int giftID;>///<总结///用于检验概率有没有为100%>///总结 私人列表<飘> checkProbability=new <飘> (); 私人空间Start () { cloneParent=transform.Find (“cloneParent”); clonePrefab=Resources.Load (“克隆”); dialRotate=GetComponent (); Init (); } 无效的更新() { #地区测试修改奖品,概率 如果(Input.GetKeyDown (KeyCode.K)) { ClearData (); 如果(checkProbability。数比;0) { checkProbability.Clear (); } 如果(mPoints。数比;0) { mPoints.Clear (); } AddData (“111”, 0.3 f, 1); AddData (“222”, 0.1 f, 2); AddData (“333”, 0.2 f, 4); AddData (“444”, 0.05 f, 5); AddData (“555”, 0.15 f, 6); AddData (“666”, 0.2 f, 7); SetPriceRange (); } 如果(Input.GetKeyDown (KeyCode.J)) { ClearData (); 如果(checkProbability。数比;0) { checkProbability.Clear (); } 如果(mPoints。数比;0) { mPoints.Clear (); } AddData(“薯条”,0.3度,1); AddData(“汉堡”,0.1度,2); AddData(“炸鸡”,0.2度,4); AddData(“啤酒”,0.05度,5); AddData(“可乐”,0.15度,6); AddData(“烤的肉”,0.2度,7); SetPriceRange (); } # endregion 如果(Input.GetKeyDown (KeyCode.Space)) { StartRotate (); } } 私人空间Init () { for (int i=0;我& lt;20;我+ +) { GameObject GameObject=去实例化(clonePrefab); go.transform.SetParent (cloneParent); go.transform。localScale=Vector3.one; go.transform。localPosition=Vector3.zero; go.name=" + i; mTransLs.Add (go.transform); } foreach (mTransLs变换tr) { tr.GetComponent 团结实现简单抽奖系统