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

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

代码实现#
这样的效果也不难实现,但要注意一些细节,让动画看起来更真实:
- 仍然每隔一点时间做插值变化,算出插值后,不再是简单地修改Text内容了,而是准备用另一个Text显示新值,2个Text都自底向上做缓动,造成像lao虎机一样,新值顶掉旧值的动画效果,要注意每一位数字都单独使用Text组件显示。我们游戏里的战力固定6位数显示,所以总共设置了12个Text组件。
- 错开每一位数字的滚动时间点,让滚动效果看起来更自然。设置一个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));
}
}
让数字变化炫酷起来,数字滚动Text组件[Unity]的更多相关文章
- 使用css实现炫酷的横屏滚动效果
炫酷的横屏滚动效果css实现 DEMO: https://codepen.io/kobako/pen/BxVLLm 我们对滚动条都不陌生.平时浏览的网页,进度条通常是垂直方向的,内容从上往下排列.但是 ...
- jQuery.smoove — jQuery和CSS3炫酷滚动页面内容元素动画特效插件
插件介绍: jQuery-smoove是一款jQuery和CSS3炫酷滚动页面内容元素动画特效插件.该内容元素动画插件在页面滚动到指定位置时,该位置的HTML元素会执行指定的CSS3动画特效,如旋转. ...
- 一款非常炫酷的jQuery动态随机背景滚动特效
一款非常炫酷的jQuery动态随机背景滚动特效 图片背景会不停息的滚动,带有那种漂浮的视觉效果,小圈圈飘动. 更好的是还兼容IE6浏览器,大伙可以好好研究研究. 适用浏览器:IE6.IE7.IE8.3 ...
- [cocos2dx动作]CCLabel类数字变化动作
cococs2dx的CCLabel类的数字变化动作 介绍: 简单的数字变化动作(适用于CCLabel类对象, 包括CCLabelTTF, CCLabelAtlas, CCLabelBMFont等等) ...
- swiper3d横向滚动多张炫酷切换banner
最近有了个新需求,swiper3d横向滚动多张炫酷切换banner要和elementUI里边走马灯的卡片化card 类似,但是还需要h5手机触摸滚动啊啊啊啊,昨天折腾了半个早上总算完成,今天乖乖跑来m ...
- 仿网易/QQ空间视频列表滚动连播炫酷效果
代码地址如下:http://www.demodashi.com/demo/11201.html 一.准备工作 AndroidStudio 开发环境 需要下载七牛的开源播放器SDK 本例子实现了仿网易/ ...
- 2019-9-2-win10-uwp-随着数字变化颜色控件
title author date CreateTime categories win10 uwp 随着数字变化颜色控件 lindexi 2019-09-02 12:57:38 +0800 2018- ...
- >炫酷的计时器效果Canvas绘图与动画<
>炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...
- Android开发之炫酷MD风格
文章转自:一点点征服的 http://www.cnblogs.com/ldq2016/p/5217590.html 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...
随机推荐
- [Kubernetes]谈谈容器跨主机网络
继上篇文章:[Kubernetes]浅谈容器网络,自己给自己挖的坑,这篇文章来谈谈容器跨主机网络. 要理解容器"跨主通信"的原理,就要来谈谈 Flannel 这个项目. Flann ...
- 【原创】大叔经验分享(50)hue访问mysql(librdbms)
cloudera manager安装hue后想开启访问mysql(librdbms)需要在这里配置(hue_safety_valve.ini) 添加配置如下 [librdbms] # The RDBM ...
- Flask+SQLAlchemy+alembic+Flask-RESTful使用
前言 其实准备把这篇删掉,先写Flask-restful相关的,后来想想大体框架还是先写出来,这两天踩了很多坑,有的谷歌也没有答案.一直摸索也总算是开始了. 正文 SQLAlchemy/alembic ...
- Modbus协议栈实现Modbus RTU多主站支持
前面我们已经详细讲解过Modbus协议栈的开发过程,并且利用协议栈封装了Modbus RTU主站和从站,Modbus TCP服务器与客户端,Modbus ASCII主站与从站应用.但在使用过程中,我们 ...
- SpringBoot 整合Dubbo
RPC框架可参考:https://blog.csdn.net/top_code/article/details/54615853 整合可参考:https://www.dalaoyang.cn/arti ...
- SSM框架中写sql在xml文件中
第一种(用Mapper.xml映射文件中定义了操作数据库sql) 注意点: 1.#{}与${} #{}表示一个占位符,使用占位符可以防止sql注入, ${}通过${}可以将parameterType传 ...
- 如何在MySQL中设置主从复制
mysql主从同步定义 主从同步机制 配置主从同步 配置主服务器 配置从服务器 使用主从同步来备份 使用mysqldump来备份 备份原始文件 主从同步的小技巧 排错 Slave_IO_Running ...
- 末学者笔记--shell编程上 2 玄
Shell编程-变量及表达运算 [内容简列] 1. shell变量简介 2. 定义变量 3. 使用变量 4. 修改变量的值 5. 单引号和双引号的区别 6. 将命令的结果赋值给变量 7. 删除变量 8 ...
- 金山WPS一面
昨天下午在武汉面了一场服务端开发工程师吧,结果还未通知,是校招的, 大体上题目如下: 先自我介绍 然后是聊了一些笔试上的情况 问了spring的的作用以及优势 http的状态,三次握手四次挥手 gc的 ...
- Spring 开发常见问题
linux 下http 接收中文参数乱码 解决: 在application.yml配置文件中添加 spring: http: encoding: charset: GB2312