写在最前面:Jay 是我花了五天左右时间开发的同名游戏,基础机制借鉴了涂鸦跳跃,具体的参考视频可以点击以下链接
用周杰伦的第一张专辑Jay做了个游戏(祝杰伦118生日快乐)_单机游戏热门视频
这篇日志将记录游戏中如何创建一个简易的暂停和结束菜单。
(一)创建暂停菜单
1) 首先在游戏主场景的 Canvas 下新建一个 Panel 命名为 PauseMenu 。在 Scene 中调整好大小和位置,并在 Inspector 中更改好合适的参数,让其呈现半透明。
2) 接下来给 Canvas 添加脚本 PauseMenu,写入下面的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PauseMenu : MonoBehaviour
{
public static bool GameIsPaused = false;
public GameObject pauseMenuUI;
void Update()
{
// 编辑 ECS 的功能
if (Input.GetKeyDown(KeyCode.Escape))
{
if (GameIsPaused)
{
Resume();
}
else
{
Pause();
}
}
}
// 回到游戏中
public void Resume()
{
pauseMenuUI.SetActive(false);
Time.timeScale = 1f;
GameIsPaused = false;
}
// 暂停游戏
void Pause()
{
pauseMenuUI.SetActive(true);
Time.timeScale = 0f;
GameIsPaused = true;
}
// 重新开始
public void Again()
{
SceneManager.LoadScene("SampleScene");
Resume();
}
// 回到主菜单
public void LoadMenu()
{
SceneManager.LoadScene("Menu");
}
}
这块逻辑比较简单,把整个 PauseMenu 设置为隐藏并拖到 pauseMenuUI 下。 按下 ECS 键, 将 PauseMenu 显示出来,同时 timeScale 会被设置成 0,这样游戏就会暂停。再次按下 ECS 回到游戏,此时只要将 PauseMenu 重新隐藏,并恢复 timeScale 为 1 即可。而重新开始游戏只需要在回到游戏前重载当前的游戏场景。
3) 按照之前介绍过的方法在 Panel 下添加三个 Button。
然后为 Button 添加刚才在脚本中定义好的事件。AgainButton 对应 Again(),MenuButton 对应 LoadMenu(),ESCButton 对应 Resume()。详细的操作方法可以参考我上一篇日志:【Unity】Jay 开发日志(五)——主菜单的创建_u012498719的博客-CSDN博客
做完后隐藏 PauseMenu,就可以正常使用了。
(二)创建结束菜单
1) 步骤同暂停菜单,创建 Panel,添加脚本和 Button。脚本写法略有不同,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class EndMenu : MonoBehaviour
{
public GameObject endMenuUI, Player;
public GameObject[] Text;
void Update()
{
if (Player.GetComponent().isDead)
{
endMenuUI.SetActive(true);
Text[0].SetActive(true);
PauseMenu.GameIsPaused = true;
Player.GetComponent().velocity = Vector3.zero;
Player.GetComponent().gravityScale = 0;
}
if (Player.GetComponentInChildren().isWon)
{
endMenuUI.SetActive(true);
Text[1].SetActive(true);
PauseMenu.GameIsPaused = true;
Player.GetComponent().velocity = Vector3.zero;
Player.GetComponent().gravityScale = 0;
}
}
public void Resume()
{
Time.timeScale = 1f;
PauseMenu.GameIsPaused = false;
}
public void Again()
{
SceneManager.LoadScene("SampleScene");
Resume();
}
public void LoadMenu()
{
SceneManager.LoadScene("Menu");
}
}
这里修改 PauseMenu 中 GameIsPaused 的值的目的是为了防止两个菜单被同时唤出。而对 Player 的刚体下的 velocity 和 gravityScale 的修改是为了防止游戏结束后人物的移动(与暂停游戏不同,游戏结束后平台等环境仍是动态)。
2) 然后还需要在 Canvas 下新建两个 Text, 分别写上游戏成功和失败的文字提示。注意它们不能是 EndMenu 的子类。
选中 Canvas,把 Lose 拖进脚本的 Text[0] 下,把 Win 拖进脚本的 Text[1] 下。到此, Inspector 中显示应如下:
3) 最后,把 EndMenu 以及两个 Text 隐藏,就可以正常使用了。演示效果如下。



