寫在前面:
寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。
一、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決定了不同的數據。需要注意這個唯一性規則。