我一直在寻找信息来尝试解决我的问题,但我就是不知道是什么原因造成的。播放器首选项似乎在统一编辑器中工作正常,但一旦我为 Android 或 PC 进行构建,它们就全部消失了。我的项目中没有 PlayerPrefs.deleteAll 。
我有 3 个场景:菜单、游戏和 GameOver。当我启动菜单场景时,我运行附加到 MainCamera 的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class prefs : MonoBehaviour
{
public static int bestRecord;
// Start is called before the first frame update
void Start()
{
bestRecord = PlayerPrefs.GetInt("K", 1);
Debug.Log(PlayerPrefs.GetInt("K").ToString());
}
}
当我进入游戏场景时,我的分数是一个 TextMeshProUGUI,它通过 InvokeRepeating 不断更新:
public TextMeshProUGUI points;
void Start()
{
stop = false;
InvokeRepeating("subirMetros", 0f, 0.01f);
}
private void subirMetros()
{
if (stop == false)
{
points.SetText(Math.Round(character.transform.position.x, 0) + "");
}
}
//GameOver is called when the player dies
public void GameOver()
{
stop = true;
CancelInvoke("subirMetros");
int finalPoints = Int32.Parse(points.text);
int recordActual = PlayerPrefs.GetInt("K");
if (recordActual < finalPoints)
{
PlayerPrefs.SetInt("K", finalPoints);
}
SceneManager.LoadScene("GameOver");
}
}
最后,当启动 GameOver 场景时,我再次获得了在到达场景之前应该保存的 PlayerPrefs:
public TextMeshProUGUI record;
void Start()
{
record.text = PlayerPrefs.GetInt("K").ToString();
}
奇怪的是,这在统一编辑器中有效,但在我构建它时却无效。如果有人能帮助我,我将非常感激,谢谢。
我知道这是一篇旧帖子(请原谅我的死灵),但它是作为谷歌搜索结果出现的,我遇到了同样的问题。
我对播放器偏好设置也有同样的问题,我正在保存一个加密文件,其中我使用播放器偏好设置以及生成的密钥作为哈希值。当我在编辑器中保存游戏并在构建中运行时,我无法加载我的保存文件。但这是针对 Windows 的。经过一些调试和挖掘后,我发现 Unity 将玩家首选项保存在编辑器和应用程序构建的两个不同位置:
您的 Unity 编辑器将其保存在路径:‘HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\CompanyName\ProjectName’
但是,当您构建应用程序时,播放器首选项将保存在:
'HKEY_CURRENT_USER\SOFTWARE\CompanyName\ProjectName'(其中公司名称是您公司的名称,项目名称是您项目的名称)。
我必须进入并删除这两个地方的注册表文件,因为假设我正在保存一个名为 DefaultPlayer 的保存文件,那么编辑器会将该保存与编辑器中的注册表文件关联起来。但是当我构建一个应用程序时,保存文件仍然会保留在 Application.PersistentPath 中,但它的注册表文件将不存在,因为它尚未在应用程序的注册表文件中创建。
对于令人困惑的帖子和死灵感到抱歉,但这就是为我解决从编辑器到应用程序构建的保存文件问题的原因。 (注意这是在 Windows 上,所以不知道它是否也适用于 Android)。希望它可以帮助其他遇到同样问题的人
请注意,每次在编辑器和构建中进行测试时,您都必须删除这两个文件,或者正如上面评论中建议的那样,使用 #if UNITY_EDITOR pragma 来避免错误
我读了你的帖子,我也有类似的问题。 之前我已经构建了一个 apk 文件,但它无法在模拟器上运行。 但它在 Unity 编辑器上运行良好。 我找不到这个问题的原因,但我认为使用 SceneManager.LoadScene() 加载场景时存在问题。 当我不使用此功能时,错误已修复。 如果您解决了这个问题,请发布您是如何做的。 我认为避免错误比修复错误更好。 祝你好运。
我希望我能帮助你,我也遇到了同样的问题,但由于缺乏信息,让我澄清一下我的问题。 我为移动设备制作了一个游戏,当我使用编辑器时,一切运行良好,但是当我在设备(android 手机)上进行构建时,游戏没有保存进度,不在 PlayerPrefs 中,也没有在我在我的设备上创建的文件中保存进度。拯救管理者。 我的代码组织得很好,因此不同对象的所有保存都保存在名为 OnApplicationQuit 的统一事件中。 对我有用的解决方案是我找到了一个统一讨论的线索,其中包含有关此事件的统一文档的链接: https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationQuit.html
我在本文档中发现事件 OnApplicationQuit 仅适用于编辑器,在 Android 和 IOS 设备上此事件不起作用,因此我将事件更改为 OnApplicationFocus 并检查标志何时为 false,进行保存,这适用于我。当然,我仍然需要编辑器的代码,这样我就可以在更改后检查我的工作,因此我添加了 C# 特殊 if 语句(我不知道如何调用它们),一切都按预期工作。
private void OnApplicationFocus(bool focusStatus)
{
#if UNITY_IOS || UNITY_ANDROID
if (!focusStatus)
{
SaveManager.instance.SaveAllData();
}
#endif
}
private void OnApplicationQuit()
{
#if UNITY_EDITOR
SaveManager.instance.SaveAllData();
#endif
}
注意:SaveAllData() 函数是保存我的游戏所有进度的函数。 希望有帮助, 快乐编码!