Unity3D之游戏暂停制作⽅法记录
在游戏开发中我们⼀般都需要涉及到⼀个功能:游戏暂停,但是这⾥指的暂停仅仅是核⼼模块的暂停,并不是整个游戏都暂停,⽐如⼀些UI 和UI上的动画与特效是不能被暂停的,整个游戏都暂停了玩家该如何继续游戏呢。
这⾥我们主要讨论Unity的游戏暂停实现。
使⽤timeScale
我们通过设定Time.timeScale的值可以影响到整个游戏的播放速率。
但是请注意,⽆论timeScale是多少都不会影响到Update、LateUpdate这2个⽅法的执⾏速度,⽽是会影响到Time.time和Time.deltaTime的值。
⽐如将timeScale设定为0、1、2等等时,Update和LateUpdate的调⽤频率是不会变的,但是Time.time及Time.deltaTime会受其影响。
当timeScale为0时,time为不继续累加时间,deltaTime为0;
当timeScale为1时,time为正常累计时间,deltaTime为正常时间;
当timeScale为2时,time为加倍累计时间,deltaTime为正常时间的两倍;
⽽对于物理⽅⾯的FixedUpdate则会由于timeScale的变换⽽影响到其调⽤的频率。
当timeScale为0时,FixedUpdate将不会再被调⽤;
当timeScale为1时,FixedUpdate正常按时间间隔调⽤;
当timeScale为2时,FixedUpdate按两倍速度调⽤;
不推荐使⽤timeScale来实现暂停
timeScale控制者整个游戏的时间缩放,修改它除了会影响到Time.time和Time.deltaTime外,还会影响到游戏的物理模拟,虽然诸如NGUI等⽀持ingoreTimeScale的属性,但是最好不使⽤timeScale = 0的⽅式来实现暂停。
同时timeScale还会影响到⾳乐播放及粒⼦效果,可以参考:
要实现慢动作播放等效果可以考虑使⽤timeScale,如果可以,最好⾃⼰实现⼀个timeScale,其只会影响到特定的模块,毕竟影响到全局的timeScale可能会造成⼀些难以察觉的坑。
我使⽤的暂停⽅法
由于我只需要暂停,不需要加速或慢速播放的效果,所以⾃⼰实现是最好的,如下:
1using UnityEngine;
2
3///<summary>
4///⽀持暂停的 MonoBehaviour 基类.
5///游戏中需要暂停功能的逻辑都应该继承该类并将逻辑写到 OnUpdate 及 OnLateUpdate ⽅法中, 这两个⽅法在设置为暂停时不会被调⽤.
6///</summary>
7public class PausingBehaviour : MonoBehaviour
8 {
9///<summary>
10///是否暂停逻辑处理.
11///</summary>
12public static bool pause { get; set; }
13
14static PausingBehaviour()
15 {
16 pause = false;
17 }
18
19private bool _isPaused;
20
21protected virtual void OnEnable()
22 {
23 _isPaused = pause;
24 }
25
26protected virtual void Update()
27 {
如何制作游戏28if(!pause)
29 {
30if(_isPaused)
31 {
32 _isPaused = false;
33this.OnPauseExit();
34 }
35
36this.OnUpdate();
37 }
38else
39 {
40if(!_isPaused)
41 {
42 _isPaused = true;
43this.OnPauseEnter();
44 }
45 }
46 }
47
48///<summary>
49///可暂停的逻辑更新⽅法.
50///</summary>
51protected virtual void OnUpdate()
52 {
53 }
54
55protected virtual void LateUpdate()
56 {
57if(!pause)
58 {
59this.OnLateUpdate();
60 }
61 }
62
63///<summary>
64///可暂停的逻辑更新⽅法.
65///</summary>
66protected virtual void OnLateUpdate()
67 {
68 }
69
70///<summary>
71///暂停开始时会调⽤该⽅法.
72///</summary>
73protected virtual void OnPauseEnter()
74 {
75 }
76
77///<summary>
78///暂停结束时会调⽤该⽅法.
79///</summary>
80protected virtual void OnPauseExit()
81 {
82 }
83 }
所有需要暂停功能的脚本都继承⾃该类,帧逻辑写在OnUpdate及OnLateUpdate⾥,同时还有OnPauseEnter和OnPauseExit⽅法来表⽰是否进⼊和离开暂停状态。
当设定PausingBehaviour.pause = false时,OnUpdate及OnLateUpdate将不会被调⽤,⽽OnPauseEnter会被调⽤⼀次,这⾥可以对粒⼦效果等进⾏暂停,反之设定PausingBehaviour.pause = true时也⼀样。
⼿游强制暂停
这⾥额外提⼀下,⼿机游戏中来电话或锁屏或退出到桌⾯时,可以接受到Unity对应的事件,这⾥需要对游戏进⾏⼀下“强制暂停”,另外如果“强制暂停”时间过长,⽹络游戏有时得重新登录等事件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论