Files
tianrunCRM/Assets/CoolapeFrame/Scripts/ui/public/EffectNum.cs
2020-07-04 14:41:25 +08:00

222 lines
4.6 KiB
C#
Raw 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.

/*
********************************************************************************
*Copyright(C),coolae.net
*Author: canyou
*Version: 2.0
*Date: 2017-01-09
*Description: 数字动态显示效果比如一个label的值是0当设置成100时有一个从0增到100的过程
*Others:
*History:
*********************************************************************************
*/
using UnityEngine;
using System.Collections;
using System;
namespace Coolape
{
[RequireComponent (typeof(UILabel))]
public class EffectNum : MonoBehaviour
{
UILabel labSelf;
[HideInInspector]
protected Transform myTransform;
public bool isGui = false;
public AnimationCurve speedCurve = new AnimationCurve (new Keyframe (0f, 0f, 0f, 1f), new Keyframe (1f, 1f, 1f, 0f));
private float timeAdd = 0.05f;
private float timeVal = 0f;
private int fromVal = 0;
private int toVal = 0;
private bool isAdd = true;
private int speed = 0;
private float etime = 0.02f;
//每次执行时间
private bool isFirst = true;
// 首次执行
private float firstTime = 0.15f;
//首次执行等待时间
object callFun;
void Awake ()
{
labSelf = gameObject.GetComponent<UILabel> ();
}
// Use this for initialization
void Start ()
{
myTransform = gameObject.transform;
}
// Update is called once per frame
// void Update () {
//
// }
void changeNum (int valNum)
{
fromVal = fromVal + valNum;
if ((isAdd && fromVal > toVal) || (!isAdd && fromVal < toVal)) {
fromVal = toVal;
}
labSelf.text = "" + fromVal;
}
float timeGet {
get {
timeVal += timeAdd;
float tmp = timeVal % 2;
if (tmp > 1) {
return 2 - tmp;
}
return tmp;
}
}
IEnumerator effect ()
{
bool isNull = true;
if (isFirst) {
isFirst = false;
labSelf.text = "" + fromVal;
yield return new WaitForSeconds (firstTime);
}
if (toVal != fromVal) {
isNull = false;
float vCurve = speedCurve.Evaluate (timeGet);
int chng = Mathf.CeilToInt (vCurve * speed);
changeNum (chng);
yield return new WaitForSeconds (etime);
StartCoroutine (effect ());
}
if (isNull) {
StopCoroutine (effect ());
doCallback ();
}
yield return null;
}
void doCallback ()
{
Utl.doCallback (callFun, this);
}
//重新计算速度
void reckonSpeed ()
{
float absSpeed = Mathf.Abs (speed);
if (absSpeed < 100) {
return;
}
if (absSpeed > 100000) {
speed = speed / 12;
} else if (absSpeed > 50000) {
speed = speed / 10;
} else if (absSpeed > 10000) {
speed = speed / 8;
} else if (absSpeed > 5000) {
speed = speed / 6;
} else if (absSpeed > 1000) {
speed = speed / 4;
} else {
speed = speed / 2;
}
}
public void effectStart (int to, object back, float delayTime = 0)
{
string vStr = labSelf.text;
int from = NumEx.toInt (vStr);
effectStart (from, to, back, delayTime);
}
public void effectStart (int from, int to, object back, float delayTime = 0)
{
speed = 0;
fromVal = from;
timeVal = 0f;
isAdd = to > from;
speed = (to - from);
float absSpeed = Mathf.Abs (speed);
bool isSimilar = absSpeed <= 5;
isFirst = true;
callFun = back;
toVal = to;
labSelf.text = fromVal.ToString ();
if (isSimilar) {
labSelf.text = toVal.ToString ();
doCallback ();
} else {
reckonSpeed ();
CancelInvoke ("doEffect");
Invoke ("doEffect", delayTime);
}
}
void doEffect ()
{
if (gameObject.activeInHierarchy) {
StartCoroutine (effect ());
}
}
void OnDisable ()
{
StopAllCoroutines ();
CancelInvoke ();
}
#if UNITY_EDITOR
void OnGUI ()
{
if (isGui) {
Callback cb = backFunTest;
bool is1 = GUI.Button (new Rect (20, 10, 200, 30), "10000to100");
if (is1) {
effectStart (10000, 100, cb);
}
bool is2 = GUI.Button (new Rect (20, 50, 200, 30), "1000to10000");
if (is2) {
effectStart (1000, 10000, cb);
}
bool is3 = GUI.Button (new Rect (20, 90, 200, 30), "10000to10000");
if (is3) {
effectStart (10000, 10000, cb);
}
bool is4 = GUI.Button (new Rect (20, 130, 200, 30), "0to100000");
if (is4) {
effectStart (0, 100000, cb);
}
bool is5 = GUI.Button (new Rect (20, 170, 200, 30), "100to200");
if (is5) {
effectStart (100, 200, cb);
}
bool is6 = GUI.Button (new Rect (20, 210, 200, 30), "100t500");
if (is6) {
effectStart (100, 500, cb);
}
}
}
void backFunTest (params object[] objs)
{
Debug.LogWarning ("timeVal:" + timeVal);
}
#endif
}
}