PlayerPrefs 在 Unity 编辑器上工作,但不在构建中

问题描述 投票:0回答:3

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

奇怪的是,这在统一编辑器中有效,但在我构建它时却无效。如果有人能帮助我,我将非常感激,谢谢。

c# unity-game-engine
3个回答
1
投票

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

我对播放器偏好设置也有同样的问题,我正在保存一个加密文件,其中我使用播放器偏好设置以及生成的密钥作为哈希值。当我在编辑器中保存游戏并在构建中运行时,我无法加载我的保存文件。但这是针对 Windows 的。经过一些调试和挖掘后,我发现 Unity 将玩家首选项保存在编辑器和应用程序构建的两个不同位置:

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

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

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

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

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

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

请注意,每次在编辑器和构建中进行测试时,您都必须删除这两个文件,或者正如上面评论中建议的那样,使用 #if UNITY_EDITOR pragma 来避免错误


0
投票

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


0
投票

我希望我能帮助你,我也遇到了同样的问题,但由于缺乏信息,让我澄清一下我的问题。 我为移动设备制作了一个游戏,当我使用编辑器时,一切运行良好,但是当我在设备(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() 函数是保存我的游戏所有进度的函数。 希望有帮助, 快乐编码!

© www.soinside.com 2019 - 2024. All rights reserved.