Files
2024-08-23 15:49:34 +08:00

131 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
//{
//}
}