让数字变化炫酷起来,数字滚动Text组件[Unity]

Unity中使用DOTween实现数字滚动效果 0. 实现背景: 玩家在游戏中获得金币或战力等, 需要明显地显示出数字的变化, 可以采用数字滚动效果 1. 最终实现效果图: 2. DOTween相关术语: Tweener 一个tween控制value和animates Sequence 一个特殊的tween,并不是控制value,和其它的tween一起成为一个动画组 Tween 一个普通词,既可以表示Tweener也... 阅读详情

让数字滚动起来

上周我的策划又提了样需求,当玩家评分发生变动时,屏幕出现人物评分浮层UI,播放评分数字滚动动画。这类数字滚动需求非常常见,我就按一般思路,将startvalue与endvalue每隔一点时间做插值变化并显示,从而实现数字滚动的效果,这也是大部分app及游戏采取的实现,效果如下:

几行代码写完给策划看效果,策划说不是这样的效果,跟XX游戏做得不一样,得像lao虎机数字一样,有真实的数字滚动效果,好吧,此滚动非彼滚动,期望效果应该是下面这样,看起来更确实炫酷:

代码实现

这样的效果也不难实现,但要注意一些细节,让动画看起来更真实:

  1. 仍然每隔一点时间做插值变化,算出插值后,不再是简单地修改Text内容了,而是准备用另一个Text显示新值,2个Text都自底向上做缓动,造成像lao虎机一样,新值顶掉旧值的动画效果,要注意每一位数字都单独使用Text组件显示。我们游戏里的战力固定6位数显示,所以总共设置了12个Text组件。
  2. 错开每一位数字的滚动时间点,让滚动效果看起来更自然。设置一个Delay变量,从个位起,后面的每一位都增加一倍Delay再滚动。

/* ==============================================================================
 * 功能描述:数字动态变化Text
 * 创 建 者:shuchangliu
 * ==============================================================================*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class JumpingNumberTextComponent : MonoBehaviour
{
    [SerializeField]
    [Tooltip("按最高位起始顺序设置每位数字Text(显示组)")]
    private List<Text> _numbers; 
    [SerializeField]
    [Tooltip("按最高位起始顺序设置每位数字Text(替换组)")]
    private List<Text> _unactiveNumbers;
    /// <summary>
    /// 动画时长
    /// </summary>
    [SerializeField]
    private float _duration = 1.5f;
    /// <summary>
    /// 数字每次滚动时长
    /// </summary>
    [SerializeField]
    private float _rollingDuration = 0.05f;
    /// <summary>
    /// 数字每次变动数值
    /// </summary>
    private int _speed;
    /// <summary>
    /// 滚动延迟(每进一位增加一倍延迟,让滚动看起来更随机自然)
    /// </summary>
    [SerializeField]
    private float _delay = 0.008f;
    /// <summary>
    /// Text文字宽高
    /// </summary>
    private Vector2 _numberSize;
    /// <summary>
    /// 当前数字
    /// </summary>
    private int _curNumber;
    /// <summary>
    /// 起始数字
    /// </summary>
    private int _fromNumber;
    /// <summary>
    /// 最终数字
    /// </summary>
    private int _toNumber;
    /// <summary>
    /// 各位数字的缓动实例
    /// </summary>
    private List<Tweener> _tweener = new List<Tweener>();
    /// <summary>
    /// 是否处于数字滚动中
    /// </summary>
    private bool _isJumping;
    /// <summary>
    /// 滚动完毕回调
    /// </summary>
    public Action OnComplete;

    private void Awake()
    {
        if (_numbers.Count == 0 || _unactiveNumbers.Count == 0)
        {
            MediaUnity.Debugger.LogError("[JumpingNumberTextComponent] 还未设置Text组件!");
            return;
        }
        _numberSize = _numbers[0].rectTransform.sizeDelta;
    }

    public float duration
    {
        get { return _duration; }
        set
        {
            _duration = value;
        }
    }

    private float _different;
    public float different
    {
        get { return _different; }
    }

    public void Change(int from, int to)
    {
        bool isRepeatCall = _isJumping && _fromNumber == from && _toNumber == to;
        if (isRepeatCall) return;

        bool isContinuousChange = (_toNumber == from) && ((to - from > 0 && _different > 0) || (to - from < 0 && _different < 0));
        if (_isJumping && isContinuousChange)
        {
        }
        else
        {
            _fromNumber = from;
            _curNumber = _fromNumber;
        }
        _toNumber = to;

        _different = _toNumber - _fromNumber;
        _speed = (int)Math.Ceiling(_different / (_duration * (1 / _rollingDuration)));
        _speed = _speed == 0 ? (_different > 0 ? 1 : -1) : _speed;

        SetNumber(_curNumber, false);
        _isJumping = true;
        StopCoroutine("DoJumpNumber");
        StartCoroutine("DoJumpNumber");  
    }

    public int number
    {
        get { return _toNumber; }
        set
        {
            if (_toNumber == value) return;
            Change(_curNumber, _toNumber);
        }
    }
    
    IEnumerator DoJumpNumber()
    {
        while (true)
        {
            if (_speed > 0)//增加
            {
                _curNumber = Math.Min(_curNumber + _speed, _toNumber);
            }
            else if (_speed < 0) //减少
            {
                _curNumber = Math.Max(_curNumber + _speed, _toNumber);
            }
            SetNumber(_curNumber, true);

            if (_curNumber == _toNumber)
            {
                StopCoroutine("DoJumpNumber");
                _isJumping = false;
                if (OnComplete != null) OnComplete();
                yield return null;
            }
            yield return new WaitForSeconds(_rollingDuration);
        }
    }

    /// <summary>
    /// 设置战力数字
    /// </summary>
    /// <param name="v"></param>
    /// <param name="isTween"></param>
    public void SetNumber(int v, bool isTween)
    {
        char[] c = v.ToString().ToCharArray();
        Array.Reverse(c);
        string s = new string(c);

        if (!isTween)
        {
            for (int i = 0; i < _numbers.Count; i++)
            {
                if (i < s.Count())
                    _numbers[i].text = s[i] + "";
                else
                    _numbers[i].text = "0";
            }
        }
        else
        {
            while (_tweener.Count > 0)
            {
                _tweener[0].Complete();
                _tweener.RemoveAt(0);
            }

            for (int i = 0; i < _numbers.Count; i++)
            {
                if (i < s.Count())
                {
                    _unactiveNumbers[i].text = s[i] + "";
                }
                else
                {
                    _unactiveNumbers[i].text = "0";
                }

                _unactiveNumbers[i].rectTransform.anchoredPosition = new Vector2(_unactiveNumbers[i].rectTransform.anchoredPosition.x, (_speed > 0 ? -1 : 1) * _numberSize.y);
                _numbers[i].rectTransform.anchoredPosition = new Vector2(_unactiveNumbers[i].rectTransform.anchoredPosition.x, 0);

                if (_unactiveNumbers[i].text != _numbers[i].text)
                {
                    DoTween(_numbers[i], (_speed > 0 ? 1 : -1) * _numberSize.y, _delay * i);
                    DoTween(_unactiveNumbers[i], 0, _delay * i);

                    Text tmp = _numbers[i];
                    _numbers[i] = _unactiveNumbers[i];
                    _unactiveNumbers[i] = tmp;
                }
            }
        }
    }

    public void DoTween(Text text, float endValue, float delay)
    {
        Tweener t = DOTween.To(() => text.rectTransform.anchoredPosition, (x) =>
        {
            text.rectTransform.anchoredPosition = x;
        }, new Vector2(text.rectTransform.anchoredPosition.x, endValue), _rollingDuration - delay).SetDelay(delay);
        _tweener.Add(t);
    }


    [ContextMenu("测试数字变化")]
    public void TestChange()
    {
        Change(UnityEngine.Random.Range(1, 1), UnityEngine.Random.Range(1, 100000));
    }

}
Unity富文本(Rich Text)进阶指南:从基础标签到炫酷UI效果实战 在Unity游戏开发中,UI文字渲染是提升玩家体验的关键环节。UGUI的Text组件通过富文本(Rich Text)功能,允许开发者使用类似HTML的标记语言动态控制文字样式,其原理是基于样式堆栈的文本网格实时生成。这项技术核心价值在于能以极低性能开销实现丰富的视觉差异化,尤其适合聊天框、属性说明、战斗飘字等高频更新的动态文本场景。通过组合颜色、大小、加粗等基础标签,可以构建清晰的视觉信息层级,有效引导玩家注意力。本文聚焦Unity富文本的实战应用,深入解析如何通过标签组合模拟高级效果,并结合性能优化策略, 阅读详情

相关推荐

Unity中实现数字动态变化的三种核心方法

本文详细介绍了在Unity中实现数字动态变化的三种核心方法,包括基础线性变化、缓动效果进阶实现和混合动态效果实战。通过Text组件和C#脚本控制,开发者可以创建流畅的数字过渡效果,提升游戏用户体验。文章还分享了性能优化方案,帮助开发者避免频繁GC分配和降低更新频率。

weixin_29009881的博客 1025

Unity 实现UI数字滚动效果

挂空物体拉入所需滚动的Text即可。

m0_37546268的博客 1658

Unity游戏UI数字滚动动画:用DoTween实现金币数值动态反馈

在游戏开发中,UI动画是提升玩家体验的关键技术之一,它通过动态反馈增强用户的沉浸感与操作满足感。其核心原理是利用插值算法,在指定时间内平滑过渡数值属性,结合缓动曲线控制变化速率,从而实现自然流畅的视觉效果。这项技术的工程价值在于显著优化交互反馈,减少认知负荷,并能通过代码驱动实现高度可定制化。在Unity引擎中,常见的应用场景包括金币/经验值累加、倒计时显示、生命值变化及连击分数更新等数值型UI元素。本文以热门的DoTween插件为例,深入解析如何高效实现数字滚动动画,并探讨性能优化与常见问题解决方案,帮助

weixin_33742618的博客 351

unity实现数字滚动动画效果

要在 Unity 中实现数字滚动动画效果,你可以使用以下步骤: 创建一个新的 Unity 项目。 在场景中添加一个 UI 文本控件。 在 C# 脚本中,使用 coroutine 实现动画效果。 在每一帧中更新 UI 文本的数字,并通过计算得出下一个数字的位置。 在动画结束后,使用 StopCoroutine 停止动画协程。 示例代码: using UnityEngine; using Unit...

weixin_42613017的博客 1854

Unity中实现数字滚动效果(类似于老虎机的那种数字滚动效果)

Unity中实现数字滚动效果(类似于老虎机的那种数字滚动效果)

虚粒世界 754

Unity UGUI数字滚动

Unity UGUI数字滚动 Unity UGUI数字滚动Unity UGUI数字滚动Unity UGUI数字滚动Unity UGUI数字滚动

让数字变化炫酷起来,数字滚动Text组件[Unity](lua+NGUI)

让数字滚动起来 上周我的策划又提了样需求,当玩家评分发生变动时,屏幕出现人物评分浮层UI,播放评分数字滚动动画。这类数字滚动需求非常常见,我就按一般思路,将startvalue与endvalue每隔一点时间做插值变化并显示,从而实现数字滚动的效果,这也是大部分app及游戏采取的实现,效果如下: 几行代码写完给策划看效果,策划说不是这样的效果,跟XX游戏做得不一样,得像lao虎机数字一样,...

AGroupOfRuffian的博客 5263

数字随机滚动

用unity 做的一个小东西,2位数字的上下随机滚动,类似抽奖

Unity 老虎机数字滚动

找不到原作者博客了 ,转载自该大神 代码作者: shuchangliu ,谢谢这位大佬的无私奉献,为您鼓掌 组织结构图: /* ============================================================================== * 功能描述:数字动态变化Text * 创 建 者:shuchangliu * ===========================================================..

我知道你很急,但是路要一步步走 4239

大模型学习笔记四:LangChain开发框架解析

1、模型I/O封装LLMs:大语言模型Chat Models:一般基于LLMs,但按对话结构重新封装PromptTemple:提示词模板OutputParser:解析输出2、数据连接封装Document Loaders:各种格式文件的加载器Document transformers:对文档的常用操作,如:split,filter,translate,extract metadata,etcTextr Embedding Models:文本向量化表示,用于检索等操作。

谢白羽 4282

MATLAB安装

Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg   Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_win64.part2.rar两部分安装文件和Matlab 2016a Win64 Crack破解文件。 2、解压安装文件(解...

qq_36734094的博客 17万+

【Unity】 DoTween实现滚动数字

【Unity】 DoTween实现滚动数字 概要 using UnityEngine; public class Test : MonoBehaviour { public Text text; private void Start() { DOTween.To(value => { text.text = Mathf.Floor(value).ToString(); }, startValue: 0, endValue: 4396, duration

Voioer的博客 6662

CODESYS安装全攻略:从下载到配置的保姆级教程(含常见问题解决)

本文提供了一份详细的CODESYS安装与配置指南,涵盖从系统环境准备、安装包下载、Development System安装到Runtime System配置的全过程。教程重点解决了安装过程中的常见权限、兼容性和连接问题,并指导用户完成第一个PLC程序的创建与调试,帮助工业自动化开发者快速上手这一通用开发平台。

kkk56的博客 420

Text组件 数字动画 [Unity]

仍然每隔一点时间做插值变化,算出插值后,不再是简单地修改Text内容了,而是准备用另一个Text显示新值,2个Text都自底向上做缓动,造成像lao虎机一样,新值顶掉旧值的动画效果,要注意每一位数字都单独使用Text组件显示。我们游戏里的战力固定6位数显示,所以总共设置了12个Text组件。 错开每一位数字的滚动时间点,让滚动效果看起来更自然。设置一个Delay变量,从个位起,后面的每一位都增加一倍Delay再滚动。 /* ================================...

momohou2000的博客 1802

雷达信号处理中的CLEAN算法实现与优化

在信号处理领域,杂波抑制是提升目标检测性能的关键技术。CLEAN算法作为一种迭代去卷积方法,通过逐步提取最强信号分量并消除其影响,有效解决了传统方法在复杂环境下的局限性。该算法结合自适应阈值和噪声基底估计,显著提高了雷达信号处理的精度和鲁棒性。在工程实践中,CLEAN算法广泛应用于气象雷达、地物杂波抑制等场景,通过Matlab仿真可以快速验证算法性能并优化参数设置。本文重点探讨了CLEAN算法在雷达信号处理中的实现细节和优化技巧,包括距离徙动补偿、多普勒补偿等关键技术。

weixin_32430941的博客 262

撸毛笔记-朴朴超市 v1.01

朴朴超市 v1.01脚本地址:自动签到和组队赚朴分, 朴分可以抵扣50%的金额组队瓜分需要4人成团, 每个号每天只能开团和入队各一次每天跑一两次即可使用扫码或自己想办法捉refreshToken扫码获取token: (先微信进入朴朴超市小程序并登录注册过账号再扫码)把获取的refreshToken和备注(非必须)填到文件pupuCookie.txt里(第一次运行会自动创建), 多账号换行或&或@隔开。

xiaoshun007的专栏 1805

unity Text 数字滚动变化

【代码】unity Text 数字滚动变化。

qq_37524903的博客 2175

15张图详解三方支付:总架构、5大核心业务处理流程、备付金管理

用户可以将银行卡与零钱账户绑定,建立银行结算账户与支付账户的连接,然后将银行账户资金充值到零钱账户中,或将零钱账号中的余额提现至绑定的银行卡。因此,用户在A支付机构的零钱一般只能支付给A支付机构的商户,如支付宝的零钱不能支付给微信的商户。这五大业务的协同运作,使得第三方支付机构这一庞大的支付服务平台能够为市场提供卓越的支付能力。到了结算时间,网联会向备付金集中存管账户提交结算指令,在第三方支付机构备付金集中存管账户内完成最终的结算,并将结算结果及额度变动情况通知给第三方支付机构,具体流程如图13所示。

银行信息系统应用架构详解 1044

Unity动态数字变化组件实现:从原理到性能优化

在游戏开发与UI设计中,数值的动态变化效果是提升用户体验的关键技术之一。其核心原理基于数值插值计算,通过时间函数在起始值与目标值之间进行平滑过渡,常用的线性插值方法如Mathf.Lerp是实现这一效果的基础。从技术价值来看,动态数字变化不仅增强了视觉反馈和交互沉浸感,还能有效引导用户注意力,提升数据感知的直观性。在应用场景上,它广泛用于游戏中的金币计数、生命值显示、得分动画以及应用界面的数据仪表盘等需要实时数值反馈的场合。本文以Unity引擎为例,深入探讨如何结合协程与DOTween插件实现高性能的动态数字

weixin_29017445的博客 330

ArtMate —— 美术公开课智能体开发全记录

本文档详细描述了一款专为中小学美术公开课设计的智能教学助手的开发过程。该智能体融合了多模态感知、自然语言交互、风格迁移与智能评价等技术,旨在辅助教师开展生动、高效的美术鉴赏与创作课程。全文包含需求分析、系统架构设计、核心模块代码实现、交互界面搭建及完整运行示例,并配有详尽的行内注释和设计思想阐述,为教育技术开发者提供一份可落地、可扩展的参考方案。

huanghm88的专栏 152

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 179

【Unity】数字滚动效果

原理:利用DoTween实现数字滚动添加的效果 public Text text; public int type; public void IncreaseAnim(int startValue, int targetValue) { var se = DOTween.Sequence(); se.Append(DOTween.To(delegate (float value) { var temp

TheBigBoy的博客 2929

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Unity数字动态变化三种实现方法:Update、协程与DOTween性能对比

在游戏开发和交互式应用设计中,UI动画是提升用户体验的关键技术之一,其中数字的动态变化(如伤害数值、金币计数、数据仪表盘)尤为常见。其核心原理是通过插值算法在连续的时间帧中对数值进行平滑过渡,而非直接跳变,从而创造出流畅的视觉反馈。从技术价值看,这不仅增强了产品的质感和专业度,更是性能优化的重要考量点,尤其是在需要处理大量实时数据或高频更新的场景中。在Unity引擎的生态下,实现数字动态变化主要有三种工程实践路径:基于Update循环的逐帧计算、使用协程进行离散时间驱动,以及借助DOTween插件的高性能补

weixin_33834137的博客 416

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Unity旧版Text组件中文排版优化:实现智能标点避头尾规则

在UI开发中,文本渲染是基础而关键的技术环节,它直接影响用户体验和产品专业度。文本渲染的核心原理涉及字符编码、字体栅格化、布局计算等多个层面,其中排版规则是确保文字可读性的重要保障。从技术价值看,良好的排版处理能显著提升应用的本土化质量和视觉一致性,尤其在东亚语言场景下。常见的应用场景包括游戏UI、移动应用、文档编辑器等需要多语言支持的界面。针对Unity引擎,旧版UI Text组件在处理中文标点避头尾规则时存在局限,这促使开发者探索预处理方案,通过字符宽度计算和动态调整算法,在保持轻量级的同时改善排版效果

weixin_30372371的博客 331

Unity数字滚动动画:从插值原理到高性能实现

数字动画是游戏UI反馈的核心技术之一,其本质是基于时间插值的数值平滑过渡。通过缓动函数控制变化曲线,可以实现加速、减速等自然运动效果,这对于提升用户体验和界面表现力至关重要。在Unity中实现高效的数字滚动,需综合考虑性能开销、内存管理及视觉流畅度,常应用于分数展示、金币计数、排行榜结算等场景。本文深入探讨了基于Update驱动的自定义动画方案,并针对【TextMeshPro】优化和【垃圾回收(GC)】控制提供了工程实践指导,帮助开发者实现既炫酷又高效的数字滚动效果。

weixin_33724659的博客 415
上一篇: VR中射线点击按钮的实现
下一篇: Unity3D Shader 入门第一天
慕飞
博客等级 码龄11年 43粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值