c# - 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"));
}
解决方案
如果您不介意,我可以稍微扩展您的答案。
如果您使用ContinueWithOnMainThread而不是 ContinueWith,您的延续逻辑会自动发生在主线程上(因此您可以编写PlayerPrefs
)。如果您想比较它们,我会在本文中介绍大量使用 Firebase 和 Unity 处理线程的方法。
此外,这是在黑暗中的一次尝试,但如果您使用的是实时数据库,那么您可能还会使用Firebase 身份验证。如果是这种情况,那么FirebaseAuth.DefaultInstance.CurrentUser实际上会在您的游戏运行之间持续存在(我在此视频中对此进行了一些介绍)。由于实时数据库还会缓存您在本地请求的数据,因此您实际上可能正在做 Firebase 插件将为您处理的额外工作!
推荐阅读
- python - While循环中的用户输入验证问题
- bash - 在 Bash 中打印字符串中子字符串的索引
- qt - 有没有办法在 qml 中看到 cpp 函数描述作为提示
- python - 如何检查字典的所有多值作为 Python 中 pd.dataframe 的条件
- docker - 在 gitlab CI 中运行 Protractor 测试 docker 镜像
- xamarin.ios - Xamarin.iOS:NFC 应用程序未在模拟器中运行,引发错误
- javascript - 使用 Javacript 过滤大型数组
- go - 如果请求复杂,如何在 Go 中实现存储库?
- reactjs - Apollo、NextJS、API Route 显示内容失败
- powerbi - Power BI 中不同可视化的时间切片器