设置播放器pref键会导致设置所有Unity3D

时间:2018-03-11 03:11:06

标签: c# unity3d key

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

编辑:我知道它是if函数中的所有SetFood语句(而不是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");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的所有密钥都具有相同的值,即“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);
        }
    }