unity中实现 幸运转轮

来源:互联网 发布:差评师数据设置 编辑:程序博客网 时间:2024/04/29 22:17

孙广东  2016.7.10

http://blog.csdn.net/u010019717


 原文链接:http://www.theappguruz.com/blog/how-to-make-a-wheel-of-fortune-in-unity-the-easiest-way


项目源代码 地址:  http://download.csdn.net/detail/u010019717/9575524


目标         在本期博客中,我们谈一下怎样在游戏中实轮盘赌的选转轮/幸运轮。


假设您已经知道何谓幸运轮咯。


如果你喜欢玩CandyCrush游戏,你应该无数次旋转过那个DailyBooster Wheel了。


8 Ball Pool中的Spin & Win在游戏玩家之中也已经是耳熟能详了吧(really?)


要么你可能看过一些电视真人秀娱乐节目,人们旋转幸运轮来赢得奖励或者选择任务以赢取奖品的?


想在自己的游戏中来一个类似的幸运轮吗?


如果回答,是!那小主您就来对地方啦。


实现很简单,但你会发现有一两处颇具迷惑性,处理自然也需要些技巧哦。


表担心,我会用尽量简单的方法让你轻松学习。那么,开始吧…


 


1.   场景设置转轮:


  • 在场景视图中设置幸运轮,确保幸运轮的每个部分大小一致。
  • 在幸运轮边缘建立圆形的小碰撞器(需要建立另一个空的GameObjects来存放碰撞器)并将它们作为幸运轮的子游戏物体。
  • 保持层级视图整洁,建立一个空GameObject作为碰撞器们的父物体。


 

http://blog.csdn.net/u010019717

 


箭头:


  • 我就简单用黑色立方体来代表箭头,你可以按照自己的想法来。
  • 为箭头添加一个BoxCollider2D和一个HingeJoint2D组件。


 


 


如果以前没用过HingeJoint2D组件,它的工作方式就像门、窗的折叶、铰链一样。


想得到你期望的效果,得花点心思在铰链组件的属性设置上哦。


 


你也可以参看Unity的官方参考文档


  • https://docs.unity3d.com/Manual/class-HingeJoint.html


 


 


至此,完成场景的设置。效果如下图所示:



 http://blog.csdn.net/u010019717


1.   编码


这次我们只需要完成一个脚本文件即可(这是好事,对吧?)

using UnityEngine;using System.Collections;using System.Collections.Generic;public class SpinWheel : MonoBehaviour{public List<int> prize;public List<AnimationCurve> animationCurves;private bool spinning;private float anglePerItem;private int randomTime;private int itemNumber;void Start(){spinning = false;anglePerItem = 360/prize.Count;}void  Update (){if (Input.GetKeyDown (KeyCode.Space) && !spinning) {randomTime = Random.Range (1, 4);itemNumber = Random.Range (0, prize.Count);float maxAngle = 360 * randomTime + (itemNumber * anglePerItem);StartCoroutine (SpinTheWheel (5 * randomTime, maxAngle));}}IEnumerator SpinTheWheel (float time, float maxAngle){spinning = true;float timer = 0.0f;float startAngle = transform.eulerAngles.z;maxAngle = maxAngle - startAngle;int animationCurveNumber = Random.Range (0, animationCurves.Count);Debug.Log ("Animation Curve No. : " + animationCurveNumber);while (timer < time) {//to calculate rotationfloat angle = maxAngle * animationCurves [animationCurveNumber].Evaluate (timer / time) ;transform.eulerAngles = new Vector3 (0.0f, 0.0f, angle + startAngle);timer += Time.deltaTime;yield return 0;}transform.eulerAngles = new Vector3 (0.0f, 0.0f, maxAngle + startAngle);spinning = false;Debug.Log ("Prize: " + prize [itemNumber]);//use prize[itemNumnber] as per requirement}}

注意


         开始讲解代码前,你可以将代码与你的幸运轮GameObject关联,运行查看下游戏的效果,这样讲解起来更容易理解一些。


               从代码中可以看出,我使用Animation Curves来控制轮子转动,你可以设置         不同的曲线类型以实现不同的转轮运动效果。


动画曲线如下所示:



 


为了访问曲线,在检视器inspector窗口中点击Curve



 


另外,不要忘记为奖励列表设置合适的大小。现在看下Update()方法:


  • 包括2个随机数和一个协程SpeenTheWheel()
  • itemNumber设置在转轮停止转动时在指针下的项
  • maxAngle(或者finalAngle)表示幸运轮在结束前最终旋转的角度


 


 


【是的!在幸运轮转动前我们就知道结果啦,但是表担心,玩玩家就可以啦,原谅偶的翻译吧。】


现在看看协程SpinTheWheel():


  • 在第一个timer处,初始化startAngle 和maxAngle
  • 之后随机选择一个幸运轮旋转的动画曲线


 


 


其中的While循环:


  • 内循环计算幸运轮z轴方向上的旋转角度。
  • 此处动画曲线的Evaluate()函数返回了给定时间下曲线上的值。


 


 


至此,幸运轮旋转的实现逻辑解释结束。


 


现在,可以随意最后落在itemNumber的(我们一开始就知道的结果;)奖励。


现在,你也了解了为嘛永远也不要期待所谓的“大奖”或“头注”了吧!!


现在可以点击Play,旋转轮盘,赌赌自己的运气(别作弊哦)。




1 0
原创粉丝点击