Unity Player Prefs打包移动端后currentAmount变量无法更新
排查默认值与键名冲突
先检查加载currentAmount的代码是不是写死了默认值350,比如currentAmount = PlayerPrefs.GetInt("CurrentAmount", 350);。编辑器里可能之前运行时已经存过有效值,所以不会触发默认值,但移动端首次安装或清除数据后,就会直接用这个默认值。另外还要确认有没有其他脚本用同一个键名修改值,移动端的脚本执行顺序可能和编辑器不同,导致其他逻辑提前把值设成了350。确保PlayerPrefs即时保存
编辑器下Unity会自动处理PlayerPrefs的保存,但移动端不会。每次修改currentAmount后,必须立刻调用PlayerPrefs.Save();,不然进程意外退出(比如切后台、强制关闭)时,修改的值不会被持久化,下次启动还是读旧值或默认值。别把Save放在OnDestroy()里,移动端这个方法不一定会被执行。验证单例初始化逻辑
检查单例的Awake/Start方法中,加载PlayerPrefs的时机是否正确。如果有其他脚本在单例初始化前就修改了currentAmount,之后单例再加载PlayerPrefs的默认值,就会覆盖成350。另外确认单例没有被重复创建,即使加了DontDestroyOnLoad,场景里如果有多个实例,也可能导致初始化逻辑重复执行,重置值。移动端存储权限与同步问题
安卓设备上,检查应用是否有存储权限,没有的话PlayerPrefs可能无法写入,导致每次启动都读不到保存的值,只能用默认350。可以加日志打印PlayerPrefs.HasKey("CurrentAmount"),看移动端是否真的存在这个键。iOS设备要检查是否开启了iCloud同步,若同步了旧的键值数据,也会导致值被固定。
内容的提问来源于stack exchange,提问作者Shem Tom

