孙广东 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的官方参考文档
至此,完成场景的设置。效果如下图所示:
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 rotation
float 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,旋转轮盘,赌赌自己的运气(别作弊哦)。