20.游戏场景-游戏结束界面
20.1 拼面板
查看游戏界结束面示例图
把canvas预制体拉一个出来,创建游戏界面对象,面板中包括背景,标题文本,失败钱文本,ok按钮。
20.2 界面逻辑
创建GameOverPanel脚本,继承BasePanel面板基类,挂载到GameOverPanel游戏结束界面预制体上,注意脚本名要和界面名一样。GameOverPanel脚本中定义各个文本和确定按钮变量。GameOverPanel脚本中的Init方法中添加确定按钮事件监听。点击后隐藏游戏结束界面,隐藏游戏界面,清空关卡管理器数据,切换到开始场景。
public class GameOverPanel : BasePanel
{
public Text txtWin; // 显示胜利或失败的文本框
public Text txtInfo; // 显示奖励信息的文本框
public Text txtMoney; // 显示奖励金额的文本框
public Button btnSure; // 确定按钮
public override void Init()
{
btnSure.onClick.AddListener(() => {
// 点击确定按钮后执行以下操作
// 隐藏游戏结束面板
UIManager.Instance.HidePanel<GameOverPanel>();
// 隐藏游戏面板
UIManager.Instance.HidePanel<GamePanel>();
// 清空当前关卡的数据
GameLevelMgr.Instance.ClearInfo();
// 切换到开始场景
SceneManager.LoadScene("BeginScene");
});
}
}
GameLevelMgr脚本中添加清空方法或。清空当前关卡记录的数据,避免影响下一次切关卡。清空出怪点列表,波数和最大波数设置为0,玩家对象设置为空
/// <summary>
/// 清空当前关卡记录的数据 避免影响下一次切关卡
/// </summary>
public void ClearInfo()
{
points.Clear();
nowWaveNum = maxWaveNum = 0;
player = null;
}
GameOverPanel脚本中中添加初始化方法。根据外部传来的钱和是否胜利来设置各个文本,给玩家添加金钱,调用保存玩家数据存储。
public void InitInfo(int money, bool isWin)
{
// 根据传入的参数初始化面板信息
// 如果获胜,显示"通关";否则显示"失败"
txtWin.text = isWin ? "通关" : "失败";
// 如果获胜,显示"获得胜利奖励";否则显示"获得失败奖励"
txtInfo.text = isWin ? "获得胜利奖励" : "获得失败奖励";
// 显示奖励金额
txtMoney.text = "¥" + money;
// 根据奖励改变玩家数据
// 将获得的奖励金额加到玩家拥有的金额上
GameDataMgr.Instance.playerData.haveMoney += money;
// 保存玩家数据
GameDataMgr.Instance.SavePlayerData();
}
在MainTowerObject脚本中主塔受伤方法中,添加主塔死亡显示游戏结束界面的逻辑,初始化奖励。
//自己受到伤害
public void Wound(int dmg)
{
//如果保护区域已经被打死 就没有必要再减血了
if (isDead)
return;
//受到伤害
hp -= dmg;
//死亡逻辑
if( hp <= 0 )
{
hp = 0;
isDead = true;
//游戏结束
GameOverPanel panel = UIManager.Instance.ShowPanel<GameOverPanel>();
//得到奖励的一半
panel.InitInfo((int)(GameLevelMgr.Instance.player.money * 0.5f), false);
}
//更新血量
UpdateHp(hp, maxHp);
}
在MonsterObject脚本中,当怪物死亡时检测到游戏胜利,显示游戏结束界面
//死亡动画播放完毕后 会调用的事件方法
public void DeadEvent()
{
//死亡动画播放完毕后移除对象
//之后有了关卡管理器再来处理
//GameLevelMgr.Instance.ChangeMonsterNum(-1);
//从列表中移除怪物
GameLevelMgr.Instance.RemoveMonster(this);
//在场景中移除已经死亡的对象
Destroy(this.gameObject);
//怪物死亡时 检测 游戏是否胜利
if(GameLevelMgr.Instance.CheckOver())
{
//显示结束界面
GameOverPanel panel = UIManager.Instance.ShowPanel<GameOverPanel>();
panel.InitInfo(GameLevelMgr.Instance.player.money, true);
}
}
在GamePanel脚本中,游戏界面一进来锁定鼠标只能在屏幕内
public override void Init()
{
//监听按钮事件
btnQuit.onClick.AddListener(() =>
{
//隐藏游戏界面
UIManager.Instance.HidePanel<GamePanel>();
//返回到开始界面
SceneManager.LoadScene("BeginScene");
//其它
});
//一开始隐藏下方和造塔相关的UI
botTrans.gameObject.SetActive(false);
//锁定鼠标
Cursor.lockState = CursorLockMode.Confined;
}
在GameOverPanel脚本中,游戏结束界面一进来就设置为无锁定模式
public override void ShowMe()
{
base.ShowMe();
// 设置鼠标锁定模式为无锁定
Cursor.lockState = CursorLockMode.None;
}
把游戏结束界面预制体放到Resources文件夹做成预制体
20.3 代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameOverPanel : BasePanel
{
public Text txtWin; // 显示胜利或失败的文本框
public Text txtInfo; // 显示奖励信息的文本框
public Text txtMoney; // 显示奖励金额的文本框
public Button btnSure; // 确定按钮
public override void Init()
{
btnSure.onClick.AddListener(() => {
// 点击确定按钮后执行以下操作
// 隐藏游戏结束面板
UIManager.Instance.HidePanel<GameOverPanel>();
// 隐藏游戏面板
UIManager.Instance.HidePanel<GamePanel>();
// 清空当前关卡的数据
GameLevelMgr.Instance.ClearInfo();
// 切换到开始场景
SceneManager.LoadScene("BeginScene");
});
}
public void InitInfo(int money, bool isWin)
{
// 根据传入的参数初始化面板信息
// 如果获胜,显示"通关";否则显示"失败"
txtWin.text = isWin ? "通关" : "失败";
// 如果获胜,显示"获得胜利奖励";否则显示"获得失败奖励"
txtInfo.text = isWin ? "获得胜利奖励" : "获得失败奖励";
// 显示奖励金额
txtMoney.text = "¥" + money;
// 根据奖励改变玩家数据
// 将获得的奖励金额加到玩家拥有的金额上
GameDataMgr.Instance.playerData.haveMoney += money;
// 保存玩家数据
GameDataMgr.Instance.SavePlayerData();
}
public override void ShowMe()
{
base.ShowMe();
// 设置鼠标锁定模式为无锁定
Cursor.lockState = CursorLockMode.None;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com