Unity数据持久化设计一 PlayerPrefs

第一部分:PlayerPrefs基本概念

  1. 什么是数据持久化
    数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称,通俗来说就是我们所谓的“存盘”。
  2. 什么是PlayerPrefs
    PlayerPrefs是Unity官方提供的一种简单存储系统,主要是利用键值对进行数据存储,常用于对本地存储用户的偏好设置数据和运行基础数据等。
    因其轻量级数据存储且兼容性好,常用于数据持久化或会话保存等功能。
    其支持的保存数据仅三种类型,分别为:int、float和string类型
  3. PlayerPrefs基本的API
    3.1 存储API
    SetInt/SetFlota/SetString
	//参数采用键值对的形式进行存储,第一个参数默认是String类型的键名,第二个参数对应存储的数据类型
	PlayerPrefs.SetInt("年龄",18);
	PlayerPrefs.SetFloat("成绩"20.0f);
	PlayerPrefs.SetString("姓名","小明");
3.2 读取API
GetInt/GetFloat/GetString
	//读取时有两种写法,第一种时以下写法,第二种时单参数写法
	//当前写法中两个参数分别代表的是键名与默认值,当查找数据不存在可以使用默认数据进行读取
	PlayerPrefs.GetInt("年龄",10);
	PlayerPrefs.GetFloat("成绩",0.0f);
	PlayerPrefs.GetString("姓名","小明");
	//第二种写法【不推荐】 当前写法可能会出现查找不到数据时产生程序错误,进而影响程序进程
	PlayerPrefs.GetInt("年龄");
	PlayerPrefs.GetFloat("成绩");
	PlayerPrefs.GetString("姓名");
3.3 其他使用API
HasKey/DeleteKey/DeleteAll/Save
	//使用HasKey可以用于检查键名对应数据是否存在,书写方法如下
	PlayerPrefs.HasKey("姓名");
	//使用DeleteKey是用于删除对应键名的数据,通常需要明确知道对应键名,若不能清楚知道键名勿用
	PlayerPrefs.DeleteKey("需要删除的数据键名");
	//使用DeleteAll是用于删除所有的存储数据,相当于注销账号的操作了
	PlayerPrefs.DeleteAll();
	//使用Save是保存数据到硬盘中,所有的数据持久化没有保存到硬盘中都是相当于无用功。
	PlayerPrefs.Save();

上面我们也有说调用Set方法是可以将数据进行存储,但是这个存储只是将数据存储到内存中,当程序结束时Unity会自动将数据保存到硬盘中,但是如果程序不是正常结束的,而是因为一些特殊情况导致崩盘行为,数据就没有办法保存到硬盘中,这个时候就会出现数据丢失问题,通常我们会优先选择使用Save函数进行数据立刻存储。

第二部分:基础使用

  1. 基本数据类型存储
using UnityEngine;

public class BasicPlayerPrefsExample : MonoBehaviour
{
   
   
    void Start()
    {
   
   
        // 存储基本数据类型
        PlayerPrefs.SetInt("PlayerScore", 100);
        PlayerPrefs.SetFloat("PlayerHealth", 75.5f);
        PlayerPrefs.SetString("PlayerName", "John Doe");
        
        // 立即保存到磁盘(通常在重要数据变更后调用)
        PlayerPrefs.Save();
        
        // 读取数据
        int score = PlayerPrefs.GetInt("PlayerScore", 0);
        float health = PlayerPrefs.GetFloat("PlayerHealth", 100f);
        string name = PlayerPrefs.GetString("PlayerName", "Unknown");
        
        Debug.Log($"玩家: {
     
     name}, 分数: {
     
     score}, 生命值: {
     
     health}");
    }
}
  1. 数据检查与删除
using UnityEngine;

public class PlayerPrefsManagement : MonoBehaviour
{
   
   
    void Start()
    {
   
   
        // 检查键是否存在
        if (PlayerPrefs.HasKey("PlayerLevel"))
        {
   
   
            int level = PlayerPrefs.GetInt("PlayerLevel");
            Debug.Log($"玩家等级: {
     
     level}");
        }
        else
        {
   
   
            Debug.Log("玩家等级数据不存在");
        }
        
        // 删除特定键
        PlayerPrefs.DeleteKey("TempData");
        
        // 删除所有数据(谨慎使用!)
        // PlayerPrefs.DeleteAll();
    }
}

PlayerPrefs是有一定的局限性的,只能够存储三种类型的数据,如果想要存储别的类型甚至是自定义类型的就需要进行数据转换,通过降低精度或提高精度实现数据的存储。
例如bool类型存储就需要用Int类型进行转换

bool sex=true;
PlayerPrefs.SetInt("性别",sex?1:0);

如果存储的时候选择的是不同类型但是键名相同,数据会被覆盖成最新的数据,如:

  PlayerPrefs.SetInt("年龄",18);
  PlayerPrefs.SetFloat("年龄"20.0f);

输出的结果就是为20;

所以选择使用PlayerPrefs的时候也是有一定的优劣势的:
优点:
是数据持久化系列中最简单的一部分,简单快捷易懂
缺点:
重复性工作过多,自定义数据类型都需要自己去实现读取功能,而且代码的相似度极高,数据很容易被修改。

常见的PlayerPrefs使用环境有:
安全性要求不高的简单数据、原生数据等。

第三部分:中级应用

  1. 存储复杂数据类型
    想要存储复杂数据类型就需要将原类型转换为字符串类型进行存储
using UnityEngine;
using System.Collections.Generic;

public class ComplexDataStorage : MonoBehaviour
{
   
   
    [System.Serializable]
    public class GameSettings
    {
   
   
        public float musicVolume;
        public float sfxVolume;
        public bool fullscreen;
        public int resolutionIndex;
    }
    
    void Start()
    {
   
   
        // 存储复杂对象
        GameSettings settings = new GameSettings()
        {
   
   
            musicVolume = 0.8f,
            sfxVolume = 0.9f,
            fullscreen = true,
            resolutionIndex = 2
        };
        
        // 将对象转换为 JSON 字符串存储
        string jsonData = JsonUtility.ToJson(settings);
        PlayerPrefs.SetString("GameSettings", jsonData);
        PlayerPrefs.Save();
        
        // 读取并解析数据
        string loadedJson = PlayerPrefs.GetString("GameSettings", "");
        if (!string.IsNullOrEmpty(loadedJson))
        {
   
   
            GameSettings loadedSettings = JsonUtility.FromJson<GameSettings>(loadedJson);
            Debug.Log($"音乐音量: {
     
     loadedSettings.musicVolume}");
        }
    }
}
  1. 存储数组和列表
using UnityEngine;
using System.Collections.Generic;

public class ArrayStorageExample : MonoBehaviour
{
   
   
    void Start()
    {
   
   
        // 存储整数数组
        int[] scores = {
   
    100, 85, 92, 78 };
        StoreIntArray("HighScores", scores);
        
        // 读取整数数组
        int[] loadedScores = LoadIntArray("HighScores");
        foreach (int score in loadedScores)
        {
   
   
            Debug.Log($"分数: {
     
     score}");
        }
        
        // 存储字符串列表
        List<string> completedLevels = new List<string> {
   
    "Level1", "Level3", "Level5" };
        StoreStringList("CompletedLevels", completedLevels);
        
        // 读取字符串列表
        List<string> loadedLevels = LoadStringList("CompletedLevels");
        foreach (string level in loadedLevels)
        {
   
   
            Debug.Log($"已完成关卡: {
     
     level}");
        }
    }
    
    // 存储整数数组
    private void StoreIntArray(string key, int[] array)
    {
   
   
        // 存储数组长度
        PlayerPrefs.SetInt(key + "_Count", array.Length);
        
        // 存储每个元素
        for (int i = 0; i < array.Length; i++)
        {
   
   
            PlayerPrefs.SetInt(key + "_" + i, array[i]);
        }
    }
    
    // 读取整数数组
    private int[] LoadIntArray(string key)
    {
   
   
        // 获取数组长度
        int count = PlayerPrefs.GetInt(key + "_Count", 0);
        
        // 创建数组并读取元素
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值