Unity 跨场景数据传输

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

}



猜你喜欢

转载自blog.csdn.net/july_unity/article/details/79719724