Unity3D中暂停时的动画及粒子效果实现

暂停是游戏中经常出现的功能,而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.

因为 realtimeSinceStartup 和 timeScale 无关,因此也就成了解决在暂停下的动画和粒子效果的救命稻草。对于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/

时间: 2024-10-25 22:09:53

Unity3D中暂停时的动画及粒子效果实现的相关文章

android音乐播放器,音乐暂停时音量逐渐减小的效果怎么做?

问题描述 android音乐播放器,音乐暂停时音量逐渐减小的效果怎么做? QQ音乐,酷狗等音乐播放器,暂停时音量逐渐减小的效果怎么做? 我的做法是: 开个线程改变音频流的音量 audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 1 ,0); 但是这样会有很多问题,所以不想用这种方法.

求助 我想实现在datagridview中输入时 实现模糊查询的效果 而且把结果以下拉列表的形式显示 该怎么做

问题描述 datagridview能实现吗 解决方案

自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ObjectAnimator(动画三,“大大姐”的旋转跳跃)

转载请注明出处:王亟亟的大牛之路 上一篇讲了一些比较基础的view Animation 这篇会选PropertyAnimation的部分功能来讲一下,因为它的子类还是蛮多的,希望分的篇幅多点,然后可以讲细点 先上一下跑的效果(gif吃动画,见谅,大家可以自己run下) 这篇主要会讲以下几部分 - ObjectAnimator - AnimatorSet - PropertyValuesHolder 以及与之相关的一些知识点 Property Animation相对于我们昨天的View Anima

[小白求问】unity3d中帧动画的一个小问题

问题描述 [小白求问]unity3d中帧动画的一个小问题 设置了一个动画数组 private var anim : Object[]; 初始化anim = Resources.LoadAll("anim"); 然后怎么获取anim数组中某一帧的长和宽呢? 尝试 anim[0].height失败. 刚刚开始学,用的JavaScript

iOS动画开发之五——炫酷的粒子效果

iOS动画开发之五--炫酷的粒子效果         在上几篇博客中,我们对UIView层的动画以及iOS的核心动画做了介绍,基本已经可以满足iOS应用项目中所有的动画需求,如果你觉得那些都还不够炫酷,亦或是你灵光一现,想用UIKit框架写出一款炫酷的休闲游戏,那个有一个东西可以帮到你:iOS的粒子效果引擎. 一.粒子发射器         iOS中的粒子效果有两部分组成,一部分为发射器,设置例子发射的宏观属性,另一部分是粒子单元,用于设置相应的粒子属性.粒子发射器是基于Layer层,没错,又是

iOS使用核心动画和粒子发射器实现点赞按钮的方法_IOS

首先放上效果图,大家可以看一下 实现的方法如下 一.使用到的类 CAKeyframeAnimation       // 核心动画-关键帧动画 CAEmitterLayer            // 粒子发射器(其实就是一个Layer,其父类是CALayer) CAEmitterCell             // 粒子 PS:核心动画应该不用多说了; CAEmitterLayer和CAEmitterCell,其实可以比喻成"炮"和"炮弹",应该不难理解; 二.

用户体验中巧妙的过场动画

  (Adrian Zumbrunnen著 Judithzhu & Lynnwang译 查看原文 转载请注明出处MXD) 一些网页优于其他网页,不仅仅是因为它们的内容.可用程度.设计或是特色等等.现代网页间根本的区别在于它们交互及动画细节.我们将分享一些从各种模型中获得的经验,同时分析为何这些简单的样式能够如此好用. 当我们设计数码产品时,我们常常使用诸如Photoshop及Sketch这样的设计软件.大多数从事此行业多年的人显然知道设计不仅仅是视觉呈现.然而,很多人依然继续创造静止的设计.St

css3中的应用的动画技术

随着网络的发展,浏览器具有更强的渲染更高级代码的能力,我们正逐步实现跨越所有平台和浏览器的目标.我们不但可以要花费更少的时间来确保我们的盒模型在IE6中看起来正常,而且形成了鼓励创新.避免hack.重前端脚本的氛围. 网络是一个非常好的环境,也是一个有丰富的知识来分享的协作社区.我们想要有圆角,我们就实现了它:我们想要多背景图片,我们实现了它:我们想要 边框图片,我们也让它实现了.所以需求从来不是问题,否则,我们可能还都仍然在使用table来布局页面而且使用过多的代码呢.我们都知道,网络无所不能

巧用PPT2010中的合并及动画刷做大量简报

本文介绍如何巧妙利用PowerPoint2010中的合并以及动画刷,在短时间内快速制作大量内容基本上重复的PPT演示文档. 年终将至,为了向公司员工和各级领导做年终汇报,总需要把各种报告.图表.表格数据制作成幻灯片同步演示以加强汇报效果.通常这类总结演示都存在大量相同或相似的内容.格式或动画要求,因此在制作时总要大量重复相同操作,这要浪费不少时间.有没有什么办法能减少重复操作,让我们更快速地完成总结演示的制作呢?在PPT 2010中确实有几种方法可以有效减少重复操作. 一.重用相同幻灯片 打开P