【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)

简介: 【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)

前言

本节主要实现关卡进度条的功能

绘制进度条UI

控制关卡进度测试

新增ProgressPanel代码,控制关卡进度

public class ProgressPanel : MonoBehaviour
{
    private GameObject progress;
    private GameObject head;
    private TextMeshProUGUI levelText;
    private GameObject flagPrefab;//旗帜预制体

    void Start()
    {
        progress = transform.Find("进度条").gameObject;
        head = transform.Find("僵尸头").gameObject;
        levelText = transform.Find("关卡文本").gameObject.GetComponent<TextMeshProUGUI>();
        flagPrefab = Resources.Load("Prefabs/UI/旗帜") as GameObject;

        //TODO:测试
        SetPercent(0.2f);
        SetFlagPercent(0.4f);
        SetFlagPercent(0.6f);
        SetFlagPercent(0.8f);
        SetLevelText(1);
    }

    //设置进度条和僵尸头位置
    public void SetPercent(float per)
    {
        // 图片进度条
        progress.GetComponent<Image>().fillAmount = per;
        // 进度条宽度
        float width = progress.GetComponent<RectTransform>().sizeDelta.x;
        float rightX = width / 2;
        // 设置头的x轴位置:最右边的位置 - 进度条宽度*进度值
        head.GetComponent<RectTransform>().localPosition = new Vector2(rightX - per * width, 0);
    }

    //设置旗帜位置
    public void SetFlagPercent(float per)
    {
        // 进度条宽度
        float width = progress.GetComponent<RectTransform>().sizeDelta.x;
        float rightX = width / 2;
        // 创建新的旗子
        GameObject newFlag = Instantiate(flagPrefab);
        //false:表示保持newFlag相对于世界坐标的位置、旋转和缩放不变,即不将newFlag的局部坐标和旋转值随着父级对象的变化而改变。
        newFlag.transform.SetParent(transform, false);
        // 设置位置
        newFlag.GetComponent<RectTransform>().localPosition = new Vector2(rightX - per * width, 7f);
        //把Head对象在其父级对象中的层级顺序置于最后,也就是显示在所有其他同级对象的最上方。
        head.transform.SetAsLastSibling();
    }

    //设置关卡文本
    public void SetLevelText(int per){
        levelText.text = "关卡 " + per;
    }
}

配置信息

测试运行效果,可以看到旗帜生成位置和进度条都正常

按配置表使用关卡进度变化

首先去除前面的测试代码,修改UIManager

public class UIManager : MonoBehaviour
{
    public static UIManager Instance { get; private set; }
    public TextMeshProUGUI sunSumText;
    public ProgressPanel progressPanel;
    int zombieDiedCount = 0;//死亡僵尸数量
    
    private void Awake()
    {
        Instance = this;
    }

    private void Start()
    {
        Init();
        zombieDiedCount = 0;
        InitProgressPanel();
    }

    public void Init()
    {
        sunSumText.text = GameManager.Instance.sunSum.ToString();
    }

    //初始化进度条
    public void InitProgressPanel()
    {
        // 初始化进度为0
        progressPanel.SetPercent(0);

        int count = GameManager.Instance.listData.Count;
        string progressId = GameManager.Instance.listData[0]["progressId"];
        // 遍历数据列表,设置旗帜的位置
        for (int i = 0; i < count; i++)
        {
            // 获取当前字典数据
            Dictionary<string, string> dic = GameManager.Instance.listData[i];
            if (progressId != dic["progressId"])
            {
                progressPanel.SetFlagPercent((float)i / count);
            }
            progressId = dic["progressId"];
        }
    }

    //更新进度
    public void UpdateProgressPanel()
    {
        zombieDiedCount++;
        progressPanel.SetPercent((float)zombieDiedCount / GameManager.Instance.listData.Count);
    }
}

修改GenerateZombies里的ZombieDied方法,每次僵尸死亡时调用UpdateProgressPanel方法,更新UI进度,当然你也可以在僵尸生成时调用,具体看你的需求

//更新进度UI
UIManager.Instance.UpdateProgressPanel();

效果

image.png

源码

源码不出意外的话我会放在最后一节

目录
相关文章
|
6天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
17 2
|
6天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
16 2
|
6天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
7 0
|
6天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
13 0
|
6天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
17 2
|
6天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
21 0
|
6天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
11 1
|
6天前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
12 0
|
6天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
12 0
|
6天前
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
10 0