Unity中切换场景时传递参数的解决方法

在切换场景时,经常会携带一些数据进入新场景,同时现有的场景会被销毁;为了防止进入新场景时出现遗漏或写错传递参数,和降低两个场景参数传递的耦合,自己写了一套简单的切换方案:

原理很简单,切换前将字典参数写入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 就能读取到之前传入的字典数据了,

萌新第一次写文章,如果觉得有用就请点个赞吧~ 如果有更好的解决办法,欢迎在评论区留言或留下文章链接

    原文作者:Mirage狼
    原文地址: https://blog.csdn.net/MirageWolf/article/details/109755626
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞