暂停游戏的方法比较 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。

posted @ 2013-06-14 15:55  与现实冲突  阅读(1374)  评论(0)    收藏  举报