让数字变化炫酷起来,数字滚动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

Python实战:用Realsense D435和睿尔曼机械臂完成手眼标定的5个关键步骤

本文详细介绍了使用Python、Realsense D435深度相机与睿尔曼机械臂进行手眼标定的完整实战流程。文章将过程拆解为环境搭建、数据采集、核心计算、结果验证和精度优化五个关键步骤,重点剖析了数据采集的黄金法则、常见错误排查以及如何将标定结果集成到视觉抓取程序中,旨在帮助开发者实现毫米级精度的视觉引导机器人系统。

weixin_29103191的博客 320

利用OrthoFinder做泛基因家族聚类分析

这条命令会将 Arabidopsis_thaliana.TAIR10.59_longest_trans.pep.fa 文件中的所有序列ID,去掉ID中的空格后面的部分,只保留 > 后第一个空格之前的基因ID,并将结果保存在 An1.fasta 文件中。muscle 是一种常用的多序列比对工具,用于基因组或蛋白质序列的比对。基因家族(Gene family),是来源于同一个祖先,由一个基因通过基因重复而产生两个或更多的拷贝而构成的一组基因,它们在结构和功能上具有明显的相似性,编码相似的蛋白质产物。

qq_64400864的博客 2748

【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

关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题

先说结论,我用VLC或者Pyhton opencv直接拉取海康网络摄像头的rtsp流,会有1-2s延时,特别明显。环境:Windows + VLC / Openc-Python。如上面文章介绍,我使用的时候遇到一处错误,需要把代码中的。海康SDK:与网页视频相比,几乎是同步的。上面说的延时,也是与摄像头网页视频相比的。ffplay 去掉缓存:延时1s左右。这两处地方改成左斜杠,才能运行。opencv拉流使用的是。多线程:延时1s左右。

yljxh的博客 4498

Text组件 数字动画 [Unity]

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

momohou2000的博客 1802

Ubuntu22.04上如何用Docker一键部署Ragflow+Ollama(附CUDA配置避坑指南)

本文详细介绍了在Ubuntu22.04系统上使用Docker一键部署Ragflow+Ollama的完整流程,特别提供了CUDA配置的避坑指南。从硬件兼容性检查、驱动安装到容器网络配置,手把手教你搭建本地化大模型环境,解决CUDA驱动冲突等常见问题,助力开发者快速构建AI应用开发平台。

weixin_26875109的博客 284

V-rep机器人仿真(Win10):UR5+RG2+Kinect+YOLOV3+DDPG+Pytorch(第四部分:YOLOV3图像识别)

这是一个V-rep机器人仿真实验,较为简单,适合初学者在入门图像识别、机器学习、机器人学的内容时进行学习与训练。 实验涉及的内容有:V-rep机器人仿真,YOLOV3图像识别,强化学习DDPG,UR5机械臂及RG2机械手,Kinect摄像头。 使用环境:Win10,Pytorch0.4,V-rep 整个实验一共由多篇文章组成,本文是第四部分。 第四部分:YOLOV3图像识别 文章目录第四部分:YO...

weixin_42158966的博客 5835

unity Text 数字滚动变化

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

qq_37524903的博客 2175

北斗导航 | 基于LSTM-KF融合的北斗卫星定位算法研究框架

针对北斗卫星导航系统在复杂环境下存在的多路径效应、非视距传播等问题,提出一种基于长短期记忆网络(LSTM)与卡尔曼滤波(KF)的组合定位算法。通过LSTM网络建模定位误差的非线性特征,结合卡尔曼滤波实现动态噪声抑制,构建"粗定位-LSTM校正-卡尔曼滤波优化"的三级处理架构。实验表明,融合算法较传统方法定位精度提升42.7%,均方根误差降低至1.2米。

尘世冰封的专栏 920

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

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

weixin_29017445的博客 330

YOLOv11改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov11精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 1821

Claude Code 分布式并行开发最佳实践:1中枢+10Worker跨多Git仓库全流程落地

本文介绍了一套基于Claude Code和Git Worktree的分布式并行开发方案,解决多仓库、微服务开发中的核心痛点。方案采用"1个决策中枢+10个并行Worker"架构,中枢负责任务拆解和调度,每个Worker绑定独立仓库实现完全隔离开发。关键优势包括:任务并行效率提升10倍、跨仓库依赖自动编排、版本统一管理、零第三方依赖。文章详细提供了环境准备、架构设计、中枢搭建和初始化脚本等全流程落地指南,特别适合多仓库协同的全栈开发场景。

AI天才研究院 243

【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

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

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

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

weixin_33834137的博客 416

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

weixin_30372371的博客 331

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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、付费专栏及课程。

余额充值