⾃⼰制作⼀个《⼤转盘抽奖》⼩程序,顺便带你看看抽奖的⽔可以有多深
前⾔
今天给⼤家带来⼀个转盘抽奖的⼩项⽬
在游戏开发⽇常中,抽奖的需求可算是超级常见了
那今天就来做这个⼩项⽬,顺便了解⼀下抽奖⼀般都有什么内幕吧!
转盘抽奖⼩程序制作
⾸先来说⼀下转盘抽奖⼩程序的组成。
转盘抽奖主要是由两部分组成,⼀个是「转盘」,另⼀个是「指针」。
旋转的逻辑也有两种,「⼀个是指针不动,转盘旋转」;「另⼀个则是转盘不动,指针旋
转」。
不论是哪种情况,其实原理都是⼀样的,我们只需要把旋转的物体改成我们想要的那个即
可。
所以这⾥采⽤⼀个「指针固定,转盘旋转」的思路整起!
下⾯就来⼀步⼀步的介绍⼀下这个转盘抽奖⼩程序的制作过程吧!
第⼀步:打开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小时内删除。
发表评论