unity实现幸运大转盘(实战项目)

转盘抽奖模块在游戏日常开发中经常用到,本次就为大家分享一个实战项目中的转盘实现方式(本转盘为转盘动,中间指针不动,不过指针动也是和此demo大同小异。demo下载在文章末尾,欢迎大家下载使用)。
转盘示意图:
在这里插入图片描述
话不多说直接贴代码(所有的关键点在代码中都已经详细注释):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class NewLuckyRoll : MonoBehaviour {
    //此案例是指针不动,转盘动  --转盘的旋转过程是先加速然后加速时间到了后减速直到停止
    //注意:Unity里面角度是逆时针计算的,需要顺时针旋转就添加负号
    public enum RollState
    {
        None,
        SpeedUp,
        SpeedDown,
        End
    }
    public GameObject ResultUI;
    public Text resultTxt;
    public Transform RollPanel;//旋转的转盘
    RollState curState; //当前转盘的状态
    int rollID;//旋转结果ID--此案例的转盘分为6份

    float allTime = 0;//旋转时间  总的时间
    float endAngle;//最终的角度
    //--------------------加速段---------------------------------
    float MaxSpeed = 500;//最大速度
    float factor;//速度因子
    float accelerateTime = 1;//加速到最大速度的时间 ---暂定为1
    float speedUpTime = 3;//加速段的总时间
    
    //--------------------减速段---------------------------------
    float tempAngle;//开始减速段时转盘此时的旋转角度
    float k = 2f; //减速阶段的速度系数 --减速快慢由此决定 

    void Start ()
    {
        rollID = 0;
        ResultUI.SetActive(false);

    }
	
	void Update ()
    {
        if (curState == RollState.None)
        {
            return;
        }
        allTime += Time.deltaTime;
        //先进入加速阶段
        if (curState == RollState.SpeedUp)
        {          
            factor = allTime / accelerateTime;
            factor = factor > 1 ? 1 : factor;
            RollPanel.Rotate(new Vector3(0,0,-1) * factor * MaxSpeed * Time.deltaTime, Space.Self);
        }
        //当旋转时间大于等于了加速段的时间就开始进行减速
        if (allTime>=speedUpTime&&curState==RollState.SpeedUp)
        {
            curState = RollState.SpeedDown;
            tempAngle = GetTempAngle();
            Debug.Log("tempAngle:" + tempAngle);
        }
        if (curState==RollState.SpeedDown)
        {
            //通过差值运算实现旋转到指定角度(球型插值无法实现大于360°的计算)
            tempAngle = Mathf.Lerp(tempAngle, endAngle, Time.deltaTime * k);
            RollPanel.rotation = Quaternion.Euler(0, 0, tempAngle);
            //RollPanel.eulerAngles = new Vector3(0, 0, tempAngle);
            //旋转结束
            if (Mathf.Abs(tempAngle-endAngle)<=1)
            {
                curState = RollState.None;
                ResultUI.SetActive(true);
            }
        }
    }
    /// <summary>
    /// 开始旋转转盘
    /// </summary>
    public void StartTurnWheel()
    {
        if (curState!=RollState.None)
        {
            return;
        }
        allTime = 0;
        tempAngle = 0;
        rollID = GetRandomID();
        Debug.Log("rollID: " + rollID);
        endAngle = (-1)*rollID * 60;
        curState = RollState.SpeedUp;
    }
    /// <summary>
    /// 得到当前转盘的旋转角度
    /// </summary>
    /// <returns></returns>
    private float GetTempAngle()
    {     
        Debug.Log("RollPanel.eulerAngles.z: " + RollPanel.eulerAngles.z);
        return (360 - RollPanel.eulerAngles.z) % 360;
    }
    //获取旋转的结果(一般从后端获取) 这里就通过设定的概率然后随机得到结果
    private int GetRandomID()
    {
        //转盘倒着数,因为顺时针旋转,旋转角度为负数
        int id = 0;
        int a = Random.Range(0, 100); 
        if (a <= 1)//%1
        {
            id = 6;
            resultTxt.text = "恭喜你获得10000金币";
        }
        else if (1 < a && a <= 3)  //%2
        {
            id = 3;
            resultTxt.text = "恭喜你获得7000金币";
        }
        else if (3 < a && a <= 10)  //%7
        {
            id = 2;
            resultTxt.text = "恭喜你获得3800金币";
        }
        else if (10 < a && a <= 30) // %20
        {
            id = 4;
            resultTxt.text = "恭喜你获得2600金币";
        }
        else if (30 < a && a <= 60) //%30
        {
            id = 5;
            resultTxt.text = "恭喜你获得1200金币";
        }
        else   //%40
        {
            id = 1;
            resultTxt.text = "恭喜你获得500金币";
        }
        return id;
    }

    public void CloseResultUI()
    {
        RestRollPanel();
        ResultUI.SetActive(false);

    }
    void RestRollPanel()
    {
        RollPanel.rotation = new Quaternion(0,0,0,0);
        curState = RollState.None;
    }
}

其中转盘的旋转快慢和时间可以根据代码中的参数调整
demo下载:点击此处下载demo

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值