Unity 跨场景数据传输

本文介绍了在Unity中实现跨场景数据保存的三种方法:单例模式、静态字段及PlayerPrefs。通过具体代码示例展示了如何在不同场景间传递和读取数据。

1.使用单例模式,DontDestroyOnLoad (go);  对象保存信息

using UnityEngine;

using System.Collections;

// 对象数据想被跨场景后保存,只能采用,DontDestroyOnLoad (go); 方法保存数据,数据保存在堆中

// 拖入场景多个,但是只有一个起作用

public class C : MonoBehaviour {


public int age;
private C(){
}
private static C _instance;
/// <summary>
/// Gets the instance.
/// </summary>
/// <returns>The instance.</returns>
public static C GetInstance(){
GameObject g = GameObject.Find ("InstanceC");
if (g == null) {
GameObject go = new GameObject ();
go.name = "InstanceC";
DontDestroyOnLoad (go);
if (_instance == null) {
if (go.GetComponent<C> () == null) {
// 通过脚本 自动添加对象,必须先实例化,否则是空,无法保存信息,没有申请空间
_instance = new C ();
go.AddComponent<C> ();
}
} else {

                                   return _instance;
}
}


return _instance;
}
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}


}

2.使用静态字段

using UnityEngine;
using System.Collections;
   //继承 MONO 和不继承数据保存没区别,只是差在,能否拖入场景

   //手动拖入场景相当与做了实例化

   // 即使手动拖入场景多个,单只有一个静态字段是有作用,对象数据是用多个的

public class G :MonoBehaviour

//静态的是全局的,和对象没有关系;即使跨场景数据也会保存,静态数据是保存在类的,在静态区

  // 静态数据在面板显示不出来的

public static int m;
       //对象数据,有对象才能保存对应的数据;
public  int Z;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}

}

3.使用 PlayerPrefs 保存数据

                场景1 set;

                PlayerPrefs.SetFloat("hight",10.5f);
PlayerPrefs.SetInt ("age", 100);

PlayerPrefs.SetString ("name", "xixi");

               场景2 get

                int age= PlayerPrefs.GetInt ("age");
float hight =PlayerPrefs.GetFloat ("hight", 0f);
string name = PlayerPrefs.GetString ("name");

场景1中对数据赋值:

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class D : MonoBehaviour {
C cc;
G g ;
// Use this for initialization
void Start () {
C.GetInstance ();
       C.GetInstance ().age = 90;


G.m = 1000;
g = GetComponent<G> ();
g.Z = 100;
     
                  

                PlayerPrefs.SetFloat("hight",10.5f);
PlayerPrefs.SetInt ("age", 100);
PlayerPrefs.SetString ("name", "xixi");



}

// Update is called once per frame
void Update () {
//Debug.Log (C.GetInstance ().age);
//Debug.Log (G.m);
//Debug.Log (g.Z);
}
public void OnBtnClick() {
SceneManager.LoadScene ("2");
}

}


场景2中对数据取值测试

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class E : MonoBehaviour {
public static int m;
G g ;
// Use this for initialization
void Start () {
C.GetInstance ();
g = GetComponent<G> ();
     //g.Z = 100;

                int age= PlayerPrefs.GetInt ("age");
float hight =PlayerPrefs.GetFloat ("hight", 0f);
string name = PlayerPrefs.GetString ("name");
}

// Update is called once per frame
void Update () {
//Debug.Log (C.GetInstance().age);
Debug.Log (G.m);
//Debug.Log (g.Z);
}
public void OnBtnClick() {
SceneManager.LoadScene ("1");
}

}



### Unity 中实现不同场景之间数据传输的方法 #### 使用泛型单例模式传递数据 通过创建一个不会随场景切换而销毁的单例类来保存需要共享的数据。这种方式可以确保即使在场景转换过程中,数据也不会丢失。 ```csharp using UnityEngine; /// <summary> /// 不会随着场景变化而被销毁的单例基类 /// </summary> /// <typeparam name="T"></typeparam> public class Singleton<T> : MonoBehaviour where T : Component { private static T _instance; public static T Instance { get { if (_instance == null) { var objs = FindObjectsOfType(typeof(T)) as T[]; if (objs.Length >= 1) _instance = objs[0]; if (_instance == null || GameObject.FindObjectOfType(typeof(T)) == null) { Debug.LogWarning("[Singleton] There is no instance of " + typeof(T).ToString() + ", A new instance will be created!"); GameObject singletonObject = new GameObject(); _instance = singletonObject.AddComponent<T>(); singletonObject.name = "(singleton)" + typeof(T).ToString(); DontDestroyOnLoad(singletonObject); } } return _instance; } } } ``` 此代码定义了一个通用的单例模板 `Singleton<T>`[^1],其中包含了获取唯一实例的方法以及防止重复创建逻辑。为了使对象不受限于特定场景,在 `_instance` 被设置之后调用了 `DontDestroyOnLoad()` 函数。 #### 利用静态成员变量进行简单的数据交换 对于较为简单的情况,可以直接利用 C# 提供的静态字段特性来进行场景通信: ```csharp public class DataHolder { public static string SharedData; // 可以根据需求更改为其他类型或多个属性 } ``` 当希望在一个场景中写入某些信息以便后续访问时,只需修改上述公共静态字段即可;而在另一个场景里,则可以通过相同的方式读取这些值[^2]。 这两种方案各有优缺点:前者更加灵活可控,适合复杂项目结构下的长期维护;后者则更为轻量级,适用于小型应用快速开发阶段的需求满足。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值