当前位置: 首页 > news >正文

【Unity】实现轮盘抽奖

简介

示例一:使用协程完成轮盘转动

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Lunpan : MonoBehaviour
{[Tooltip("轮盘节点")]public Transform Roulette;[Tooltip("轮盘旋转的圈数")]public int RotateNumber = 4;//[Tooltip("轮盘需要旋转的度数")]private float degrees = 0;[Tooltip("轮盘旋转初速度")]public int RotateSpeed = 500;//[Tooltip("当前轮盘旋转速度")]private float curRotateSpeed = 0;[Tooltip("减速度")]public float deceleration = 3;[Tooltip("最低速度")]public float minSpeed = 50;[Tooltip("轮盘剩余旋转多少时开始减速")]public float surRotate = 720;[Tooltip("轮盘中物体的数量")]public int All = 6;[Tooltip("旋转停止的位置")]public int selectedIndex = 1;[Tooltip("精准角度")]public Boolean enblePrecise = false;private void Start(){//每秒的帧率改为60(不是必要)Application.targetFrameRate = 60;}/// <summary>/// 开始转动/// </summary>public void StartRoulette(){this.curRotateSpeed = this.RotateSpeed;StartCoroutine(RotateRoulette());}IEnumerator RotateRoulette(){//存储每帧需要旋转的角度float curRotate = 0;//计算轮盘总需要旋转的角度this.degrees = this.RotateNumber * 360 - ((this.selectedIndex - 1) * 360) / this.All - (360 - this.Roulette.eulerAngles.z);while (this.degrees > 0){//计算此帧需要旋转的角度curRotate = Time.deltaTime * this.curRotateSpeed;//精准到指定角度if (this.enblePrecise && curRotate > this.degrees){if (this.curRotateSpeed >= this.minSpeed){//速度减半this.curRotateSpeed = this.minSpeed / 2;curRotate = Time.deltaTime * this.curRotateSpeed;if (curRotate > this.degrees){curRotate = this.degrees;}}else{curRotate = this.degrees;}}//减速if (this.curRotateSpeed > this.minSpeed && this.degrees < this.surRotate){this.curRotateSpeed -= deceleration;}//开始旋转this.Roulette.Rotate(Vector3.back * curRotate);this.degrees -= curRotate;yield return null;}yield return null;}}

示例二:不使用协程实现轮盘转动

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;public class LunpanController : MonoBehaviour
{[Tooltip("轮盘节点")]public Transform Roulette;[Tooltip("轮盘旋转的圈数")]public int RotateNumber = 4;//[Tooltip("轮盘需要旋转的度数")]private float degrees = 0;[Tooltip("轮盘旋转初速度")]public int RotateSpeed = 500;//[Tooltip("当前轮盘旋转速度")]private float curRotateSpeed = 0;[Tooltip("减速度")]public float deceleration = 3;[Tooltip("最低速度")]public float minSpeed = 50;[Tooltip("轮盘剩余旋转多少时开始减速")]public float surRotate = 720;[Tooltip("轮盘中物体的数量")]public int All = 6;[Tooltip("旋转停止的位置")]public int selectedIndex = 1;[Tooltip("精准角度")]public Boolean enblePrecise = false;//开启轮盘转动private Boolean enbleLunpan = false;private void Start(){//每秒的帧率改为60(不是必要)Application.targetFrameRate = 60;}private void Update(){if (this.enbleLunpan){//存储每帧需要旋转的角度float curRotate = 0;if (this.degrees > 0){//计算此帧需要旋转的角度curRotate = Time.deltaTime * this.curRotateSpeed;//精准到指定角度if (this.enblePrecise && curRotate > this.degrees){if (this.curRotateSpeed >= this.minSpeed){//速度减半this.curRotateSpeed = this.minSpeed / 2;curRotate = Time.deltaTime * this.curRotateSpeed;if (curRotate > this.degrees){curRotate = this.degrees;}}else{curRotate = this.degrees;}}//减速if (this.curRotateSpeed > this.minSpeed && this.degrees < this.surRotate){this.curRotateSpeed -= deceleration;}//开始旋转this.Roulette.Rotate(Vector3.back * curRotate);this.degrees -= curRotate;if(this.degrees <= 0){this.enbleLunpan = false;}}}}/// <summary>/// 开始转动/// </summary>public void StartRoulette(){this.curRotateSpeed = this.RotateSpeed;//计算轮盘总需要旋转的角度this.degrees = this.RotateNumber * 360 - ((this.selectedIndex - 1) * 360) / this.All - (360 - this.Roulette.eulerAngles.z);this.enbleLunpan = true;}}

演示效果:

Unity实现轮盘抽奖

相关文章:

  • 【数据结构】二叉树运用及相关例题
  • 计算机网络基础知识(持续更新中)
  • RestTemplate使用详解
  • 二叉树的顺序实现-堆
  • SwiftUI 5.0(iOS 17)进一步定制 TipKit 外观让撸码如虎添翼
  • Android UI控件详细解析(四)
  • 【新能源大巴BMS结构与乘用车的区别】
  • 每日一题——Python实现PAT甲级1041 Be Unique(举一反三+思想解读+逐步优化)
  • java使用资源过高排查
  • 解析Java中1000个常用类:Cloneable类,你学会了吗?
  • linux-gpio
  • 【代码随想录算法训练营第37期 day21 | LeetCode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先】
  • Java集合【超详细】
  • 实战经验分享之移动云快速部署Stable Diffusion SDXL 1.0
  • K8S中Prometheus+Grafana监控
  • JS 中的深拷贝与浅拷贝
  • 分享一款快速APP功能测试工具
  • (三)从jvm层面了解线程的启动和停止
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • ES6--对象的扩展
  • IndexedDB
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • MySQL几个简单SQL的优化
  • Python语法速览与机器学习开发环境搭建
  • Unix命令
  • Vue 2.3、2.4 知识点小结
  • Vue UI框架库开发介绍
  • 从零搭建Koa2 Server
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深入 Nginx 之配置篇
  • 使用putty远程连接linux
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 2017年360最后一道编程题
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Linux·i2c驱动架构​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​字​节​一​面​
  • #define与typedef区别
  • #include<初见C语言之指针(5)>
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (23)Linux的软硬连接
  • (C语言)二分查找 超详细
  • (Note)C++中的继承方式
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (六)DockerCompose安装与配置
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .chm格式文件如何阅读