之前在公司做过一次转盘抽奖,现在又要写了发觉忘了。。
留个博客记录下,也方便后来者查阅。
实现的效果图如下:
下面是代码片段:
using UnityEngine;
/// <summary>
/// 描述: 思路是这样的,先假旋转,旋转个指定的时间,然后到时间了就做真旋转,旋转到指定位置之后停止旋转
/// 日期: 2020/02/25
/// 作者: 华阳张学友
/// </summary>
public class RotationTest : MonoBehaviour
{
/** 当前节点 */
private Transform _rotateTrans;
/** 是否开始转动 */
private bool _isStartRotate = false;
/** 假旋转时的速度 */
private float _rotateSpeed = 2f;
/** 开始时间 */
private float _startTime = 0f;
/** 当前时间 */
private float _curTime = 0f;
/** 需要旋转到的目标位置 */
private Quaternion _targetAngels = Quaternion.identity;
/** 转动的速度 */
public float Speed = 100f;
/** 总共的旋转时间 秒 */
public float RotateTime = 5f;
/** 需要转动到的目标位置
* 这里需要注释下:
* 转盘有12个格子,360°,那么360/12=30 每个格子就是30°
* 这里设置成90就是第三个(看顺时针还是逆时针旋转)
*/
public float TargetPos = 90f;
void Start()
{
//获取幸运转盘指针父对象的Transform
_rotateTrans = GetComponent<Transform>();
}
void Update()
{
//按Y开始旋转
if (Input.GetKeyDown(KeyCode.Y))
{
//开始旋转
_isStartRotate = true;
//开始计时
_startTime = Time.deltaTime;
//设置目标位置
_targetAngels = Quaternion.Euler(0, 0, TargetPos);
}
if (_isStartRotate)
{
//计算旋转的时间
_curTime = _curTime + Time.deltaTime;
//间隔时间
float intervalTime = _curTime - _startTime;
//转动转盘(-1为顺时针, 1为逆时针)
_rotateTrans.Rotate(new Vector3(0, 0, -1) * Speed * Time.deltaTime);
//时间到了就旋转到目标位置,然后停止转动
if (intervalTime >= RotateTime)
{
_rotateTrans.rotation = Quaternion.RotateTowards(_rotateTrans.rotation, _targetAngels, _rotateSpeed * Time.deltaTime);
// 计算当前正在旋转的角度和目标角度的夹角
if (Quaternion.Angle(_rotateTrans.rotation, _targetAngels) < 1)
{
//设置目标夹角
_rotateTrans.rotation = _targetAngels;
//转动停止
_isStartRotate = false;
}
}
}
}
}
自己PS了一些的图片资源。