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

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

前言

本节主要实现关卡数据渲染,跨场景传数据

关卡数据渲染

简单绘制关卡界面

新增Level场景,绘制关卡界面

关卡数据配置

新增LevelList,使用ScriptableObject配置关卡列表数据

//关卡列表数据
[CreateAssetMenu(fileName = "LevelList", menuName = "LevelList", order = 0)]
public class LevelList : ScriptableObject
{
    // 存储卡牌数据的列表
    public List<Item> list = new List<Item>();
}

// 表示单个关卡的数据
[System.Serializable]
public class Item
{
    public string levelId; //关卡ID
    public string name; //名称
    public Sprite sprite;//图片
    public Sprite bgSprite;//背景图片
}

配置

新增Level,渲染关卡数据

public class Level : MonoBehaviour
{
    public static Level Instance;
    public GameObject prefab;//模板预制体
    [SerializeField] private SceneField _levelScene;//加载场景
    public LevelList levelList;

    private void Awake() {
        Instance = this;
    }

    private void Start()
    {
        //渲染关卡数据
        for (int i = 0; i < levelList.list.Count; i++)
        {
            GameObject go = Instantiate(prefab);
            go.transform.SetParent(transform, false);
            go.transform.Find("image").gameObject.GetComponent<Image>().sprite = levelList.list[i].sprite;
            go.transform.Find("num").gameObject.GetComponent<TextMeshProUGUI>().text = "1 - " + levelList.list[i].levelId;
            go.transform.Find("name").gameObject.GetComponent<TextMeshProUGUI>().text = levelList.list[i].name;
            
            int index = i; // 创建新的变量来捕获当前的循环变量值
            go.GetComponent<Button>().onClick.AddListener(() => StartGame(levelList.list[index]));
        }
    }

    public void StartGame(Item data)
    {
        SceneManager.LoadScene(_levelScene);
    }
}

配置参数

运行效果

跨场景传数据

在Unity中实现跨场景传递参数可以通过以下几种方式来实现:


  1. PlayerPrefs:可以使用PlayerPrefs来存储和获取简单的键值对数据。在第一个场景中将参数存储到PlayerPrefs中,然后在第二个场景中读取这些参数。


  1. 静态变量或单例模式:你可以创建一个存储参数的静态变量或者单例模式,这样在不同场景中都可以访问和修改这些参数。


  1. 场景切换时传递参数:在使用SceneManager.LoadScene()方法切换场景时,可以使用SceneManager.LoadScene(场景名称, LoadSceneMode.Single, 参数)来传递参数。在新场景中可以通过SceneManager.GetActiveScene().name来获取当前场景的名称,并根据需要处理传递的参数。


  1. ScriptableObject:使用ScriptableObject来存储参数数据,并在不同场景之间共享这些ScriptableObject对象。


  1. 事件系统:使用Unity的事件系统(例如EventSystem)来发送和接收参数,从而实现跨场景的参数传递。

以上是一些常见的方法,你可以根据具体情况选择适合你的场景跳转和参数传递方式。

这里我就使用第二种方式最简单,新增LevelItemData代码,用于存储关卡数据

public class LevelItemData : MonoBehaviour
{
    public static LevelItemData Instance;
    [HideInInspector] public Item item;

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            //在场景切换时不销毁该对象
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

配置

修改Level ,赋值item

public void StartGame(Item data)
{
    LevelItemData.Instance.item = data;
    SceneManager.LoadScene(_levelScene);
}

这样在游戏场景,就可以通过item获取关卡数据,修改GameManager

private void Awake()
{
    curLevelId = int.Parse(LevelItemData.Instance.item.levelId);

    Instance = this;
    //初始化配置表
    GameConfigManager.Instance.Init();
    //获取当前关卡数据
    listData = GameConfigManager.Instance.GetLevelList(curLevelId.ToString());
    if(listData == null)Debug.Log("没有配置关卡数据");
}

修改UIManager,配置背景图片

private void Start()
{
    //配置背景
    spriteRenderer.sprite = LevelItemData.Instance.item.bgSprite; 

    Init();
    zombieDiedCount = 0;
    InitProgressPanel();
    
    cardPanel.SetActive(true);
    cardPanel.transform.DOMove(cardPanel.transform.position, 2f).From(new Vector2(0, 0));
}

效果

源码

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

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