使用场景
游戏中当玩家获得资源,或者战斗力提升的时候。数值直接变化往往不直观。
因此需要更直观的表现,比如增加一些动画效果,数字跳字等。
这里实现一个数字跳字的功能。
QQ录屏20220809150915
代码实现:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UpdateJumpText : MonoBehaviour
{
public Text m_JumpText;
public InputField m_inputField;
/// <summary>
/// 跳字计时
/// </summary>
public float mTimer = 0f;
/// <summary>
/// 跳字间隔
/// </summary>
public float mUpdateDeltaTime = 0.03f;
/// <summary>
/// 跳字时间
/// </summary>
public float mUpdateTime = 0.7f;
/// <summary>
/// 上一次显示数值
/// </summary>
int mLastValue;
/// <summary>
/// 当前显示数值
/// </summary>
int mCurValue = 0;
/// <summary>
/// 目标显示数值
/// </summary>
int mTargetValue = 0;
int mOffsetValue
{
get {
return mTargetValue - mLastValue; }
}
int mRangeParameter;
bool useRangeNum = true;
// Start is called before the first frame update
void Start()
{
m_inputField.onEndEdit.AddListener(OnInputFieldEndEdit);
mLastValue = mCurValue = mTargetValue = 0;
m_JumpText.text = mTargetValue.ToString();
}
public void OnInputFieldEndEdit(string input)
{
if (int.TryParse(input, out int inputNum))
{
mTargetValue += inputNum;
TextJump();
}
}
void TextJump()
{
if (mLastValue == mTargetValue)
return;
mTimer = 0;
if (mOffsetValue > 0)
{
if (!IsInvoking("UpdateValue"))
{
InvokeRepeating("UpdateValue", mUpdateDeltaTime, mUpdateDeltaTime);
}
}
else
{
m_JumpText.text = mTargetValue.ToString();
mLastValue = mCurValue = mTargetValue;
if (IsInvoking("UpdateValue"))
{
CancelInvoke("UpdateValue");
}
}
}
void UpdateValue()
{
mTimer += mUpdateDeltaTime;
if (mTimer < mUpdateTime)
{
// 是否使用随机数
if (useRangeNum)
{
mRangeParameter = (int)Mathf.Pow(10, mOffsetValue.ToString().Length);
mCurValue = (mTargetValue / mRangeParameter) * mRangeParameter + Random.Range(mRangeParameter / 10, mRangeParameter);
}
else
{
mCurValue = mLastValue + (int)((mOffsetValue) / mUpdateTime * mTimer);
}
m_JumpText.text = mCurValue.ToString();
}
else
{
m_JumpText.text = mTargetValue.ToString();
mLastValue = mCurValue = mTargetValue;
mTimer = 0f;
CancelInvoke("UpdateValue");
}
}
}