暂停游戏的方法比较 Time.timeScale = 0"VS"限定条件
在很多单机游戏中,暂停游戏这个是很常见的,现在我就来总结下我遇见的问题:。
在使用unity 中,我们来暂停游戏。很多人都知道会用 Time.timeScale = 0这个方法来暂停我们的游戏,我之前也是这样使用的。但在用unity自己封装好了的某些函数时候,有时候这个Time.timeScale = 0的方法机不管用了。当然我这个是写在 Update()里面。 我实验了 ,发现有的方法写在Update()中,你想暂停是不行的,不管用。
例如 我写了个脚本用来控制物体一直是向右运动,使用Translate这个方法是可以达到效果的。脚本如下:
using UnityEngine; using System.Collections; public class PauseGame : MonoBehaviour { string tip = "PauseGame"; // Update is called once per frame void Update () { transform.Translate(Vector3.right * Time.deltaTime * 2f); } void OnGUI() { if (GUILayout.Button(tip)) { if (Time.timeScale != 0) { Time.timeScale = 0; tip = "StartGame"; } else if(Time.timeScale==0) { Time.timeScale = 1; tip = "PauseGame"; } } } }
运行效果如下 :

当我点击按钮的时候这个是可以达到暂停游戏的效果,这个方块就会在那暂停,不再继续前进了。
如果我用这个函数就不能达到暂停的效果了。 脚本如下:
using UnityEngine; using System.Collections; public class PauseGame : MonoBehaviour { string tip = "PauseGame"; // Update is called once per frame void Update () { //transform.Translate(Vector3.right * Time.deltaTime * 2f); transform.position = transform.position + transform.TransformDirection(new Vector3(0.05f, 0, 0)); } void OnGUI() { if (GUILayout.Button(tip)) { if (Time.timeScale != 0) { Time.timeScale = 0; tip = "StartGame"; } else if(Time.timeScale==0) { Time.timeScale = 1; tip = "PauseGame"; } } } }
使用 TransformDirection这个方法就不行。还有就是当使用 Time.timeScale = 0 时项目中所有 FixedUpdate() 将不被调用,以及所有与时间有关的函数都失效了。
如果你设置 Time.timeScale = 0,你还想实现一些菜单动画的跳入之类的,可以使用 Time.realtimeSinceStartup 。这个不受 Time.timeScale 影响。
如果想使用TransformDirection 暂停游戏中,可以为所有对象调用 OnPauseGame 函数,代码如下:
using UnityEngine; using System.Collections; public class PauseGame : MonoBehaviour { string tip = "PauseGame"; public bool paused = false; // Update is called once per frame void Update() { //transform.Translate(Vector3.right * Time.deltaTime * 2f); if (!paused) { transform.position = transform.position + transform.TransformDirection(new Vector3(0.05f, 0, 0)); } } void OnPauseGame() { paused = !paused; if (paused) { tip = "StartGame"; } else { tip = "PauseGame"; } } void OnGUI() { if (GUILayout.Button(tip)) { Object[] objects = FindObjectsOfType(typeof(GameObject)); foreach (GameObject go in objects) { go.SendMessage("OnPauseGame", SendMessageOptions.DontRequireReceiver); } } } }
其实实现这个的主要思路就是让物体的运动有一个限定条件,这样当满足这个条件我们就可以执行运动的那个方法,当不满足的话就不会执行。原理就是这个。
现在来解释下上面的代码, 就是当我点击按钮后,把按钮显示的内容调换。 寻找所有用了这个脚本的物体,发送一个消息,执行OnPauseGame()函数,后面的意思就是不需要接收器的意思,这个大家可以查看API。

浙公网安备 33010602011771号