【问题标题】:PlayerPrefs working on unity editor but not in buildPlayerPrefs 在统一编辑器上工作,但不在构建中
【发布时间】:2020-03-13 08:45:56
【问题描述】:

我一直在寻找信息来尝试解决我的问题,但我就是不知道是什么原因造成的。播放器首选项似乎在统一编辑器中运行良好,但是一旦我为 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();
}

奇怪的是,这在统一编辑器中工作,但不是在我构建它时。如果有人可以帮助我,我将不胜感激,谢谢。

【问题讨论】:

  • 出于调试目的,为了反映您的应用程序的新用户会看到什么,从编辑器运行时偶尔使用PlayerPrefs.DeleteAll() 是一种很好的做法。 (用#if UNITY_EDITOR 包裹它以增加安全性,以防您忘记取出它。)这样做后,再次在编辑器中点击播放——一切都按预期工作吗?
  • 你为什么不打电话给PlayerPrefs.Save()
  • @PhilippLenssen 我不知道这个功能,我一直在测试,但在构建时我仍然得到 0 分......这没有任何意义,因为我使用 1 作为默认值。当我删除所有 Player Prefs 时,它仍然在编辑器中工作。
  • 您需要按照已经建议的方式进行调试。但是,您应该使用最合适的数据类型存储数据,即int,因此在内部使用它而不是stringstring 可能不是您期望的格式,因此无法转换为 int
  • @trojanfoe 就是这样!这是转换中的错误...非常感谢!

标签: c# unity3d


【解决方案1】:

我知道这是一篇旧帖子(请原谅我的 necro),但它是作为谷歌搜索结果出现的,我遇到了同样的问题。

我在使用 playerprefs 时遇到了同样的问题,我正在保存一个加密文件,我在其中使用了 playerprefs 以及生成的哈希值密钥。当我在编辑器中保存游戏并在构建中运行时,我无法加载我的保存文件。这是用于窗户的。经过一些调试和挖掘,我发现统一为编辑器和应用程序构建保存了两个不同的播放器偏好:

根据这篇文章 https://virtual-reality-piano.medium.com/solved-where-is-unitys-playerprefs-stored-on-windows-d61d504585e9

您的统一编辑器将其保存在路径:'HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\CompanyName\ProjectName'

但是,当您构建应用程序时,播放器首选项保存在:

'HKEY_CURRENT_USER\SOFTWARE\CompanyName\ProjectName'(其中 Company name 是您的公司名称,project name 是您的项目名称)。

我不得不进入并删除这两个地方的注册表文件,因为假设我正在保存一个名为 DefaultPlayer 的保存文件,然后编辑器会将该保存与编辑器中的注册表文件相关联。但是当我构建到应用程序时,保存文件仍会保留在 Application.PersistentPath 中,但它的注册表文件将不存在,因为它尚未在应用程序的注册表文件中创建。

对于令人困惑的帖子和 necro 感到抱歉,但这为我解决了从编辑器到应用程序构建的保存文件问题。 (注意这是在 Windows 上,所以不知道它是否也适用于 android)。希望它可以帮助遇到同样问题的其他人

请注意,每次在编辑器和构建中测试时,您都必须删除这两个文件,或者按照上面评论中的建议,使用 #if UNITY_EDITOR 杂注以避免错误

【讨论】:

    【解决方案2】:

    我读了你的帖子,我也有类似的问题。 在我构建了一个 apk 文件但它在模拟器上不起作用之前。 但它在 Unity Editor 上运行良好。 我找不到这个问题的原因,但我认为使用 SceneManager.LoadScene() 加载场景时会出现问题。 当我不使用此功能时,错误已修复。 如果你解决了这个问题,请发布你是怎么做的。 而且我认为避免错误比修复错误更好。 祝你好运。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多