博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity3D中暂停时的动画及粒子效果实现
阅读量:6232 次
发布时间:2019-06-21

本文共 1837 字,大约阅读时间需要 6 分钟。

暂停是游戏中经常出现的功能,而Unity3D中对于暂停的处理并不是很理想。一般的做法是将Time.timeScale设置为0。Unity的文档中对于这种情况有以下描述;

The scale at which the time is passing. This can be used for slow motion effects….When timeScale is set to zero the game is basically paused …

timeScale表示游戏中时间流逝快慢的尺度。文档中明确表示,这个参数是用来做慢动作效果的。对于将timeScale设置为0的情况,仅只有一个补充说明。在实际使用中,通过设置timeScale来实现慢动作特效,是一种相当简洁且不带任何毒副作用的方法,但是当将timeScale设置为0来实现暂停时,由于时间不再流逝,所有和时间有关的功能痘将停止,有些时候这正是我们想要的,因为毕竟是暂停。但是副作用也随之而来,在暂停时各种动画和粒子效果都将无法播放(因为是时间相关的),FixedUpdate也将不再被调用。

换句话说,最大的影响是,在timeScale=0的暂停情况下,你将无法实现暂停菜单的动画以及各种漂亮的点击效果。

但是并非真的没办法,关于timeScale的文档下就有提示:

Except for realtimeSinceStartup, timeScale affects all the time and delta time measuring variables of the Time class.

因为 realtimeSinceStartuptimeScale 无关,因此也就成了解决在暂停下的动画和粒子效果的救命稻草。对于Unity动画,在每一帧,根据实际时间寻找相应帧并采样显示的方法来模拟动画:

AnimationState _currState = animation[clipName];bool isPlaying = true;float _progressTime = 0F;float _timeAtLastFrame = 0F; float _timeAtCurrentFrame = 0F; bool _inReversePlaying = false; float _deltaTime = 0F; animation.Play(clipName); _timeAtLastFrame = Time.realtimeSinceStartup; while (isPlaying) { _timeAtCurrentFrame = Time.realtimeSinceStartup; _deltaTime = _timeAtCurrentFrame - _timeAtLastFrame; _timeAtLastFrame = _timeAtCurrentFrame; _progressTime += _deltaTime; _currState.normalizedTime = _inReversePlaying ? 1.0f - (_progressTime / _currState.length) : _progressTime / _currState.length; animation.Sample(); //…repeat or over by wrap mode }

对于粒子效果,同样进行计时,并通过粒子系统的Simulate方法来模拟对应时间的粒子状态来完成效果,比如对于Legacy粒子,使Emitter在timeScale=0暂停时继续有效发射并显示效果:

_deltaTime = Time.realtimeSinceStartup - _timeAtLastFrame;_timeAtLastFrame = Time.realtimeSinceStartup;if (Time.timeScale == 0 ){	_emitter.Simulate(_deltaTime);	_emitter.emit = true;}

核心的代码基本都在上面了,可以根据这个思路完成实现。我放到了github上,有需要的朋友可以去查看,也欢迎大家指正。

 

https://onevcat.com/2013/01/do_not_pause_me/

转载地址:http://nkana.baihongyu.com/

你可能感兴趣的文章
Oracle 11g rac 生产环境部署详录
查看>>
web.xml 中<taglib>报错
查看>>
Linux文件系统上的特殊权限(SUID、SGID、Sticky)的知识点
查看>>
零部件表设计 T_AIS_BASE_PARTS_INFO
查看>>
fgsdf
查看>>
一、Asp.Net MVC4.0开发CMS系统案例之数据库设计
查看>>
Vue.js 2.x笔记:路由Vue Router(6)
查看>>
HTTP请求对消息主体进行编码的方法
查看>>
归并排序以及逆序数计算
查看>>
jQuery 下拉列表 二级联动插件
查看>>
jQuery的样式篇
查看>>
QT(4)信号与槽
查看>>
(转)jieba中文分词的.NET版本:jieba.NET
查看>>
PHP 反射机制
查看>>
jQuery手风琴效果
查看>>
oracle调度中使用schedule管理调度
查看>>
Ubuntu 14.04 Remmina远程桌面连接Windows计算机
查看>>
php 在linux系统下写出文件问题
查看>>
将EXCEL转为HTML有什么好办法?
查看>>
了解一下Elasticsearch的基本概念
查看>>