using System.Collections; using System.Collections.Generic; using Module.Log; using UnityEngine; using UnityEngine.UI; public class RollNum : MonoBehaviour { // 需配置部分 public float maxSpeed; // 转动最大速度 public float deltaSpeed; // 加速度 public float height; // 10个数字的总长度(一周高度) public float childHeight; // 每个数字高度 // ---------- private float curSpeed; // 当前速度 private RectTransform rt; // 当前物体Rt组件,控制位移 private float deltaSlowSpeed; // 减速加速度 private float roundLenght; // 转动一圈的路程 private float totalLength; // 总路程 private float tempLength; // 补足长度 private int des; // 需要的转动结果 public delegate void voidNoneDel(); public event voidNoneDel FinishEvent; // 展示结束事件 private void OnEnable() { // 归位 rt = transform as RectTransform; rt.anchoredPosition = new Vector2(rt.anchoredPosition.x, 0.0f); roundLenght = 10 * childHeight; curSpeed = 0.0f; } private void Update() { rt.anchoredPosition += Vector2.up * curSpeed * Time.deltaTime; if (rt.anchoredPosition.y > height) { float newBegin = rt.anchoredPosition.y - height; rt.anchoredPosition = new Vector2(rt.anchoredPosition.x, newBegin); } } public void SetAndBegin(int des) { if(des >= 0 && des <= 9) { this.des = des; StopAllCoroutines(); StartCoroutine("SpeedUp"); } else { LogModule.ErrorLog("Des is wrong, please reset it"); } } private IEnumerator SpeedUp() { curSpeed = 0.0f; while (true) { curSpeed += Time.deltaTime * deltaSpeed; if (curSpeed > maxSpeed) { curSpeed = maxSpeed; BeginSlow(); yield break; } yield return null; } } private void BeginSlow() { StopAllCoroutines(); if(des < 0 || des > 9) { return; } if (des * childHeight >= rt.anchoredPosition.y) { tempLength = des * childHeight - rt.anchoredPosition.y; } else { tempLength = des * childHeight + roundLenght - rt.anchoredPosition.y; } totalLength = tempLength + 3 * roundLenght; StartCoroutine("SlowDown"); } private IEnumerator SlowDown() { yield return 0; deltaSlowSpeed = maxSpeed * maxSpeed / (2.0f * totalLength); while (true) { curSpeed -= deltaSlowSpeed * Time.deltaTime; if (curSpeed < 0.0f) { curSpeed = 0.0f; if(FinishEvent != null) { FinishEvent.Invoke(); } yield break; } yield return null; } } //// 结束后的修正过程 //private IEnumerator FinallyCorrect() //{ //} }