⾃⼰制作⼀个《⼤转盘抽奖》⼩程序,顺便带你看看抽奖的⽔可以有多深
前⾔
今天给⼤家带来⼀个转盘抽奖的⼩项⽬
在游戏开发⽇常中,抽奖的需求可算是超级常见了
那今天就来做这个⼩项⽬,顺便了解⼀下抽奖⼀般都有什么内幕吧!
转盘抽奖⼩程序制作
⾸先来说⼀下转盘抽奖⼩程序的组成。
转盘抽奖主要是由两部分组成,⼀个是「转盘」,另⼀个是「指针」。
旋转的逻辑也有两种,「⼀个是指针不动,转盘旋转」;「另⼀个则是转盘不动,指针旋
转」。
不论是哪种情况,其实原理都是⼀样的,我们只需要把旋转的物体改成我们想要的那个即
可。
所以这⾥采⽤⼀个「指针固定,转盘旋转」的思路整起!
下⾯就来⼀步⼀步的介绍⼀下这个转盘抽奖⼩程序的制作过程吧!
第⼀步:打开UnityHub新建⼀个Unity⼯程
新建⼯程这⼀步就不做过多解释了,要做饭先买菜!
打开U n i t y H u b新建⼀个⼯程,U n i t y版本随意,然后等待⼯程加载完毕。
然后在A s s e t s下新建⼀个S c e n e场景和⼀个S c r i p t s脚本。
准备过程完毕,下⾯开始制作这个转盘抽奖的⼩项⽬!
第⼆步:搭建⼀个简单的转盘抽奖UI
既然是转盘抽奖,那么我们⾸先来搭建⼀个简单的抽奖U I画⾯!
来看⼀下我简单搭建的⼀个U I,有⼀个「转盘」和「指针」,和⼀个「开始抽奖」和「停
⽌抽奖」的按钮。
看起来很简陋没关系!我们先把架⼦搭建起来,然后后⾯可以素材⼀键换上即可!
只要把转盘抽奖的关键元素添加上即可,这⾥的关键元素就是指的「转盘」和「指针」
第三步:写转盘抽奖的脚本代码
既然是⼩项⽬,那⾃然代码是必不可少的⼀部分。
下⾯我们就来写⼀下这个转盘抽奖的脚本代码怎么写吧。
直接上代码:
u s i n g S y s te m.C o l l e c ti o n s;u s i n g S y s te m.C o l l e c ti o n s.Ge n e ri c;u s i n g U n i ty
E n g i n e;u s i n g U n i ty E n g i n e.U I;p u b l i c c l a s s z D e mo : Mo n o B e h a v i o u r{    /// <
s u mma ry>    ///转盘旋转的四种状
态    /// </s u mma ry>    p u b l i c e n u m R o l l S ta te    {        N o n e,        S p e e d U p,        S p e e d D o w n,        E n d    }    p u b l i c T ra n s fo rm R o l l P a n e l;//旋转的转
盘    p u b l i c B u tto n s ta rtB u tto n;//开始抽奖的按钮    R o l l S ta te c u rS ta te; //当
前转盘的状态    fl o a t a l l T i me = 0;//旋转时间总的时间              #re g i o n变
速段    fl o a t Ma x S p e e d = 1000;//最⼤速度    fl o a t fa c to r;//速度因
⼦    fl o a t a c c e l e ra te T i me = 1;//加速到最⼤速度的时间 ---暂定为
1    fl o a t s p e e d U p T i me = 3;//加速段的总时间    fl o a t b u ffe rS p e e d=1;//减
速    #e n d re g i o n    v o i d S ta rt()    {        s ta rtB u tto n.o n C l i c k.A d d L i s te n e r(S ta rt
T u rn W h e e l);    }    v o i d U p d a te()    {        i f (c u rS ta te == R o l l S ta te.N o n e)        {            re tu rn;        }        a l l T i me += T i me.d e l ta T i me;        //进⼊加速阶
段        i f (c u rS ta te == R o l l S ta te.S p e e d U p)        {            fa c to r = a l l T i me / a c c e l
e ra te T i me;            fa c to r = fa c to r > 1 ? 1 : fa c to r;            D e b u g.L o g("在
加速中:" + fa c to r);            //转动转
盘            R o l l P a n e l.R o ta te(n e w V e c to r3(0, 0, -小程序开发一键生成平台源码
1) * fa c to r * Ma x S p e e d * T i me.d e l ta T i me, S p a c e.S e l f);        }        //当旋
转时间⼤于等于了加速段的时间就开始进⾏减
速        i f (a l l T i me >= s p e e d U p T i me && c u rS ta te == R o l l S ta te.S p e e d U p)        {
b u ffe rS p e e d -
= T i me.d e l ta T i me;            b u ffe rS p e e d = b u ffe rS p e e d > 0 ? b u ffe rS p e e d : 0;
D e b u g.L o g("在减速
中:"+ b u ffe rS p e e d);            R o l l P a n e l.R o ta te(n e w V e c to r3(0, 0, -
1) * b u ffe rS p e e d * 500 * T i me.d e l ta T i me, S p a c e.S e l f);            i f (b u ffe rS p e e d
<= 0)            {                c u rS ta te = R o l l S ta te.S p e e d D o w n;            }        }        //减速完毕,转盘停⽌转
动        i f (c u rS ta te == R o l l S ta te.S p e e d D o w n)        {            D e b u g.L o g("转
盘停⽌
了!");            c u rS ta te = R o l l S ta te.N o n e;            b u ffe rS p e e d = 1;        }    }    /// < s u mma ry>    /// 开始旋转转
盘    /// </s u mma ry>    p u b l i c v o i d S ta rtT u rn W h e e l()    {        i f (c u rS ta te != R o l l
S ta te.N o n e)        {            re tu rn;        }        a l l T i me = 0;        c u rS ta te = R o l l S ta te. S p e e d U p;    }}
将脚本挂在场景中的C a n v a s上,然后将开始抽奖的B u t t o n赋值。
还有转盘的游戏对象也要拖到脚本中去,然后就可以运⾏程序看⼀下效果了!
效果演⽰如下:
上⾯这个脚本代码已经可以对转盘进⾏转动了。
但是他只是随机进⾏⼀个转动,我们并不能控制它的旋转⾓度。
也就是说在转盘的各个⾓度的概率都是相同的。
但是这咋⾏呢!这也太公平了,⼤奖岂不是都要被别⼈拿⾛了!
所以请看下⼀步改进代码,增加抽奖概率!
第四步:改进抽奖机制,增加可控抽奖概率
我们对脚本代码进⾏改进,必须增加⼀个任务控制的概率才可以!
顺便⼀个转盘的素材给他换上,只需要更改转盘和指针即可!
改进后的脚本代码:
u s i n g S y s te m.C o l l e c ti o n s;u s i n g S y s te m.C o l l e c ti o n s.Ge n e ri c;u s i n g U n i ty
E n g i n e;u s i n g U n i ty E n g i n e.U I;p u b l i c c l a s s N e w L u c k y R o l l : Mo n o B e h a v i o u
r{    /// <s u mma ry>    /// 转盘旋转的四种状
态    /// </s u mma ry>    p u b l i c e n u m R o l l S ta te    {        N o n e,        S p e e d U p,        S
p e e d D o w n,        E n d    }    p u b l i c Ga me Ob j e c t R e s u l tU I;    p u b l i c T e x t re s u l tT
x t;    p u b l i c T ra n s fo rm R o l l P a n e l;//旋转的转
盘    p u b l i c B u tto n s ta rtB tn;    R o l l S ta te c u rS ta te; //当前转盘的状
态    i n t ro l l ID;//旋转结果ID--此案例的转盘分为6份    fl o a t a l l T i me = 0;//旋转
时间总的时间    fl o a t e n d A n g l e;//最终的⾓度    #re g i o n变速
段    fl o a t Ma x S p e e d = 1500;//最⼤速度    fl o a t fa c to r;//速度因
⼦    fl o a t a c c e l e ra te T i me = 1;//加速到最⼤速度的时间 ---暂定为
1    fl o a t s p e e d U p T i me = 3;//加速段的总时间    fl o a t te mp A n g l e;//开始减速
段时转盘此时的旋转⾓度    fl o a t k = 2f; //减速阶段的速度系数 --减速快慢由此决
定    #e n d re g i o n    v o i d S ta rt()    {        ro l l ID = 0;        R e s u l tU I.S e tA c ti v e(fa l s e );        s ta rtB tn.o n C l i c k.A d d L i s te n e r(S ta rtT u rn W h e e l);    }    v o i d U p d a te()    {
i f (c u rS ta te == R o l l S ta te.N o n e)        {            re tu rn;        }        a l l T i me += T i m e.d e l ta T i me;        //先进⼊加速阶
段        i f (c u rS ta te == R o l l S ta te.S p e e d U p)        {            fa c to r = a l l T i me / a c c e l
e ra te T i me;            fa c to r = fa c to r > 1 ? 1 : fa c to r;            R o l l P a n e l.R o ta te(n e w
V e c to r3(0, 0, -
1) * fa c to r * Ma x S p e e d * T i me.d e l ta T i me, S p a c e.S e l f);        }        //当旋
转时间⼤于等于了加速段的时间就开始进⾏减
速        i f (a l l T i me >= s p e e d U p T i me && c u rS ta te == R o l l S ta te.S p e e d U p)        {
c u rS ta te = R o l l S ta te.S p e e
d D o w n;            t
e mp A n g l e = Ge tT e mp A n g l e(
);            D e b u g.L o g("te mp A n g l e:" + te mp A n g l e);        }        i f (c u rS ta te == R o l l
S ta te.S p e e d D o w n)        {            //通过差值运算实现旋转到指定⾓度(球型插
值⽆法实现⼤于360°的计
算)            te mp A n g l e = Ma th f.L e rp(te mp A n g l e, e n d A n g l e, T i me.d e l ta T i me
* k);            R o l l P a n ta ti o n = Qu a te rn i o n.E u l e r(0, 0, te mp A n g l e);            //R
o l l P a n e l.e u l e rA n g l e s = n e w V e c to r3(0, 0, te mp A n g l e);            //旋转结
束            i f (Ma th f.A b s(te mp A n g l e - e n d A n g l e) <= 1)            {                c u rS ta te =
R o l l S ta te.N o n e;                R e s u l tU I.S e tA c ti v e(tru e);            }        }    }    /// <s u mm
a ry>    /// 开始旋转转
盘    /// </s u mma ry>    p u b l i c v o i d S ta rtT u rn W h e e l()    {        R e s u l tU I.S e tA c ti v
e(fa l s e);        i f (c u rS ta te != R o l l S ta te.N o n e)        {            re tu rn;        }        a l l T i m
e = 0;        te mp A n g l e = 0;        ro l l ID = Ge tR a n d o mID();        D e b u g.L o g("ro l l ID
: " + ro l l ID);        e n d A n g l e = (-
1) * ro l l ID * 55;        c u rS ta te = R o l l S ta te.S p e e d U p;    }    /// <s u mma ry>    /// 得
到当前转盘的旋转⾓度    /// </s u mma ry>    /// <re tu rn s>
</re tu rn s>    p ri v a te fl o a t Ge tT e mp A n g l e()    {        D e b u g.L o g("R o l l P a n e l.e u
l e rA n g l e s.z: " + R o l l P a n e l.e u l e rA n g l e s.z);        re tu rn (360 - R o l l P a n e l.e u l e
rA n g l e s.z) % 360;    }    //(0,60)(60,120)(120,180)(180,210)(210,270)
(270,360)    //获取旋转的结果,通过设定的概率然后随机得到结果,我们可以⾃定
义概率    p ri v a te i n t Ge tR a n d o mID()    {        //转盘倒着数,因为顺时针旋
转,旋转⾓度为负
数        i n t i d = 0;        i n t a = R a n d o m.R a n g e(0, 100);        i f (a <= 1)//%1        {            i d = 6;            re s u l tT x t = "恭喜你获得1G流
量";        }        e l s e i f (1 < a && a <= 3)  //%2        {            i d = 5;            re s u l tT x t = "恭喜你获得500M流
量";        }        e l s e i f (3 < a && a <= 10)  //%7        {            i d = 4;            re s u l tT x t = "恭
喜你获得100M流
量";        }        e l s e i f (10 < a && a <= 30) // %20        {            i d = 10;            re s u l tT x t = "恭喜你获得50M流
量";        }        e l s e i f (30 < a && a <= 60) //%30        {            i d =9;            re s u l tT x t. te x t = "恭喜你获得30M流
量";        }        e l s e  //%40        {            i d = 8;            re s u l tT x t = "恭
喜你获得10M流量";        }        re tu rn i d;    }}
效果如下:
好咧,⼀个简单的抽奖旋转就写好了,换上⼀个简单的U I之后还是有模有样的!
代码增加了⼀个抽奖概率,在我们点击抽奖的那⼀刻,其实奖品就已经有结果了。
只不过是增加了⼀个转圈的过程耽误我们的时间罢了。
⽽且在抽奖的⾓度来说,每⼀个奖项的概率应该都是⼀样的,毕竟是六等分!
但是我们在代码中早已经加了⼀个概率,抽中最⼤奖项的概率只有1%
所以说我们有时候表⾯上看到的公平其实都是假象!
在背地⾥的概率早都已经写好了,就等着你⼊坑呢。
源码⼯程下载
这个转盘抽奖的⼩程序就算写完了,源码⼯程在这⾥,有需要的下载体验即可。
转盘抽奖⼩项⽬下载地址:
h t t p s://d o w n l o a d.c s d n.n e t/d o w n l o a d/z h a n g a y1998/68820401
总结
本篇⽂章制作了⼀个简单的《⼤转盘抽奖》⼩程序
只需要⼀个脚本就可以搞定了,是不是很简单⼜实⽤呢!
有了这个转盘抽奖的⼩项⽬,我们就可以在抽奖的时候进⾏使⽤了。
可以将U I换上我们⾃⼰的奖品,然后使⽤代码⾃定义抽奖概率。
这样⼀个简单的转盘⼩程序就完成了,抽奖概率还可以⾃⼰掌控。
那本篇⽂章就到这⾥结束了,喜欢的话记得点⼀波三连哦!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。