Unity:PlayerPrefs笔记
写在前面:
写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。
一、PlayerPrefs的基本方法
1、存储相关
PlayerPrefs的数据存储类似于键值对存储,一个键对应一个值。Unity提供了存储3种数据的方法:int、float、string。其中,键一定是string类型。值可以是以上三种类型,对应三种API:PlayerPrefs.SetInt()、PlayerPrefs.SetFloat()、PlayerPrefs.SetString(),里面传入两个参数,键和值
需要注意的是,直接调用Set相关方法,只会把数据存在内存里,当游戏结束时,会自动把数据存到硬盘里。但是如果游戏不是正常结束,而是崩溃,数据是不会存到硬盘中的。如果加上PlayerPrefs.Save(),只要调用该方法,就会马上存储到硬盘中。
不难发现,playerprefs有局限性,它只能存3种类型的数据,如果你想存别的类型的数据,只能降低精度或者上升精度来存储。例如,double需要降精度为float,无符号整型需要转为有符号整型等。存储bool值需要转换,都会在下面的例子中展示。
最后,还需要注意的是:如果用同一键名进行存储,无论是不是同一类型,都会进行覆盖。需要注意自己是否覆盖存储。
public class lession1 : MonoBehaviour
{void Start(){PlayerPrefs.SetInt("myAge", 1);PlayerPrefs.SetFloat("myHeight", 173.5f);PlayerPrefs.SetString("myName", "Alex");PlayerPrefs.Save();//存bool需要转换bool sex = true;PlayerPrefs.SetInt("sex", sex ? 1 : 0);//如果用同一键名进行存储,无论是不是同一类型,都会进行覆盖PlayerPrefs.SetFloat("myAge", 22.2f);}
2、读取相关
读取存储的数据可以使用Unity提供的API,同存储数据一样,Unity也提供了int、float、string三种数据读取方法。分别使用:PlayerPrefs.GetInt()、PlayerPrefs.GetFloat()、PlayerPrefs.GetString() 。只需要传入一个参数,查找的键名。运行时,只要你set了对应键值对,即使没有马上Save存储在本地,也能够读取出信息。
需要注意的是,如果内存中没有,int、float会返回0,string会返回空。例如,我们在上例中将int型的myAge覆盖存储为了float型。这时候如果调用PlayerPrefs.GetInt("myAge"),就会返回0。
如果希望没找到的时候返回一个固定的值,就可以在读取方法中传入第二个参数。第二个参数为默认值,在没有查找到键的时候返回默认值。
此外,还可以使用PlayerPrefs.HasKey("myName")这个方法判断括号内传入的键是否存在。可以用于在存储值前判断,防止覆盖存储。
public class lession1 : MonoBehaviour
{void Start(){PlayerPrefs.SetInt("myAge", 1);PlayerPrefs.SetFloat("myHeight", 173.5f);PlayerPrefs.SetString("myName", "Alex");PlayerPrefs.Save();PlayerPrefs.SetFloat("myAge", 22.2f);int age = PlayerPrefs.GetInt("myAge");print(age);//可以设置默认值,如果找不到会返回默认值age = PlayerPrefs.GetInt("myAge", 100);print(age);//这里由于键存在,不会返回默认值float height = PlayerPrefs.GetFloat("myHeight", 1000f);print(height);string name = PlayerPrefs.GetString("myName");print(name);if(PlayerPrefs.HasKey("myName")){print("存在myName对应的键值对数据");}}
3、删除数据
删除数据有两个API。第一个API是:PlayerPrefs.DeleteKey("myAge"),括号中传入的是需要删除的键值对的键名。第二个API是:PlayerPrefs.DeleteAll(),作用是删除所有键值对
public class lession1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){PlayerPrefs.SetInt("myAge", 1);PlayerPrefs.SetFloat("myHeight", 173.5f);PlayerPrefs.SetString("myName", "Alex");PlayerPrefs.Save();PlayerPrefs.SetFloat("myAge", 22.2f);PlayerPrefs.DeleteKey("myAge");PlayerPrefs.DeleteAll();}
二、PlayerPrefs存储位置
1、存储的数据在哪里
不同平台存储位置不一样,这里介绍Windows、Android、ios。
(1)Windows
PlayerPrefs存储在HKCU\Software\[公司名称]\[产品名称]项下的注册表中,其中公司和产品名称是在“Project Settings”中设置的名称。
首先查看公司和产品名称:File—>Build Settings->Player Settings
然后就可以查看公司名称和产品名称:
找到公司名称和产品名称后,Win+R输入regedit
点击确定后打开注册表编辑器。找到HKEY_CURRENT_USER、Software\Unity\UnityEditor\ 公司名称\产品名称
即可查看并修改存储的信息:
(2)Android
存储在路径:/data/data/包名/shared_prefs/pkg-name.xml
(3)ios
存储在路径:/Library/Preferences/[应用ID].plist
2、PlayerPrefs数据唯一性
PlayerPrefs是中不同数据的唯一性是由key决定的,不同的key决定了不同的数据。需要注意这个唯一性规则。