在切换场景时,经常会携带一些数据进入新场景,同时现有的场景会被销毁;为了防止进入新场景时出现遗漏或写错传递参数,和降低两个场景参数传递的耦合,自己写了一套简单的切换方案:
原理很简单,切换前将字典参数写入SceneMgr,切换后在脚本中读取即可
该方案包含2种脚本, SceneManager 与 SceneXxxInit 脚本:
-SceneMgr设为单例,用于写入参数以及切换各种场景
-SceneXxxInit为场景初始化脚本,挂在在每个不同的场景中,进入新场景后先读取SceneMgr的参数,然后在Awake中初始化场景
超级简单的使用过程:
1 调用ToNewScene("场景名",字典参数)
方法,把需要写入的参数存入SceneMgr类
中,然后加载新场景
2 进入新场景后,SceneXxxInit类
读取并清空SceneMgr类
里的参数,然后根据该参数设置新场景内容,完成初始化
具体步骤:
1、建立SceneMgr类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//场景管理类
public class SceneMgr : MonoBehaviour {
//单例
public static SceneMgr ins;
private void Awake() {
if (ins == null) { ins = this; DontDestroyOnLoad(this); }
else if (ins != this) { Destroy(gameObject); }
}
//传输数据
Dictionary<string, object> sceneOneshotData = null;
//设置数据
private void WriteSceneData(Dictionary<string, object> data) {
if (sceneOneshotData != null) {
Debug.LogError("切换数据不为空,上一次切换场景的数据没有被读取");
}
sceneOneshotData = data;
}
//取出数据
public Dictionary<string, object> ReadSceneData() {
Dictionary<string, object> tempData = sceneOneshotData;
sceneOneshotData = null;//清空
return tempData;
}
//前往新场景
public void ToNewScene(string sceneName, Dictionary<string, object> param = null) {
//写入数据
this.WriteSceneData(param);
//加载新场景
SceneManager.LoadScene(sceneName);
}
}
2、建立SceneBInit类(其他场景的初始化函数),挂在新场景的任意组件中
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SceneBInit : MonoBehaviour {
private void Awake() {
//从SceneMgr中读取数据
Dictionary<string, object> param = SceneMgr.ins.ReadSceneData();
//其他函数
//...
}
}
3、测试脚本
新建脚本Test,挂载到任意对象上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
Dictionary<string, object> param = new Dictionary<string, object>();
param.Add("EnemyCount", 250);
param.Add("Type", 3);
SceneMgr.ins.ToNewScene("SceneA", param);
}
}
}
运行后,按F切换场景,SceneBInit 就能读取到之前传入的字典数据了,
萌新第一次写文章,如果觉得有用就请点个赞吧~ 如果有更好的解决办法,欢迎在评论区留言或留下文章链接