【问题标题】:Setting a player pref key results in setting all of them Unity3D设置播放器偏好键会导致设置所有 Unity3D
【发布时间】:2018-03-11 03:11:06
【问题描述】:

当我尝试使用PlayerPrefsManager.SetFood() 时,它会设置所有播放器首选项字符串。因此,如果我执行PlayerPrefsManager.SetFood(Monday, Bread),它会将MONDAY_KEYTUESDAY_KEYWEDNESDAY_KEY 等设置为Bread。有人可以指出我的错误吗?

编辑:我知道 SetFood 函数中的所有 if 语句(而不是 else if 语句),但由于可以同时调用该函数的 2 个或多个实例,我替换了所有 else if 语句(我不确定这是否是正确的措辞)。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerPrefsManager : MonoBehaviour {
    const string MONDAY_KEY = "null";
    const string TUESDAY_KEY = "null";
    const string WEDNESDAY_KEY = "null";
    const string THURSDAY_KEY = "null";
    const string FRIDAY_KEY = "null";
    const string SATURDAY_KEY = "null";
    const string SUNDAY_KEY = "null";

    public static string GetFood (string Day){
        if (Day == "Monday") {
            return PlayerPrefs.GetString (MONDAY_KEY);
        } else if (Day == "Tuesday") {
            return PlayerPrefs.GetString (TUESDAY_KEY);
        } else if (Day == "Wednesday") {
            return PlayerPrefs.GetString (WEDNESDAY_KEY);
        } else if (Day == "Thursday") {
            return PlayerPrefs.GetString (THURSDAY_KEY);
        } else if (Day == "Friday") {
            return PlayerPrefs.GetString (FRIDAY_KEY);
        } else if (Day == "Saturday") {
            return PlayerPrefs.GetString (SATURDAY_KEY);
        } else if (Day == "Sunday") {
            return PlayerPrefs.GetString (SUNDAY_KEY);
        } else{
            return "Day out of range";
        }
    }

    public static void SetFood (string Day, string Food){
        if (Day == "Monday") {
            PlayerPrefs.SetString (MONDAY_KEY, Food); 
        } if (Day == "Tuesday") {
            PlayerPrefs.SetString (TUESDAY_KEY, Food);
        } if (Day == "Wednesday") {
            PlayerPrefs.SetString (WEDNESDAY_KEY, Food);
        } if (Day == "Thursday") {
            PlayerPrefs.SetString (THURSDAY_KEY, Food);
        } if (Day == "Friday") {
            PlayerPrefs.SetString (FRIDAY_KEY, Food);
        } if (Day == "Saturday") {
            PlayerPrefs.SetString (SATURDAY_KEY, Food);
        } if (Day == "Sunday") {
            PlayerPrefs.SetString (SUNDAY_KEY, Food);
        } if (!(Day == "Monday") || (Day == "Tuesday") || (Day == "Wednesday") || (Day == "Thursday") || (Day == "Friday") || (Day == "Saturday") || (Day == "Sunday")) {
            Debug.LogError ("Day out of range");
        }
    }
}

【问题讨论】:

  • 您是否尝试过使用调试器?您可以尝试的另一件事是在每个 if 的末尾添加一个 return 语句。例如。 if (Day == "Monday") { PlayerPrefs.SetString (MONDAY_KEY, Food); return; }
  • 我做了一个Debug.Log和每条语句的结尾。它没有用,但感谢您的建议。

标签: c# unity3d key


【解决方案1】:

您所有的键都具有相同的值,即“null”。这就是为什么无论 const var 名称是否不同,您都会获得相同的值。实际值应该不同。像这样赋予它独特的价值。

 const string MONDAY_KEY = "monday_key";
 const string TUESDAY_KEY = "tuesday_key";
 const string WEDNESDAY_KEY = "wednesday_key";
 const string THURSDAY_KEY = "thursday_key";
 const string FRIDAY_KEY = "friday_key";
 const string SATURDAY_KEY = "saturday_key";
 const string SUNDAY_KEY = "sunday_key";

另外,编写 SetFood 方法的更好方法是这样。在设置 PlayerPrefs 之前检查有效性,如果无效则返回。请注意,我已删除“!”运算符从 if 语句的开头开始,并在单个条件元素中使用 '!=' 代替。此外,即使在静态函数中也可以使用 if else 语句。不用担心它会被同时调用。除非您实现多线程,否则 Unity 会确保它被一一调用。 ;)

public static void SetFood (string Day, string Food){       
         if ((Day != "Monday") || (Day != "Tuesday") || (Day != "Wednesday") || (Day != "Thursday") || (Day != "Friday") || (Day != "Saturday") || (Day != "Sunday") ) {
            Debug.LogError ("Day out of range");
            return;
        }

        if (Day == "Monday") {
            PlayerPrefs.SetString (MONDAY_KEY, Food); 
        } else if (Day == "Tuesday") {
            PlayerPrefs.SetString (TUESDAY_KEY, Food);
        } else if (Day == "Wednesday") {
            PlayerPrefs.SetString (WEDNESDAY_KEY, Food);
        } else if (Day == "Thursday") {
            PlayerPrefs.SetString (THURSDAY_KEY, Food);
        } else if (Day == "Friday") {
            PlayerPrefs.SetString (FRIDAY_KEY, Food);
        } else if (Day == "Saturday") {
            PlayerPrefs.SetString (SATURDAY_KEY, Food);
        } else if (Day == "Sunday") {
            PlayerPrefs.SetString (SUNDAY_KEY, Food);
        }
    }

【讨论】:

  • Tysm!修好了!
猜你喜欢
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 2011-07-03
相关资源
最近更新 更多