Unity 序列化保存数据到本地文件

一般数据保存我们都会用Unity自带的PlayerPrefs这个类,在数据较少时使用起来非常方便,通过特定的键值来存储相对应的数据,但是它的弊端也是显而易见的当我们要存储一个类,或者较多数据时再用它来存储就很不方便了。所以这篇文章给大家介绍一下通过序列化来保存一个类的数据

下面是一个玩家类,它包括 金币数量,道具数量,关卡,分数等数据,这些数据我们都需要持久化

[System.Serializable]
public class PlayerData
{
    /// 
	/// 金币
	/// 
	private int coin;

	/// 
	/// 道具数量
	/// 
	public int propCount;

    /// 
	/// 关卡数量
	/// 
	public int levelCount;

    /// 
	/// 分数
	/// 
	public int score;

    public PlayerData()
    {
        coin = 100;
        propCount = 3;
        levelCount = 0;
        score = 0;
    }
}

接下来创建管理类 PlayDataFactoty 来存储和读取本地文件,保存文件的路径根据不同的平台而不同

在Editor模式下我们将文件存在StreamingAssets目录下,这个文件夹下的资源也会全都打包在.apk或者.ipa 它和Resources的区别是,Resources会压缩文件,但是它不会压缩原封不动的打包进去。并且它是一个只读的文件夹,就是程序运行时只能读 不能写。它在各个平台下的路径是不同的,不过你可以用Application.streamingAssetsPath 它会根据当前的平台选择对应的路径。

而在移动平台上我们将它存在 PersistentDataPath目录下,因为Application.persistentDataPath目录是应用程序的沙盒目录,所以打包之前是没有这个目录的,直到应用程序在手机上安装完毕才有这个目录,可读 可写。 

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class PlayDataFactoty : MonoBehaviour
{
	//文件的路径
	private string payerDate_path;

	public PlayerData playerData;

	private void Awake()
	{
		if (Application.platform == RuntimePlatform.WindowsEditor)
		{
			payerDate_path = Application.streamingAssetsPath + "/playerData";
		}
		else
		{
			payerDate_path = Application.persistentDataPath + "/playerData";
		}
		LoadPlayerData();
	}

	//读取数据
	public void LoadPlayerData()
	{
		if (File.Exists(payerDate_path))
		{
			BinaryFormatter bf = new BinaryFormatter();
			FileStream file = File.Open(payerDate_path, FileMode.Open);
			playerData = (PlayerData)bf.Deserialize(file);
			file.Close();
		}
		//如果没有文件,就创建一个PlayerData
		else
		{
			playerData = new PlayerData();
		}
	}

	//保存数据      
	public void SavePlayerData()
	{
		BinaryFormatter bf = new BinaryFormatter();
		if (File.Exists(payerDate_path))
		{
			File.Delete(payerDate_path);
		}
		FileStream file = File.Create(payerDate_path);
		bf.Serialize(file, playerData);
		file.Close();
	}

	public void TestBtnClick()
	{
		playerData.coin = 0;
		playerData.levelCount = 10;
		playerData.propCount = 20;
		playerData.score = 1000;

		SavePlayerData();
	}
}

下面我们测试一下代码,将PlayDataFactoty挂载到一个空物体上面

Unity 序列化保存数据到本地文件_第1张图片Unity 序列化保存数据到本地文件_第2张图片

运行后我们会发现在面板上可以看到playerdata的数据为初始创建的数据,所以我们创建一个按钮Button绑定PlayDataFactoty 中的TestBtnClick方法来修改数据并保存。

Unity 序列化保存数据到本地文件_第3张图片

点击按钮后会发现在StreamingAssets目录下创建了我们自己的文件

重新运行游戏发现playData读取成功变成我们修改过的数据了

Unity 序列化保存数据到本地文件_第4张图片

测试工程在下方

https://download.csdn.net/download/qq_39030818/12360772

你可能感兴趣的:(Unity,unity)