让数字变化炫酷起来,数字滚动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 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...
随机推荐
- E: Unable to locate package clang-7 E: Unable to locate package clang++-7 E: Couldn't find any package by regex 'clang++-7'
我的系统是Debian 9.8, 然后在装下面这两个包的时候老是提示找不到.然后再github上一问,过了几分钟就有大佬回复了,而且亲测有效 ~$ sudo apt-get -y install cl ...
- 安装spring tool suite时遇到的问题
首先在Eclipse的市场里没有找到,在官网下载安装包后不能安装,于是找了解决办法,跟安装suite的版本还有关系. 我下的是http://download.springsource.com/rele ...
- codeforces 1151 A
一个让我爆零的水题,,,,, codeforces 1151A 1000分 题意:一个字符串,单个字符可以一步可以变成左右两个(Z可以变成Y,A),问最低多少步可以产生“ACTG”: 错因:错误的 ...
- hyperledger fabric部署总结
之前在有道云笔记上分享过,但想想还是搬到这里来吧,以后统一方便整理自己的知识进入正题.... 之前在调研 hyperledger fabric,其实部署说明官网都有,只是东西都是国外的照着操作也会遇到 ...
- excel打开csv文件乱码解决办法
参考链接: https://jingyan.baidu.com/article/4dc408484776fbc8d846f168.html 问题:用 Excel 打开 csv 文件,确认有乱码的问题. ...
- Python——类与对象,异常处理
类 class C1: def setdata(self,value): self.data = value def display(self): print(self.data) class C2( ...
- springboot 多模块打war 部署
先展示一下自己项目结构 一共有5个模块 依赖关系:下面的模块依赖上面所有的模块 其中 rongke-web是我要部署的模块 最终要打war进行部署,其他模块均打jar 被rongke-web引用. 开 ...
- docker镜像常用操作
- Redis在Linux中安装使用
一.安装$ wget http://download.redis.io/releases/redis-x.x.x.tar.gz $ tar xzf redis-x.x.x.tar.gz $ cd re ...
- 用 pdf.js兼容部分安卓显示PDF在线预览 时,a标签直接链接参数文件不能含中文的解决办法
例子: 项目部署在 Tomcat 上的: <a href="../generic/web/viewer.html?file=doc/register/要显示的文件.pdf" ...