20.游戏结束界面

  1. 20.游戏场景-游戏结束界面
    1. 20.1 拼面板
      1. 查看游戏界结束面示例图
      2. 把canvas预制体拉一个出来,创建游戏界面对象,面板中包括背景,标题文本,失败钱文本,ok按钮。
    2. 20.2 界面逻辑
      1. 创建GameOverPanel脚本,继承BasePanel面板基类,挂载到GameOverPanel游戏结束界面预制体上,注意脚本名要和界面名一样。GameOverPanel脚本中定义各个文本和确定按钮变量。GameOverPanel脚本中的Init方法中添加确定按钮事件监听。点击后隐藏游戏结束界面,隐藏游戏界面,清空关卡管理器数据,切换到开始场景。
      2. GameLevelMgr脚本中添加清空方法或。清空当前关卡记录的数据,避免影响下一次切关卡。清空出怪点列表,波数和最大波数设置为0,玩家对象设置为空
      3. GameOverPanel脚本中中添加初始化方法。根据外部传来的钱和是否胜利来设置各个文本,给玩家添加金钱,调用保存玩家数据存储。
      4. 在MainTowerObject脚本中主塔受伤方法中,添加主塔死亡显示游戏结束界面的逻辑,初始化奖励。
      5. 在MonsterObject脚本中,当怪物死亡时检测到游戏胜利,显示游戏结束界面
      6. 在GamePanel脚本中,游戏界面一进来锁定鼠标只能在屏幕内
      7. 在GameOverPanel脚本中,游戏结束界面一进来就设置为无锁定模式
      8. 把游戏结束界面预制体放到Resources文件夹做成预制体
    3. 20.3 代码

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

×

喜欢就点赞,疼爱就打赏