Files
JJBB/Assets/Project/Script/GUI/Message/RollNum.cs

131 lines
3.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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()
//{
//}
}