用 PlayerPrefs 来处理玩家偏好设置

PlayerPrefs 是 Unity 引擎提供的用来存储玩家偏好数据的模块,可在让运行时的数据,保存到下次开启游戏时使用。

这种方法如果作为存档来用,很容易在本地对游戏进行篡改,会给玩家提供取巧的办法,降低游戏的生命力。所以 PlayerPrefs 主要作为玩家偏好设置的保存与加载,如果每次进入游戏都要调一遍设置,这谁受不了啊?而游戏内容的存档与加载不在本篇内,可以参考序列化反序列化的知识,以及解析 json 等内容,来实现游戏中的保存和载入。

对于不同的系统会存储在不同的位置,而使用的方法比较简单,在想要保存数据的位置,使用 SetXXX(key, XXXvalue) 在需要使用数据的位置调用 GetXXX(key)。

如果为了防止 key 不存在,也可以使用 GetXXX(key, defautXXXvalue) 来处理。也可以使用 HasKey(key) 来检查是否存有 “key” 的数据。

第一个限制是保存的数据只能有 string,int,float 这三种。

关于 Save() 方法,默认情况下,Unity 在执行 OnApplicationQuit() 方法时,将数据写入到硬盘中,为防止意外发生,可以通过此命令将数据保存到硬盘上,但是有可能会造成一点小问题,如暂时性的延迟等,所以应该避免在游戏流程中调用。

Windows 下数据会保存到注册表中( HKCU\Software[company name][product name] ),这里我分别存了两次,因为我发现存入的 key 后面加上了一串类似 id 的数字,本来我以为我将 GameObject 的 ToString() 作为 key 会将对象的 id 也打印出来(真是一个自以为是的小伙子,打印明明看到没有啊),所以又分割字符串,只存了 GameObject 的名字,这个“_hxxxxxxxxx”是依然存在,并不对 Get 有影响。

company name 与 product name 可以在 Unity 编辑器中找到:[Edit] - [Project Settings] - [Player] ,在 Inspector 可以看到 Company Name 与 Product Name。

有一个可视化的插件 Advanced PlayerPrefs Window,可以在编辑器中打开 PlayerPrefs 的窗口,用于设置需要保存的键值对。


来看看文档,主要区别了主要的系统中,存放的位置。

On macOS PlayerPrefs are stored in ~/Library/Preferences folder, in a file named unity.[company name].[product name].plist, where company and product names are the names set up in Project Settings. The same .plist file is used for both Projects run in the Editor and standalone players.

On Windows, PlayerPrefs are stored in the registry under HKCU\Software[company name][product name] key, where company and product names are the names set up in Project Settings.

On Linux, PlayerPrefs can be found in ~/.config/unity3d/[CompanyName]/[ProductName] again using the company and product names specified in the Project Settings.

On Windows Store Apps, Player Prefs can be found in %userprofile%\AppData\Local\Packages[ProductPackageId]>\LocalState\playerprefs.dat

On Windows Phone 8, Player Prefs can be found in application’s local folder, See Also: Directory.localFolder

On Android data is stored (persisted) on the device. The data is saved in SharedPreferences. C#/JavaScript, Android Java and Native code can all access the PlayerPrefs data. The PlayerPrefs data is physically stored in /data/data/pkg-name/shared_prefs/pkg-name.xml.

On WebGL, PlayerPrefs are stored using the browser’s IndexedDB API.

On iOS, PlayerPrefs are stored in /Library/Preferences/[bundle identifier].plist.