Unity 数字跳字功能

使用场景

游戏中当玩家获得资源,或者战斗力提升的时候。数值直接变化往往不直观。
因此需要更直观的表现,比如增加一些动画效果,数字跳字等。
这里实现一个数字跳字的功能。

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");
        }
    }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值