让数字变化炫酷起来,数字滚动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 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...
随机推荐
- 开启Apache的server status监测
从httpd.conf 打开 status_module#LoadModule status_module modules/mod_status.so修改成LoadModule status_modu ...
- python - Excel表格
from openpyxl import load_workbook wb = load_workbook(r'C:\Users\admin\Desktop\数据筛选.xlsx') # print(w ...
- Python爬虫之selenium各种注意报错
刚刚写完第一个selenuim+BeautifulSoup实战爬虫 爬淘宝.发现代码写完后不加for 翻页的时候没什么问题 解析 操作 都没问题 也就是说第一页 的内容 完好 pagebtn=wait ...
- CentOS搭建GIT服务器
安装git # 请确保您切换到了root账户 $ su root $ yum install -y git # 验证是否安装成功 $ git --version # 输出如下内容表示成功: git v ...
- input子系统学习笔记六 按键驱动实例分析下【转】
转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...
- 测试highlightjs主题1
package top.shaoxiu.scheduleTask; import org.springframework.scheduling.annotation.EnableScheduling; ...
- 部署自建CA颁发证书实现https加密
理论忽略:百度上很多 需求:自建证书并实现域名的https加密 部署: 在linux机器上执行以下命令生成私钥 mkdir -p /opt/ssl-cert cd /opt/ssl-cert 1.# ...
- Spring中@Component注解,@Controller注解详解
在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring提供的自动扫描注入的方式,只需要添加几行自动注入的的配置,便可以完成 Service层,Controll ...
- ConditionalOnBean 与 ConditionalOnMissingBean 的正确玩法
之前看到这篇博客,写ConditionalOnClass的用法,自己实践了一下,感觉有点问题,原文如下: https://blog.csdn.net/lucyTheSlayer/article/det ...
- 解决MongoDB登录的WARNING
解决MongoDB登录的WARNING 1.安装完成运行mongodb警告内容如下: 2019-01-17T15:41:50.578+0800 I CONTROL [initandlisten] ** ...