前言
本节主要实现关卡数据渲染,跨场景传数据
关卡数据渲染
简单绘制关卡界面
新增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中实现跨场景传递参数可以通过以下几种方式来实现:
- PlayerPrefs:可以使用PlayerPrefs来存储和获取简单的键值对数据。在第一个场景中将参数存储到PlayerPrefs中,然后在第二个场景中读取这些参数。
- 静态变量或单例模式:你可以创建一个存储参数的静态变量或者单例模式,这样在不同场景中都可以访问和修改这些参数。
- 场景切换时传递参数:在使用SceneManager.LoadScene()方法切换场景时,可以使用SceneManager.LoadScene(场景名称, LoadSceneMode.Single, 参数)来传递参数。在新场景中可以通过SceneManager.GetActiveScene().name来获取当前场景的名称,并根据需要处理传递的参数。
- ScriptableObject:使用ScriptableObject来存储参数数据,并在不同场景之间共享这些ScriptableObject对象。
- 事件系统:使用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)); }
效果
源码
源码不出意外的话我会放在最后一节