type
status
date
summary
tags
category
icon
 

一、前言

学习Unity数据存储的过程中,记录一下PlayerPrefs的知识点。

二、概述

2.1 作用

PlayerPrefs是Unity提供的可以用于存储和读取玩家数据的公共类。PlayerPrefs中的数据存储类似于键值对存储,该类只能存储三种类型的数据,分别是:
  • int
  • float
  • string
在游戏运行过程中,调用PlayerPrefs存储相关的API并不会立刻将数据存储到注册表中,而是暂时将数据存在内存中。当游戏正常结束时,数据才会被存进对应的位置。
如果想要存其他的数据类型,可以通过降低 / 上升精度或者自定义规则进行存储

2.2 数据在不同平台的存储位置

Window
在Window平台下,PlayerPrefs中的数据存储在HKCU\Software\[公司名称]\[产品名称]项下的注册表中,其中公司和产品名称是在Unity的Project Settings中设置的名称,如下图
notion image
通过以下步骤可以在Window查看数据内容
  1. 运行regedit,打开注册表编辑器
    1. notion image
  1. HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\公司名称\产品名称目录下即可看到(能够在其中直接更改值的内容)
    1. notion image
安卓
数据存储在/data/data/[pkg-name]/shared_prefs/pkg-name.xml
IOS
数据存储在/Library/Preferences/[应用ID].plist

三、常用API

3.1 存储

PlayerPrefs.SetInt(string key, int value)
PlayerPrefs.SetFloat(string key, float value)
PlayerPrefs.SetString(string key, string value)
PlayerPrefs.Save()
立刻将数据存储到硬盘中。
默认情况下,Unity 会在游戏正常结束时(即在 OnApplicationQuit()阶段 )将数据写入磁盘。 但是在游戏不是正常结束的情况下,内存中的数据会因意外被丢失,所以可以在游戏中的合理“检查点”处写入 PlayerPrefs(但是这可能会导致短暂性中断,所以官方不太推荐频繁使用)

3.2 读取

PlayerPrefs.GetInt(string key, int defaultValue)
PlayerPrefs.GetString(string key, string defaultValue)
PlayerPrefs.GetFloat(string key, float defaultValue)
PlayerPrefs.HasKey(string key)
如果key存在则返回true,否则返回false

3.3 删除

PlayerPrefs.DeleteKey(string key)
从磁盘中删除key及其对应值
PlayerPrefs.DeleteAll()

3.4 特殊情况

如果不同类型的数据存储时用同一个Key,之前的值会被覆盖
在实际项目中如果不注意这个问题,可能会发生一些难以排查的错误。为了避免这种情况发生,最好通过自定义的命名规则来给Key命名。

四、小结

使用PlayerPrefs进行数据存储的优点是简单和方便,这可能是Unity数据持久化存储中最为便捷的方法。但缺点是安全性可能不足,例如我们能够较为容易的找到数据在不同平台上的存储位置,这意味着我们能够在外部修改游戏内的数据。为了解决这个问题,我们需要使用一些加密手段来辅助存储。

五、参考资料

Unity 笔记 Scroll View参数设置Unity 文件系统模块 GUID,Local ID和Instance ID详解
  • Twikoo
  • Cusdis