unity 转盘

设置pointer点对象,可以设置指针转动或者转盘转动,具体看代码
可以设置顺逆旋转

注意结构

数据的配置 自己可以选择自己的写法,这里因为比较简单就用scriptableobject弄一下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using XYX;public enum SpinState
{None,       //待机状态Start,      //加速阶段Prepared,   //等待数据阶段End,        //减速阶段
}/// <summary>
/// 转盘
/// </summary>
public class TurnTableView : UIBase
{[Tooltip("转动的东西")]public Transform pointer;//转动点public Animator arrowAnim;public Sprite advImg;public Sprite flower;Transform[] Spins;//对应的slots,需要提前制定数量Text spinNum;Image spinImg;protected override void Awake(){base.Awake();root =transform.Find("root") as RectTransform;Transform Spin = GetUIComponent<Image>("Spin").transform;Spins = new Transform[Spin.childCount];for (int i = 0; i < Spin.childCount; i++){Spins[i] = Spin.GetChild(i);Spin.GetChild(i).GetChild(1).GetComponent<Text>().text = GameManager.turnTable_SO.spinReward[i].num_Str;}spinNum = GetUIComponent<Text>("spinNum");spinImg = GetUIComponent<Image>("spinImg");CheckMySpinNumber();}//检查自己还能转多少void CheckMySpinNumber(){spinImg.sprite = advImg;if(GameDataManager.GetInstance().commonData.turnTabelData.rotateNum<=0){GetUIComponent<Image>("getSpinBtn").GetComponent<TweenEffects>().StopTween(true);spinImg.sprite = advImg;spinNum.text =  "+1";}else{GetUIComponent<Image>("getSpinBtn").GetComponent<TweenEffects>().StopTween(false);spinImg.sprite = flower;spinNum.text = GameDataManager.GetInstance().commonData.turnTabelData.rotateNum + "/"+ GameDataManager.GetInstance().commonData.turnTabelData.rotateNum;}spinImg.SetNativeSize();}public override void ShowView(){base.ShowView();_spinstate = SpinState.None;}protected override void OnClickBUt(string btnName){switch (btnName){case "closeBtn":if(_spinstate == SpinState.None)HideView();break;case "spinBtn":StartClickSpin();break;case "getSpinBtn":if (SdkManager.GetInstance().m_sdk_state != Mode_SDK_State.Adv) return;if (GameDataManager.GetInstance().commonData.turnTabelData.rotateNum <= 0){SdkManager.GetInstance().ShowRewardVideoAd(()=> {GameDataManager.GetInstance().commonData.turnTabelData.rotateNum += 1;GameDataManager.GetInstance().SaveData(XYX_Tag.COMMON);CheckMySpinNumber();});//TODO 直接看广告}break;}}//开始void StartClickSpin(){if (_spinstate == SpinState.None){if (GameDataManager.GetInstance().commonData.turnTabelData.rotateNum <= 0){UIManager.GetInstance().MessageBoxUI("次数用完了!");return;}_spinstate = SpinState.Start;arrowAnim.SetBool("show",true);UIManager.GetInstance().FlyTxT("-1",Color.red, spinNum.transform.position);StartCoroutine("RoateTimer");//必须停止的时间_time = 0;GameDataManager.GetInstance().commonData.turnTabelData.rotateNum--;if (GameDataManager.GetInstance().commonData.turnTabelData.rotateNum < 0)GameDataManager.GetInstance().commonData.turnTabelData.rotateNum = 0;GameDataManager.GetInstance().SaveData(XYX_Tag.COMMON);CheckMySpinNumber();print("今日抽将次数 " + GameDataManager.GetInstance().commonData.turnTabelData.rotateNum);}}public int testRewardIndex = 2;/// <summary>/// 停止转动的时间/// </summary>/// <returns></returns>IEnumerator RoateTimer(){yield return new WaitForSeconds(GameManager.turnTable_SO.timerStop);OnprobabilityStopArea(testRewardIndex);//test//   OnprobabilityStopArea();}// 根据几率来让指针停止到对应区域 可以写特殊关照void OnprobabilityStopArea(int specialValue = -1){if (specialValue < 0)EndAngle = GameManager.turnTable_SO.spinReward[ProbabilityChoose()].angle;else{spinRewardId = specialValue;EndAngle = GameManager.turnTable_SO.spinReward[specialValue].angle;//特殊关照的item}// print("奖励角度==========:"+ EndAngle);//    print("奖励角度==========:" + GameManager.turnTable_SO.spinReward[specialValue].angle);_spinstate = SpinState.Prepared;}int spinRewardId;//几率选择-返回奖励数组编号 int ProbabilityChoose(){//概率总精度为100float totalRank = 100;//float totalRank = 0;//for (int i = 0; i < GameManager.turnTable_SO.spinReward.Length; i++)//{//    totalRank += GameManager.turnTable_SO.spinReward[i].probability;//总概率=1;//}spinRewardId = 0;foreach (var item in GameManager.turnTable_SO.spinReward){//产生一个0到100之间的随机数float random = Random.Range(0, totalRank);//将该随机数和奖品的概率比较if (random <= item.probability){spinRewardId = item.id;Debug.Log(spinRewardId);//抽奖结果//为转盘指针随机生成旋转角度//    float angle = Random.Range(item.MinAngle, item.MaxAngle);//旋转转盘指针,此处略break;}else{totalRank -= item.probability;}}return spinRewardId;}private void Update(){RotateState();}private float _time;//时间统计private float _tmpAngle = 0f;//角度缓存private float _minTime = 3.0f; //减速前的最短持续时间private float _factor;private SpinState _spinstate;//转盘的状态属性void RotateState(){if (_spinstate == SpinState.None) return;_time += Time.deltaTime;if (_spinstate == SpinState.End){//通过差值运算实现精准地旋转到指定角度(球型插值无法实现大于360°的计算)float k = 2.5f;  //如果嫌减速太慢,可以加个系数修正一下_tmpAngle = Mathf.Lerp(_tmpAngle, EndAngle, Time.deltaTime * k);// Debug.Log(_tmpAngle+"=="+EndAngle);//这里只存在一个方向的旋转,所以不存在欧拉角万向节的问题,所以使用欧拉角和四元数直接赋值都是可以的// pointer.rotation = Quaternion.Euler(0, 0, _tmpAngle);//顺//  pointer.rotation = Quaternion.Euler(0, 0, -_tmpAngle);//逆pointer.rotation = Quaternion.Euler(0, 0, GameManager.turnTable_SO.rotateDirect * _tmpAngle);// print("减速阶段");if (1 >= Mathf.Abs(_tmpAngle - EndAngle)){GetReward();_spinstate = SpinState.None;}}else{_factor = _time / GameManager.turnTable_SO.AcceleateTime;   //加速速度因子_factor = _factor > 1 ? 1 : _factor;//最大为1//   pointer.Rotate(Vector3.forward, _factor * velocity * Time.deltaTime, Space.Self);//逆时针// pointer.Rotate(Vector3.back, _factor * velocity * Time.deltaTime, Space.Self);//顺时针pointer.Rotate(Vector3.back * GameManager.turnTable_SO.rotateDirect, _factor * GameManager.turnTable_SO.velocity * Time.deltaTime, Space.Self);}//当收到数据之后并且旋转了一定时间后开始减速if (_spinstate == SpinState.Prepared && _time > _minTime){_tmpAngle = GetCurClockwiseAngle();//  print("准备进入减速了" + _tmpAngle + "===" + EndAngle + "===" + pointer.eulerAngles.z);_spinstate = SpinState.End;}}float GetCurClockwiseAngle()// 将当前指针的欧拉角转换成顺时针统计角度{//读取到的值是 0-180,180- -180-0 [0, 180] U [-180, 0],左边由0至180递增,右边由180转变成-180,然后递增至0,所以需要转相应的转换return (-GameManager.turnTable_SO.rotateDirect) * (360 - pointer.eulerAngles.z) % 360;//return (-1) * (360 - pointer.eulerAngles.z) % 360;//顺//return (1) * (360 - pointer.eulerAngles.z) % 360;//逆}void GetReward(){arrowAnim.SetBool("show",false);Debug.Log("奖励!!"+spinRewardId);UIManager.GetInstance().ShowView<RewardView>("RewardView", E_UI_Layer.Mid,(v)=> { v.DrawReward(0, GameManager.turnTable_SO.spinReward[spinRewardId].num);});}private float _endAngle = 0f;/// <summary>/// 最终停止的角度[0, 360]/// </summary>private float EndAngle{get   { return _endAngle; }set{_endAngle = Mathf.Abs(value);//    print("End Angle: " + value);_endAngle = (_endAngle % 360);    //将角度限定在[0, 360]这个区间_endAngle = -_endAngle - 360 * GameManager.turnTable_SO.turnsNum;    //多N圈并取反,圈数能使减速阶段变得更长}}
}

unity 转盘记录相关推荐

  1. Unity学习记录——模型与动画

    Unity学习记录--模型与动画 前言 ​ 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业7 编程题:智能巡逻兵 1.学习参考 ​ 除去老师在课堂上讲的内容,本次作业代码与操作主要参考了 ...

  2. unity学习记录第九章-过关和UI

    unity学习记录第九章 要点 胜利过关 UI文本 笔记 1.创建一个脚本控制开门动画 2.在GameMannager里设置一个类类型的变量,用来传递方法 3.当列表中的收集物为0时开门通关 4.使用 ...

  3. Unity功能记录(一) ------ 截图/录屏保存到相册(Android/iOS横屏竖屏都可以)

    截屏和录屏unity端代码都已经分享过 : Unity功能记录(十七) ------ 截屏功能 Unity插件(二) ------ NatCorder(录屏保存到相册) 但是之前一个个的其实并没有用在 ...

  4. Unity学习记录——空间与运动

    Unity学习记录--空间与运动 前言 ​ 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业3 编程题 1. 模拟太阳系 ​ 首先向unity中Assets添加所找的贴图素材Solar T ...

  5. Unity教程||Unity添加中文字体||Unity知识记录--制作UI粒子特效

    Unity添加中文字体 ## 1.拷贝字体文件 拷贝C:\Windows\Fonts文件夹下,华文细黑常规文件到项目中 ## 2.下载中文字库 链接: https://pan.baidu.com/s/ ...

  6. unity 学习记录

    世界第九条约定 缘起 嗯,其实一开始我知道unity是个弄游戏的,也知道好像神庙逃亡,炉石都是出自unity,然后舍友都报了,我也觉得这个东西挺高大上的,所以忍不住自己的双手,报了名,确实,这能学到很 ...

  7. Unity Shader 记录

    1.UnityObjectToClipPos(float4 pos) 把pos从object space 转换到 clip space. 2.把法线从局部控件转换到世界空间 (1)UnityObjec ...

  8. Unity功能记录(十四) ------ 启动画面

    今天换启动画面时美术给了好多图,但是很神奇要不是拉伸要不就是有边框,比如以下: 整了好久,都不知道为什么,透明图更离谱,还拉伸了,查看官方文档才发现要怎么修改 Unity Splash Screen设 ...

  9. Unity个人记录07-动画系统

    今日学习: 1.做模型的软件 3DMax(可以把max版的转换成fbx版的) 模型的格式 *.max Unity不⽀持的 ;*.fbx Unity⽀持的 ;*.obj...其他格式 2.Clip动画剪 ...

最新文章

  1. mysql8.0 服务移除_Linux下彻底删除Mysql 8.0服务的方法
  2. 关于读构建之法后的疑惑
  3. 流式计算新贵Kafka Stream设计详解--转
  4. Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
  5. hystrix thread pool Metrics
  6. 为什么需要动态内存分配?
  7. ICMP报文分析(转)
  8. Java学习——对象和类
  9. [C++]虚函数-同名访问
  10. vc实现文件的打印--BOOL Print_html(const char *sURL)
  11. 这波疫情,中国会弯道超车么?
  12. STAR对RNA seq进行map
  13. 微信小程序商城项目实战(第九篇:收货地址管理)
  14. matlab 16qam误码率图,16qam理论误码率与实际误码率matlab仿真程序.docx
  15. Java游戏项目之推箱子
  16. Unity世界坐标转换屏幕坐标(概览)
  17. 辩证统一和有机统一的比较
  18. 2022年最新遥感类期刊JCR影响因子及分区
  19. 《中国史入门读物20种推荐》
  20. C程序--输出大写英文字母

热门文章

  1. 2017年美国计算机科学,2017年U.S.News美国大学研究生计算机科学专业排名TOP10
  2. Power Point 2016 画图时取消直线或箭头连接两个图形操作时的自动连接
  3. L1-034 点赞 (20分)
  4. java打印数组的连续非空子集_求一个字符串数组所有非空子集
  5. Camera Log 关键字汇总
  6. 【STM32学习】(21)STM32实现步进电机
  7. RS232接口转USB接口的通信方法
  8. ubuntu 生成桌面快捷方式(有图)
  9. i春秋百度杯CTF比赛2016年12月场writeup
  10. undo和redo介绍