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;
}
}