Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取所有PlayerPrefs键以生成Drop()函数?_C#_Unity3d_Game Development - Fatal编程技术网

C# 如何获取所有PlayerPrefs键以生成Drop()函数?

C# 如何获取所有PlayerPrefs键以生成Drop()函数?,c#,unity3d,game-development,C#,Unity3d,Game Development,我的游戏中的下降功能有问题。我需要将所有变量都设置为0/null,但在代码中为每个变量分别创建一个字符串非常耗时且成本高昂。也许有人知道如何在PlayerPrefs中获取一组键 public void Drop() { PlayerPrefs.SetInt("AntivirusLevel", 0); PlayerPrefs.SetFloat("CPU", 0); PlayerPrefs.SetInt("CPUlvl&quo

我的游戏中的下降功能有问题。我需要将所有变量都设置为0/null,但在代码中为每个变量分别创建一个字符串非常耗时且成本高昂。也许有人知道如何在PlayerPrefs中获取一组键

public void Drop()
{
    PlayerPrefs.SetInt("AntivirusLevel", 0);
    PlayerPrefs.SetFloat("CPU", 0);
    PlayerPrefs.SetInt("CPUlvl", 0);
    PlayerPrefs.SetFloat("GPU", 0);
    PlayerPrefs.SetInt("GPUlvl", 0);
    PlayerPrefs.SetInt("RAM", 0);
    PlayerPrefs.SetInt("HDD", 0);
    PlayerPrefs.SetInt("MB", 0);
    PlayerPrefs.SetInt("Level", 0);
    PlayerPrefs.SetInt("LastScore", 0);
    PlayerPrefs.SetString("Training", null);
    PlayerPrefs.Save();
    SceneManager.LoadScene(0);
}

没有内置的方法可以获得Unity中所有现有PlayerRef的列表(此外,还需要了解每个PlayerRef的类型)

有一个插件可以在编辑器中实现这一点,也许您可以使用它并修改它以在运行时工作:

第二种选择是手动搜索保存pref的位置(例如,在注册表的窗口中)。您可以在此处看到每个平台中保存Pref的位置:

最后,这将是我的建议-您可以使用删除所有玩家优先权。但是,这将删除它们,并且不会像代码中那样设置默认值,因此您必须更改访问播放器prefs的代码并为其提供默认值

public void Drop()
{
    PlayerPrefs.DeleteAll(); // Remove all keys so we can get their default values
    PlayerPrefs.Save();
    SceneManager.LoadScene(0);
}

public int MyGetInt(string prefName) {
    return PlayerPrefs.GetInt(prefName, 0);
}

public float MyGetFloat(string prefName) {
    return PlayerPrefs.GetFloat(prefName, 0f);
}

private void Update() {
    Debug.Log("CPU Value: " + MyGetFloat("CPU")); // When using this instead of directly PlayerPrefs.GetFloat, then it will return 0 if the value doesn't exist, including after Drop() was run
}

请注意,这将删除游戏中的所有密钥。如果您只想重置某个键列表,那么就必须在JSON文件、数组或其他结构中创建一个键列表。程序无法猜测您要重置哪些值,哪些值不需要重置。

是的,我不想使用XML或JSON,我想指出的是,您可以将这些值放入字典/列表中,并自动执行设置/获取/清理过程。我是第二个@Tatranskymedved解决方案。对于这种类型的进程,System.Collection.Generic.Dictionaries是一个救星。在我的游戏中,我有超过100个资源,当我添加、删除、编辑、保存等时,只需调用字典并执行一行解决方案。此外,尽管你说你不想要XML或JSON,但是如果你打算增加更多的变量来保存,PraveRePFS保存将是地狱。你肯定应该考虑一些外部文件+加密,例如…PlayerPrefs对每个人都是可读写的,我可以按照自己的意愿修改
级别
最新分数
等。此外,XML或JSON为您节省了大量的时间和实现开销,避免了任何打字错误,可以在以后轻松更改以添加/删除字段等。。不明白为什么要明确排除此选项。。。