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;
        


    }
}

总结:

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

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值