📅  最后修改于: 2023-12-03 15:20:52.194000             🧑  作者: Mango
在游戏开发中,暂停游戏是一个常见的需求,该操作可用于游戏设置、菜单、过场动画等等。在 Unity 中,可以使用 C# 代码来实现暂停游戏的功能。下面是一些实现暂停游戏的方法及代码实现。
使用 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.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
{
// 隐藏暂停菜单
}
}
}
上面的代码使用事件管理器,将在一个脚本中触发的事件,在另一个脚本中监听并响应。这种方法可以在游戏逻辑和用户体验方面做出更好的控制。
参考链接: