首页 > 解决方案 > Unity 2019.2.12f1 PlayerPrefs 停止脚本

问题描述

我正在为我正在从事的项目构建身份验证系统。

其中一部分是在本地保存 UserData,这样它就不必在每次运行时都连接到云,或者强制登录 ETC。

我遇到的问题是,当我尝试设置 PlayerPrefs 时它不起作用。我让它在每个 PlayerPrefs.SetString 之前运行一个 Debug.Log 并且它只显示第一个。

我可以在我的 Start() 中执行 PlayerPrefs.SetString 但由于某种原因它在这里不起作用,我不知道为什么。

一切正常,直到我保存到 PlayerPrefs

public Dictionary<string, string> LoggedUser = new Dictionary<string, string>();

public void getUserData(string id, string email)
    {
        Debug.Log("Getting User Data for ID: " + id);
        FirebaseDatabase.DefaultInstance
            .GetReference(id)
            .GetValueAsync().ContinueWith(task1 =>
            {
                if (task1.IsFaulted)
                {
                    Debug.Log("Failed");
                }
                else if (task1.IsCompleted)
                {
                    Debug.Log("Data Retrieved");
                    DataSnapshot snapshot = task1.Result;
                    foreach (DataSnapshot user in snapshot.Children)
                    {

                        string firstName = user.Child("firstName").Value.ToString();
                        string lastName = user.Child("lastName").Value.ToString();
                        string sex = user.Child("sex").Value.ToString();
                        string country = user.Child("country").Value.ToString();
                        string age = user.Child("age").Value.ToString();
                        string userName = user.Child("userName").Value.ToString();

                        Debug.Log(firstName);

                        LoggedUser.Add("FirstName", firstName);
                        LoggedUser.Add("LastName", lastName);
                        LoggedUser.Add("Email", email);
                        LoggedUser.Add("age", age);
                        LoggedUser.Add("sex", sex);
                        LoggedUser.Add("country", country);
                        LoggedUser.Add("userName", userName);


                        Debug.Log("Welcome " + LoggedUser["FirstName"]);
                        Debug.Log("User signed in successfully: " +newUser.Email +" " +newUser.UserId);
                        setPlayer();
                    }
                }
            });
    }

public void setPlayer()
    {
        Debug.Log("Saving to PlayerPrefs");
        Debug.Log("Setting First Name");
        PlayerPrefs.SetString("FirstName", "Ezekiel");
        Debug.Log("Setting Last Name");
        PlayerPrefs.SetString("LastName", LoggedUser["LastName"]);
        Debug.Log("Setting Email");
        PlayerPrefs.SetString("Email", LoggedUser["Email"]);
        Debug.Log("Setting Age");
        PlayerPrefs.SetString("age", LoggedUser["age"]);
        Debug.Log("Setting Sex");
        PlayerPrefs.SetString("sex", LoggedUser["sex"]);
        Debug.Log("Setting Country");
        PlayerPrefs.SetString("country", LoggedUser["country"]);
        Debug.Log("Setting userName");
        PlayerPrefs.SetString("userName", LoggedUser["username"]);
        Debug.Log("Setting Loggedn State");
        PlayerPrefs.SetInt("LoggedIn", 1);
        Debug.Log("Saving Player Prefs");
        PlayerPrefs.Save();


        Debug.Log("Welcome " + PlayerPrefs.GetString("username"));
    }

标签: c#firebaseunity3dauthentication

解决方案


如果您不介意,我可以稍微扩展您的答案。

如果您使用ContinueWithOnMainThread而不是 ContinueWith,您的延续逻辑会自动发生在主线程上(因此您可以编写PlayerPrefs)。如果您想比较它们,我会在本文中介绍大量使用 Firebase 和 Unity 处理线程的方法。

此外,这是在黑暗中的一次尝试,但如果您使用的是实时数据库,那么您可能还会使用Firebase 身份验证。如果是这种情况,那么FirebaseAuth.DefaultInstance.CurrentUser实际上会在您的游戏运行之间持续存在(我在此视频中对此进行了一些介绍)。由于实时数据库还会缓存您在本地请求的数据,因此您实际上可能正在做 Firebase 插件将为您处理的额外工作!


推荐阅读