unity暂停
2016-06-14 22:33
507 查看
提条件:在项目中用过Time.timeScale = 0来实现游戏暂停
问题: 暂停游戏后,暂停界面的按钮可能需要播放一个idle时的动画,Time.timeScale=0 会影响动画播放。
受Time.timeScale影响的因素:
1.物理模拟. FixedUpdate - 当Time.timeScale=0时,FixedUpdate 函数不会被执行,但是Update函数是会执行的。
2.Coroutines. - Time.timeScale=0 协程函数不会停止,但是会停止WaitForSeconds. 协成函数还是会每一帧都触发,但是WaitForSeconds使用的是当前的Time.deltaTime会变成0
3.Invoke 和 InvokeRepeating. -延迟一段时间后掉用指定函数.
4.Particle System 粒子系统.
5.Animations. -动画. 如果我们使用的是Animator,可以设置动画忽略Time.timeScale带来的影响. 只需要把UpdateMode设置为UnScaled Time。
timeScale表示游戏中时间流逝快慢的尺度。这个参数是用来做慢动作效果的。
对于将timeScale设置为0的情况,仅只有一个补充说明。
在实际使用中,通过设置timeScale来实现慢动作特效,是一种相当简洁且不带任何副作用的方法.
但是当将timeScale设置为0来实现暂停时,由于时间不再流逝,所有和时间有关的功能都将停止,有些时候这正是我们想要的,因为毕竟是暂停。
但是副作用也随之而来,在暂停时各种动画和粒子效果都将无法播放(因为是时间相关的),FixedUpdate也将不再被调用。
那么我又如何通过timeScale来实现上面的效果呢?
刚好realtimeSinceStartup 与 timeScale 就无关,也就是说realtimeSinceStartup 不受timeScale 的影响。
因此realtimeSinceStartup 也就成了解决在暂停下的动画和粒子效果的救命稻草。对于Unity动画,
在每一帧,根据实际时间寻找相应帧并采样显示的方法来模拟动画,
注:上面这段代码只对Animation有效,那针对Animator我们又如何在timeScale =0的情况下正常播放动画呢?
如果你是想游戏部分暂停,可以把暂停的部分写到FixedUpdate函数里面,不暂停写到Update函数。
问题: 暂停游戏后,暂停界面的按钮可能需要播放一个idle时的动画,Time.timeScale=0 会影响动画播放。
受Time.timeScale影响的因素:
1.物理模拟. FixedUpdate - 当Time.timeScale=0时,FixedUpdate 函数不会被执行,但是Update函数是会执行的。
2.Coroutines. - Time.timeScale=0 协程函数不会停止,但是会停止WaitForSeconds. 协成函数还是会每一帧都触发,但是WaitForSeconds使用的是当前的Time.deltaTime会变成0
3.Invoke 和 InvokeRepeating. -延迟一段时间后掉用指定函数.
4.Particle System 粒子系统.
5.Animations. -动画. 如果我们使用的是Animator,可以设置动画忽略Time.timeScale带来的影响. 只需要把UpdateMode设置为UnScaled Time。
timeScale表示游戏中时间流逝快慢的尺度。这个参数是用来做慢动作效果的。
对于将timeScale设置为0的情况,仅只有一个补充说明。
在实际使用中,通过设置timeScale来实现慢动作特效,是一种相当简洁且不带任何副作用的方法.
但是当将timeScale设置为0来实现暂停时,由于时间不再流逝,所有和时间有关的功能都将停止,有些时候这正是我们想要的,因为毕竟是暂停。
但是副作用也随之而来,在暂停时各种动画和粒子效果都将无法播放(因为是时间相关的),FixedUpdate也将不再被调用。
那么我又如何通过timeScale来实现上面的效果呢?
刚好realtimeSinceStartup 与 timeScale 就无关,也就是说realtimeSinceStartup 不受timeScale 的影响。
因此realtimeSinceStartup 也就成了解决在暂停下的动画和粒子效果的救命稻草。对于Unity动画,
在每一帧,根据实际时间寻找相应帧并采样显示的方法来模拟动画,
<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> IEnumerator <span class="hljs-title">Play</span>( <span class="hljs-keyword">this</span> Animation animation, <span class="hljs-keyword">string</span> clipName, <span class="hljs-keyword">bool</span> ignoreTimeScale, Action onComplete ) { <span class="hljs-comment">//We don't want to use timeScale, so we have to animate by frame..</span> <span class="hljs-keyword">if</span>(ignoreTimeScale) { AnimationState _currState = animation[clipName]; <span class="hljs-keyword">bool</span> isPlaying = <span class="hljs-keyword">true</span>; <span class="hljs-keyword">float</span> _progressTime = <span class="hljs-number">0</span>F; <span class="hljs-keyword">float</span> _timeAtLastFrame = <span class="hljs-number">0</span>F; <span class="hljs-keyword">float</span> _timeAtCurrentFrame = <span class="hljs-number">0</span>F; <span class="hljs-keyword">bool</span> _inReversePlaying = <span class="hljs-keyword">false</span>; <span class="hljs-keyword">float</span> _deltaTime = <span class="hljs-number">0</span>F; animation.Play(clipName); _timeAtLastFrame = Time.realtimeSinceStartup; <span class="hljs-keyword">while</span> (isPlaying) { _timeAtCurrentFrame = Time.realtimeSinceStartup; _deltaTime = _timeAtCurrentFrame - _timeAtLastFrame; _timeAtLastFrame = _timeAtCurrentFrame; _progressTime += _deltaTime; _currState.normalizedTime = _inReversePlaying ? <span class="hljs-number">1.0</span>f - (_progressTime / _currState.length) : _progressTime / _currState.length; animation.Sample(); <span class="hljs-keyword">if</span> (_progressTime >= _currState.length) { <span class="hljs-keyword">switch</span> (_currState.wrapMode) { <span class="hljs-keyword">case</span> WrapMode.Loop: <span class="hljs-comment">//Loop anim, continue.</span> _progressTime = <span class="hljs-number">0.0</span>f; <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> WrapMode.PingPong: <span class="hljs-comment">//PingPong anim, reversing continue.</span> _progressTime = <span class="hljs-number">0.0</span>f; _inReversePlaying = !_inReversePlaying; <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> WrapMode.ClampForever: <span class="hljs-comment">//ClampForever anim, keep the last frame.</span> <span class="hljs-keyword">break</span>; <span class="hljs-keyword">case</span> WrapMode.Default: <span class="hljs-comment">//We don't know how to handle it.</span> <span class="hljs-comment">//In most time, this means it's a Once anim.</span> <span class="hljs-comment">//Animation should be played with wrap mode specified.</span> Debug.LogWarning(<span class="hljs-string">"A Default Anim Finished. Animation should be played with wrap mode specified."</span>); isPlaying = <span class="hljs-keyword">false</span>; <span class="hljs-keyword">break</span>; <span class="hljs-keyword">default</span>: <span class="hljs-comment">//Once anim, kill it.</span> isPlaying = <span class="hljs-keyword">false</span>; <span class="hljs-keyword">break</span>; } } <span class="hljs-keyword">yield</span> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> WaitForEndOfFrame(); } <span class="hljs-keyword">yield</span> <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>; <span class="hljs-keyword">if</span>(onComplete != <span class="hljs-keyword">null</span>) { onComplete(); } } <span class="hljs-keyword">else</span> { <span class="hljs-keyword">if</span> (onComplete != <span class="hljs-keyword">null</span>) { Debug.LogWarning(<span class="hljs-string">"onComplete will not be called when you set \"ignoreTimeScale\" to true. Use Unity's animation handler instead!)"</span>); animation.Play(clipName); } } }</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li></ul><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li></ul>
注:上面这段代码只对Animation有效,那针对Animator我们又如何在timeScale =0的情况下正常播放动画呢?
如果你是想游戏部分暂停,可以把暂停的部分写到FixedUpdate函数里面,不暂停写到Update函数。
<code class="hljs cs has-numbering"><span class="hljs-keyword">float</span> pauseTime =<span class="hljs-number">2</span>f; <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Pause</span>() { <span class="hljs-keyword">if</span> (isProp) { pauseTime -= Time.fixedDeltaTime; <span class="hljs-keyword">if</span> (pauseTime <= <span class="hljs-number">0</span>) { isProp = <span class="hljs-keyword">false</span>; pauseTime = <span class="hljs-number">1</span>f; Time.timeScale = <span class="hljs-number">1</span>; } } } 这个是局部暂停的代码。</code>
相关文章推荐
- unity单例模式
- Unity拖影效果
- unity利用c#读写xml
- unity直接播放mp3
- 3ds Max 烘焙模型导入 Unity 3D 步骤
- 【Unity开发】NGUI动态刷新ScrollView
- Unity Shader Example 6 (区域变色)
- Unity Shader Example 5 (地形混合)
- Unity Shader Example 4 (扭曲)
- unity3D面试汇总
- 法线贴图
- Unity Shader Example 3 (GrabPass捕捉屏幕纹理 )
- unity开发-高通Ar
- Vuforia AR 物体制作阴影
- Unity3d-Particle System系统的学习(二)
- Unity 打包发布Android新手教学 (小白都能看懂的教学 )
- Unity3d--屏幕适配
- Unity Shader学习5 —— Cg语言的基础
- Unity学习日常问题记录九-关于Lookat与模型坐标系的相关的问题以及父子物体的刚体
- 全面理解Unity动态加载和内存管理