Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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# Unity 2019.2.12f1播放器参考暂停脚本_C#_Firebase_Unity3d_Authentication - Fatal编程技术网

C# Unity 2019.2.12f1播放器参考暂停脚本

C# Unity 2019.2.12f1播放器参考暂停脚本,c#,firebase,unity3d,authentication,C#,Firebase,Unity3d,Authentication,我正在为我正在进行的一个项目构建一个认证系统 其中一部分是在本地保存用户数据,这样就不必在每次运行时都连接到云,也不必强制登录等 我遇到的问题是,当我试图设置PlayerPrefs时,它不起作用。我让它在每个PlayerPrefs.SetString之前运行Debug.Log,它只显示第一个 我可以在Start()中执行PlayerPrefs.SetString,但由于某些原因,它在这里不起作用,我不知道为什么 在我保存到PlayerPrefs之前,一切都正常 公共字典LoggedUser=ne

我正在为我正在进行的一个项目构建一个认证系统

其中一部分是在本地保存用户数据,这样就不必在每次运行时都连接到云,也不必强制登录等

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

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

在我保存到PlayerPrefs之前,一切都正常

公共字典LoggedUser=new Dictionary()


您正在设置
userName

PlayerPrefs.SetString(“用户名”,LoggedUser[“用户名])

并检索
用户名

Log(“欢迎”+PlayerPrefs.GetString(“用户名”)

也应该是

PlayerPrefs.SetString(“用户名”,LoggedUser[“用户名])

而不是

PlayerPrefs.SetString(“用户名”,LoggedUser[“用户名])


您正在设置
用户名

PlayerPrefs.SetString(“用户名”,LoggedUser[“用户名])

并检索
用户名

Log(“欢迎”+PlayerPrefs.GetString(“用户名”)

也应该是

PlayerPrefs.SetString(“用户名”,LoggedUser[“用户名])

而不是

PlayerPrefs.SetString(“用户名”,LoggedUser[“用户名])


我找到了解决办法

getUserData()方法正在运行async,这将创建一个新线程。PlayerPrefs只能在主线程上运行

我的解决方案是创建一个布尔值,当数据加载到LoggedUser中时,我将其转换为true。我的Update()方法正在观察是否将其转换为true,然后调用setPlayer()


谢谢你们的帮助

我找到了解决办法

getUserData()方法正在运行async,这将创建一个新线程。PlayerPrefs只能在主线程上运行

我的解决方案是创建一个布尔值,当数据加载到LoggedUser中时,我将其转换为true。我的Update()方法正在观察是否将其转换为true,然后调用setPlayer()


谢谢你们的帮助

如果你不介意的话,我可以把你的答案再详细一点

如果使用而不是ContinueWith,则继续逻辑将自动出现在主线程上(因此您可以编写
PlayerPrefs
)。如果您愿意比较的话,我将在中介绍大量使用Firebase和Unity处理线程的方法


此外,这是一种暗箭伤人的做法,但如果您使用的是实时数据库,那么您也可能使用。如果是这种情况,那么在游戏的两次运行之间实际上会持续(我会在中稍微介绍一下)。由于实时数据库还缓存您在本地请求的数据,您实际上可能正在做Firebase插件将为您处理的额外工作

如果你不介意的话,我可以把你的答案再详细一点

如果使用而不是ContinueWith,则继续逻辑将自动出现在主线程上(因此您可以编写
PlayerPrefs
)。如果您愿意比较的话,我将在中介绍大量使用Firebase和Unity处理线程的方法


此外,这是一种暗箭伤人的做法,但如果您使用的是实时数据库,那么您也可能使用。如果是这种情况,那么在游戏的两次运行之间实际上会持续(我会在中稍微介绍一下)。由于实时数据库还缓存您在本地请求的数据,您实际上可能正在做Firebase插件将为您处理的额外工作

PlayerPrefs.Save()将数据写入磁盘(例如,在pc上它是hdd/ssd,在移动设备上它是内部存储器(我知道此信息是2*2=4:D))。也许你的计算机没有权限从应用程序中写入日期,只需在其他设备或其他操作系统上尝试,否则上面编写的代码中的所有内容看起来都很好。此外,如果我错了,并且没有设备权限问题,那么你必须在与上面的脚本相关的其他脚本中搜索问题(如果有)什么样的搜索问题?我是计算机管理员,它在同一脚本的开始方法中工作。我的意思是,你的问题必须在其他脚本中搜索,而不是你在这里发布的这个脚本(这只是假设),它在哪里工作?在编辑器中还是在实际设备上构建之后?或者你的目标平台是什么?PlayerPrefs.Save()在磁盘上写入数据(例如,在pc上它是hdd/ssd,在移动设备上它是内部存储器(我知道这个信息是2*2=4:D))。可能您的计算机上没有写入应用程序日期的权限,只需在其他设备或其他操作系统上尝试,否则上面编写的代码中的所有内容看起来都很好。此外,如果我错了,并且没有设备权限问题,则您必须在与上面的脚本相关的其他脚本中搜索问题(如果有)什么样的搜索问题?我是计算机管理员,它在同一脚本的开始方法中工作。我的意思是,你的问题必须在其他脚本中搜索,而不是你在这里发布的这个脚本(这只是假设)它在哪里工作?在编辑器中还是在实际设备上构建之后?或者你的目标平台是什么?谢谢你指出,我确实注意到了这一点,并且已经解决了它。但是这不是我问题的解决方法。谢谢你指出,我确实注意到了这一点,并且已经解决了它。但是这不是我问题的解决方法
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"));
    }