Unity3d跨场景传输数据的2种方法

Unity3d在切换场景的数据,数据会重新加载,上一关的场景所产生的数据也不会自动加载到新场景中,在此介绍2种跨场景传输数据的2种方法。(PlayerPrefs与单例模式)

本人搭建两个简单的场景演示该2种方法,将SceneA场景中2个输入框的值传入到SceneB场景中,并由SceneB中的2个text文本显示。

第一个场景:SceneA

第二个场景:SceneB

方法1:使用PlayerPrefs

Unity官网中关于PlayerPrefs的介绍:PlayerPrefs是一个在游戏会话之间存储玩家首选项的类。可以将字符串(string)、浮点数(flaot)和整数(int)值存储到用户的平台注册表中。

但如果是其他较为复杂的数据结构,则需要根据设计的要求,合理使用。

1:给SceneA场景中的摄像机挂载脚本SceneAScripts.cs

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class SceneAScripts : MonoBehaviour
{
    public InputField Account;
    public InputField Password;


    public void Login1()
    {
        if (Account.text != null && Password.text != null)
        {
            PlayerPrefs.SetString("Name", Account.text);
            PlayerPrefs.SetString("Password", Password.text);
            SceneManager.LoadScene("SceneB");
        }
    }
}

PlayerPrefs.SetString("Name", Account.text);

PlayerPrefs.SetString("Password", Password.text);

即使用PlayerPrefs存储用户名与密码数据到本地中,

存储数据的格式可以理解为:PlayerPrefs.Set***(“PlayerPrefs用于存储的变量”,需要存储的数据)

***可以是string类型,float类型,int类型。

代码中的数据均为string类型的数据,所以使用PlayerPrefs.SetString函数。

给场景中唯一的一个Button按钮绑定一个点击事件,即摄像机上SceneAScripts脚本中的Login1函数。

2:给SceneB场景中的摄像机挂载脚本SceneBScripts.cs

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class SceneBScripts : MonoBehaviour
{

    public Text NameShow;
    public Text PasswordShow;

    

    void Start()
    {
        DataShow1();
    }

    
    void Update()
    {
        
    }

    public void DataShow1()
    {
        string name = PlayerPrefs.GetString("Name");
        string passowrd = PlayerPrefs.GetString("Password");
        NameShow.text = "姓名:" + name;
        PasswordShow.text = "密码:" + passowrd;
        PlayerPrefs.DeleteAll();


    }
}

string name = PlayerPrefs.GetString("Name");
string passowrd = PlayerPrefs.GetString("Password");

即使用

即使用PlayerPrefs读取用户名与密码数据,并存储进name与password局部变量中。

读取数据的格式可以理解为:PlayerPrefs.Get***(“PlayerPrefs用于存储的变量”)

***可以是string类型,float类型,int类型。

方法2:使用单例模式

单例模式主要是指面向对象中类的单例,类可以创建出许多实例,每个实例可以调用类中设计好的成员变量与成员函数。单例是指类有且只有一个实例,该实例在切换场景后,其中的数据值并不会发生变化。Unity中创建出的每一个脚本文件,即是一个类。

在场景A摄像机上挂载的SceneAScripts脚本,也是一个类,我们设计该类的单例,创建出成员变量,用于存储我们所需要传输的数据。场景B摄像机上挂载的SceneBScripts脚本即可调用SceneAScripts单例,获取我们想要的数据。

1:给SceneA场景中的摄像机挂载脚本SceneAScripts.cs

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class SceneAScripts : MonoBehaviour
{
    public InputField Account;
    public InputField Password;
    
    // 创建该类单例
    public static SceneAScripts Instance;
    //该两个变量用于存储我们需要的数据,即账号与密码
    public string name1;
    public string password1;

    private void Awake()
    {
        //绑定一下该单例
        Instance = this;
    }



    public void Login2()
    {
        if (Account.text != null && Password.text != null)
        {
            Instance.name1 = Account.text;
            Instance.password1 = Password.text;
            SceneManager.LoadScene("SceneB");
        }
    }


}

给场景中唯一的一个Button按钮绑定一个点击事件,即摄像机上SceneAScripts脚本中的Login2函数。

2:给SceneB场景中的摄像机挂载脚本SceneBScripts.cs

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class SceneBScripts : MonoBehaviour
{

    public Text NameShow;
    public Text PasswordShow;

    

    void Start()
    {
        DataShow2();
    }

    
    void Update()
    {
        
    }


    public void DataShow2()
    {
        //将SceneAScripts单例数据赋值给局部变量
        string name = SceneAScripts.Instance.name1;
        string passowrd = SceneAScripts.Instance.password1;
        NameShow.text = "姓名:" + name;
        PasswordShow.text = "密码:" + passowrd;
        


    }
}

总结:

跨场景传输数据的方式有很多种,具体还是根据项目的设计需求来选择。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值