//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Friday, September 21, 2018 //-------------------------------------------------------- using UnityEngine; using System.Collections; using UnityEngine.UI; using DG.Tweening; using System; namespace Snxxz.UI { public class RotatePointer : MonoBehaviour { public bool _isRotate = false;//是否旋转 public float Speed = 2000;//旋转速度 public float Angle = 0; // 这个是设置停止的角度 private float Acceleration = 0;//加速度 private float _time; private bool IsRotateBool = false;//是否进行旋转 public static event Action IsButtonShow; [Header("总旋转时间")] public float ContinuousTime = 4;//旋转时间 [Header("加速减速时间")] public float SpeedTime = 1; [Header("最小速度")] public float MinSpeed = 400; [Header("最大速度")] public float MaxSpeed = 800; WheelOfFortuneModel wheelOfFortuneModel { get { return ModelCenter.Instance.GetModel(); } } [SerializeField] CheckDisplay m_CheckDisplay; public void Init() { IsRotateBool = false; _time = 0; Angle = wheelOfFortuneModel.AngleSave; transform.localRotation = Quaternion.Euler(0, 0, -Angle); Acceleration = (MaxSpeed - MinSpeed) / SpeedTime; m_CheckDisplay.CloseAll(); } private void OnEnable() { } void Update() { if (!_isRotate) { if (Math.Abs((360 - Angle) - transform.eulerAngles.z) > 2) { transform.localRotation = Quaternion.Euler(0, 0, -Angle); m_CheckDisplay.ShowSelected(wheelOfFortuneModel.Lattice); if (IsButtonShow != null) { IsButtonShow(true); } IsRotateBool = false; } return; //不旋转结束 } if (IsRotateBool) { _time += Time.deltaTime; if (_time < SpeedTime)//匀加速 { Speed = MinSpeed + Acceleration * _time; if (Speed >= MaxSpeed) { Speed = MaxSpeed; } } else if (_time > ContinuousTime - SpeedTime)//匀减速 { Speed = MaxSpeed - Acceleration * (_time - (ContinuousTime - SpeedTime)); if (Speed <= MinSpeed) { Speed = MinSpeed; } } else//匀速 { Speed = MaxSpeed; } if (_time < ContinuousTime) // 没结束 { transform.Rotate(-Vector3.forward * Speed * Time.deltaTime); } else { //结束,使用DoTween旋转到结束角度,耗时1秒 //这里有个360,使用来防止指针回转的,如果不加这个360,你会看到指针倒退 Sequence sequence = DOTween.Sequence(); sequence.Append(transform.DORotate(new Vector3(0, 0, -(360 + Angle)), 2f, RotateMode.FastBeyond360)); sequence.AppendCallback(() => { _isRotate = false; // 设置不旋转 if (IsButtonShow != null) { IsButtonShow(true); } m_CheckDisplay.ShowSelected(wheelOfFortuneModel.Lattice); }); IsRotateBool = false; } } } //外部调用,初始化时间和打开旋转,设置停止角度 public void SetTime(bool _bool) { _time = 0; Angle = wheelOfFortuneModel.AngleSave; if (_bool) { IsRotateBool = false; _isRotate = false; } else { IsRotateBool = true; _isRotate = true; } } } }