首页 > 代码库 > 【Unity3D游戏开发】—— PlayerPrefs类实现本地持久化数据存储

【Unity3D游戏开发】—— PlayerPrefs类实现本地持久化数据存储

在很多游戏中都会有“存储进度”,“读取进度”等菜单,或者当我们进入下一个场景时有些数据需要带入下一个场景。这就需要数据储存。Unity中提供了一个用于本地持久化保存于读取数据的类——PlayerPrefs。 它是以键值对的形式将数据保存在文件中。

下面来看看PlayerPrefs的简单用法。、
        //得到存储的数据
        Grade = PlayerPrefs.GetFloat("mGrade", 0.0f).ToString();  //获取浮点型
        Age = PlayerPrefs.GetInt("mAge", 0).ToString();  //获取整型
        Name = PlayerPrefs.GetString("mName", "");    //获取字符串

        //储存数据
        PlayerPrefs.SetString("mName", Name);   //设置字符串
        PlayerPrefs.SetInt("mAge", int.Parse(Age)); //设置整型
        PlayerPrefs.SetFloat("mGrade", float.Parse(Grade));  //设置浮点型

从上面例子就反应了PlayerPrefs的基本特征
1.存储方式以键值对存储,类似于数据字典
2.读取也是以键值对来读取,若无则返回默认值
3.PlayerPrefs类可保存三种类型,浮点型,整型,字符串型.

下面是一个小例子,在场景1输入数据,跳转到场景2来显示数据。
场景1代码:
using UnityEngine;
using System.Collections;

public class Scene1 : MonoBehaviour {

    //储存持久化数据显示
    //可以保存3种类型,浮点型,整型,字符串型
    public string Grade;
    public string Age;
    public string Name;

    //图片贴图
    public Texture image;

    void Start()
    {
        //得到存储的数据
        Grade = PlayerPrefs.GetFloat("mGrade", 0.0f).ToString();
        Age = PlayerPrefs.GetInt("mAge", 0).ToString();
        Name = PlayerPrefs.GetString("mName", "");
    }

    void OnGUI()
    {
        //一张图片贴图
        GUI.DrawTexture(new Rect((Screen.width - image.width) / 2, 20, 120, 120), image);
        //输入姓名
        GUILayout.Label("----请输入姓名-----", GUILayout.Height(25));
        Name = GUILayout.TextField(Name, GUILayout.Height(25));
        //输入年龄
        GUILayout.Label("----请输入年龄-----", GUILayout.Height(25));
        Age = GUILayout.TextField(Age, GUILayout.Height(25));
        //输入成绩
        GUILayout.Label("----请输入成绩-----", GUILayout.Height(25));
        Grade = GUILayout.TextField(Grade, GUILayout.Height(25));

        //提交并跳转至下一个场景
        if (GUILayout.Button("提交",GUILayout.Height(25)))
        {
            //储存数据
            PlayerPrefs.SetString("mName", Name);
            PlayerPrefs.SetInt("mAge", int.Parse(Age));
            PlayerPrefs.SetFloat("mGrade", float.Parse(Grade));

            //跳转到场景2
            Application.LoadLevel("scene2");
        }
    }
}

场景2代码:
using UnityEngine;
using System.Collections;

public class Scene2 : MonoBehaviour {

    //储存持久化数据显示
    //可以保存3种类型,浮点型,整型,字符串型
    public string Grade;
    public string Age;
    public string Name;

    //图片贴图
    public Texture image;

    void Start()
    {
        //得到存储的数据
        Grade = PlayerPrefs.GetFloat("mGrade", 0.0f).ToString();
        Age = PlayerPrefs.GetInt("mAge", 0).ToString();
        Name = PlayerPrefs.GetString("mName", "");
    }

    void OnGUI()
    {
        //一张图片贴图
        GUI.DrawTexture(new Rect((Screen.width - image.width) / 2, 20, 120, 120), image);

        //显示名字
        GUILayout.Label("姓名: " + Name, GUILayout.Height(25));
        //显示年龄
        GUILayout.Label("年龄: " + Age, GUILayout.Height(25));
        //显示成绩
        GUILayout.Label("成绩: " + Grade, GUILayout.Height(25));


        //清除数据
        if (GUILayout.Button("清除数据", GUILayout.Height(25)))
        {
            PlayerPrefs.DeleteAll();
        }

        if (GUILayout.Button("返回上一页", GUILayout.Height(25)))
        {
            //返回场景1
            Application.LoadLevel("scene1");
        }
    }
}

将上述代码分别绑定在两个场景的摄像机上即可
点击File -> Build Settings.. 添加这两个场景


然后Build and Run就能生成并运行了
 


我们的小例子就完成了。unity的数据存储还算是比较简单的。具体还有什么看不见的坑,以后掉进去了才会知道吧。