📜  unity Pause Game c# (1)

📅  最后修改于: 2023-12-03 15:20:52.194000             🧑  作者: Mango

Unity 中的 Pause Game C#

在游戏开发中,暂停游戏是一个常见的需求,该操作可用于游戏设置、菜单、过场动画等等。在 Unity 中,可以使用 C# 代码来实现暂停游戏的功能。下面是一些实现暂停游戏的方法及代码实现。

方法一:Time.timeScale

使用 Time.timeScale 属性可以控制游戏的时间尺度,将其设为 0 表示暂停游戏,将其设为 1 表示恢复游戏。代码如下:

if (Input.GetKeyDown(KeyCode.Space))
{
    if (Time.timeScale == 0)
    {
        Time.timeScale = 1;
    }
    else
    {
        Time.timeScale = 0;
    }
}

上面的代码检测了空格键的按下事件,当按下空格键时,如果当前游戏时间尺度为 0,就将其设为 1,否则将其设为 0。

缺点:使用该方法暂停游戏时,不仅仅是游戏的逻辑暂停了,还有音效、动画等都同时暂停了,所以可能会导致不良的用户体验。

方法二:暂停游戏菜单

通过在游戏中添加一个暂停游戏菜单,在选择“暂停”时暂停游戏,在选择“继续”时恢复游戏。需要在菜单中使用 Time.timeScale 属性来实现暂停和恢复游戏。代码如下:

public class PauseMenu : MonoBehaviour
{
    private bool isPaused;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            isPaused = !isPaused;

            if (isPaused)
            {
                PauseGame();
            }
            else
            {
                ResumeGame();
            }
        }
    }

    void PauseGame()
    {
        Time.timeScale = 0;
        // 显示暂停菜单
    }

    void ResumeGame()
    {
        Time.timeScale = 1;
        // 隐藏暂停菜单
    }
}

上面的代码在按下 Escape 键时检测当前游戏状态,如果正在暂停游戏,就继续游戏,否则暂停游戏。

方法三:使用 EventManager

事件管理器是一种机制,用于将消息从一个对象传递到另一个对象,这种机制可以用来实现暂停游戏的功能。

// 在 EventManager.cs 中定义一个 PauseGameEvent 类
public class PauseGameEvent : UnityEvent<bool> {}

// 在另一个脚本中触发该事件
public class PauseGame : MonoBehaviour
{
    public PauseGameEvent onPauseGame = new PauseGameEvent();

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            bool isPaused = !Time.timeScale.Equals(0);
            Time.timeScale = isPaused ? 0 : 1;
            onPauseGame.Invoke(isPaused); // 触发事件
        }
    }
}

// 在另一个脚本中监听该事件
public class Listener : MonoBehaviour
{
    void Start()
    {
        GetComponent<PauseGame>().onPauseGame.AddListener(OnPauseGame);
    }

    void OnPauseGame(bool isPaused)
    {
        if (isPaused)
        {
            // 显示暂停菜单
        }
        else
        {
            // 隐藏暂停菜单
        }
    }
}

上面的代码使用事件管理器,将在一个脚本中触发的事件,在另一个脚本中监听并响应。这种方法可以在游戏逻辑和用户体验方面做出更好的控制。

参考链接:

  • https://docs.unity3d.com/ScriptReference/Time-timeScale.html
  • https://gamedevelopment.tutsplus.com/tutorials/pauseable-time-system-for-unity-5--cms-24142
  • https://blog.mindorks.com/how-to-make-pause-menu-in-unity-9e4c777a7d92