游戏暂停
1.新建暂停界面
在UICanvas下,新建Panel,命名为PauseMenu
放大Panel,会发现有圆弧,可直接删除Image下的Source Image即可
修改颜色为黑色,更有游戏感
2.添加标题
在PauseMenu下新建Text,表示游戏暂停
设置Text尺寸,并设置BestFit,设置最大显示尺寸,文字显示为暂停游戏,并设置上下和左右居中
3.添加按钮
在Prefabs/UI下,拖动按钮预制体3个到PauseMenu下,改名为btn_resume,btn_levelselect,btn_mainmenu,并修改文字内容如下
如果文字内容过长,超出button,可点击text进行大小调整
4.新建脚本PauseMenu,添加组件到UICanvas上
新建场景参数,表示要跳转到的场景名
public string mainMenuScene; //主界面
public string levelSelectScene; //关卡选择
添加场景管理引用
新建函数,分别跳转到主界面和关卡选择界面
using UnityEngine.SceneManagement;
public void LevelSelectScene()
{
SceneManager.LoadScene(levelSelectScene);
}
public void MainMenuScene()
{
SceneManager.LoadScene(mainMenuScene);
}
绑定按钮函数
- btn_levelselect–>LevelSelectScene()
- btn_mainmenu–>MainMenuScene()
暂停操作
新建参数暂停界面,是否暂停标识
public GameObject pausePanel; //暂停界面
public bool isPause;
Unity中设置参数名,其中LevelSelectScene暂时还没创建,先不设定;PausePanel中将PauseMenu拖过来;可初始化设置PauseMenu为隐藏,同时isPause为false
新建PauseUpPause函数,操作是否暂停游戏
public void PauseUpPause()
{
if(isPause)
{
isPause = false;
pausePanel.SetActive(false);
//游戏正常
Time.timeScale = 1.0f;
}
else
{
isPause = true;
pausePanel.SetActive(true);
//游戏暂停
Time.timeScale = 0f;
}
}
绑定 btn_resume–>PauseUpPause()
在Update中添加Esc键控制
//Esc键
if(Input.GetKeyDown(KeyCode.Escape))
{
PauseUpPause();
}
5.暂停的问题
暂停时切换至主界面或别的界面,再回来时定住,需在切换场景式设置游戏正常
public void LevelSelectScene()
{
SceneManager.LoadScene(levelSelectScene);
//游戏正常
Time.timeScale = 1.0f;
}
public void MainMenuScene()
{
SceneManager.LoadScene(mainMenuScene);
//游戏正常
Time.timeScale = 1.0f;
}
暂停时,虽界面不动,但操作跳跃等,在恢复游戏时,角色还是有变化,需消除这种情况
添加单例
public static PauseMenu sInstance;
private void Awake()
{
sInstance = this;
}
在PlayerController中Update()中,添加判断,将除了动画设置的都包含进来
void Update()
{
if(PauseMenu.sInstance.isPause == false)
{
if (knockBackCounter <= 0)
{
//设置速度 /*GetAxisRaw*/
theRB.velocity = new Vector2(moveSpeed * Input.GetAxis("Horizontal"), theRB.velocity.y);
//检测是否在地面 参数:圆形中心,圆形半径,筛选器(用于检查仅在指定层上的对象)
isGrounded = Physics2D.OverlapCircle(groundCheckPoint.position, .2f, whatIsGround);
if (isGrounded)
{
//在地面时,可以连跳为true
canDoubleJump = true;
}
//跳跃
if (Input.GetButtonDown("Jump"))
{
if (isGrounded) //判断是否在地面
{
theRB.velocity = new Vector2(theRB.velocity.x, jumpForce);
//跳跃音效
AudioManager.sInstance.playSFX(10);
}
else
{
if (canDoubleJump)
{
//不在地面,连跳
theRB.velocity = new Vector2(theRB.velocity.x, jumpForce);
canDoubleJump = false;
//跳跃音效
AudioManager.sInstance.playSFX(10);
}
}
}
//翻转
if (theRB.velocity.x < 0)
{
theSR.flipX = true;
}
else if (theRB.velocity.x > 0)
{
theSR.flipX = false;
}
}
else
{
knockBackCounter -= Time.deltaTime;
if (!theSR.flipX)
{
theRB.velocity = new Vector2(-knockBackForce, theRB.velocity.y);
}
else
{
theRB.velocity = new Vector2(knockBackForce, theRB.velocity.y);
}
}
}
//设置动画中设置的moveSpeed,isGrounded的值
anim.SetFloat("moveSpeed", Mathf.Abs(theRB.velocity.x));
anim.SetBool("isGrounded", isGrounded);
}