unity中实现 幸运转轮

孙广东  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,旋转轮盘,赌赌自己的运气(别作弊哦)。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值