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

在Unity中,为了解决场景切换时数据丢失问题,本文提出了一种简单方案:使用SceneMgr单例存储参数,SceneXxxInit脚本在新场景加载后读取并初始化。通过调用SceneMgr的方法存入参数,然后加载新场景。新场景的初始化脚本在Awake时读取并清空参数,实现低耦合的数据传递。
摘要由CSDN通过智能技术生成

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

原理很简单,切换前将字典参数写入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; DontDestroyOnL
Unity ,可以使用场景管理器(SceneManager)类来进行场景切换,同也可以通过该类的静态方法 LoadSceneAsync(string sceneName) 来实现带参数的场景切换。 具体步骤如下: 1. 在需要传递参数场景,定义一个公共静态变量(可以是任何类型),并设置初始值。 2. 在需要切换场景的脚本,使用 SceneManager.LoadSceneAsync(string sceneName) 方法来异步加载目标场景。 3. 在加载目标场景,使用 SceneManager.GetSceneByName(string sceneName) 方法获取场景对象,再使用 foreach 循环遍历该场景的所有 GameObject,找到需要传递参数的对象。 4. 找到目标对象后,可以通过 GetComponent<T>() 方法获取该对象的组件,从而修改其属性值。 以下是一个简单的示例代码: ```csharp // 在需要传递参数场景定义一个公共静态变量 public static int score = 0; // 在需要切换场景的脚本异步加载目标场景 public void LoadSceneWithParameter(string sceneName) { SceneManager.LoadSceneAsync(sceneName); } // 在加载目标场景获取场景对象,并遍历其的所有 GameObject void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (scene.name == "TargetScene") { foreach (GameObject obj in scene.GetRootGameObjects()) { // 找到需要传递参数的对象 if (obj.name == "TargetObject") { // 获取该对象的组件,并修改其属性值 TargetComponent target = obj.GetComponent<TargetComponent>(); target.parameter = score; } } } } ``` 需要注意的是,为了触发 OnSceneLoaded() 回调函数,需要在场景管理器注册该函数。可以在脚本的 Awake() 函数添加以下代码: ```csharp void Awake() { SceneManager.sceneLoaded += OnSceneLoaded; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值