跨场景调用PlayerPrefs失败求助:Google登录用户名读取异常
问题分析与解决方案
从你的代码里能看到几个核心问题,直接导致了PlayerPrefs读取失败的情况:
1. 存储与读取的Key完全不匹配
你存储用户名时用的Key是:
PlayerPrefs.SetString("Username " + currEmail, currEmail);
但读取的时候却错误拼接成了:
PlayerPrefs.GetString("Username " + googleSign.currEmail + "Username ");
末尾多出来的"Username "让读取的Key和存储的Key完全不一致,自然找不到对应的值。
2. currEmail变量在新场景中为空
你没有给Google登录脚本做跨场景实例保留(比如DontDestroyOnLoad),而是在两个场景都挂载了该脚本。这意味着进入新场景后,新场景里的Google登录脚本是全新的实例,它的currEmail并没有被赋值——登录操作是在之前场景的脚本实例里完成的,新实例根本不知道这个值。所以读取时googleSign.currEmail是空字符串,进一步让Key变得无效。
修复步骤
步骤1:统一存储和读取的Key(最简单可靠的方式)
直接用一个固定的Key名来存储,避免变量拼接带来的错误,比如"Google_Username":
登录脚本的存储代码修改:
else { AddToInformation("Welcome: " + task.Result.DisplayName + "!"); // ... 其他原有代码 string userDisplayName = task.Result.DisplayName; PlayerPrefs.SetString("Google_Username", userDisplayName); PlayerPrefs.Save(); // 手动调用Save确保数据写入磁盘 Debug.Log("已存储用户名:" + userDisplayName); }
读取脚本的代码修改:
void Start() { displayName(); } public void displayName() { // 第二个参数是默认值,用于处理未找到存储值的情况 userName.text = PlayerPrefs.GetString("Google_Username", "请先登录"); }
步骤2:如果一定要用变量拼接Key的话
如果你坚持要用currEmail拼接Key,需要解决跨场景变量传递的问题:
- 把
currEmail改成静态变量:在Google登录脚本里定义public static string currEmail;,这样所有场景的脚本都能访问到同一个静态变量的值; - 或者给登录场景的Google登录脚本添加
DontDestroyOnLoad(transform.gameObject);,让它在场景切换时不被销毁,然后在新场景里通过单例模式或GameObject.Find获取这个实例,再读取currEmail。
这样修改后,应该就能正常读取到存储的DisplayName了。
内容的提问来源于stack exchange,提问作者user10865688
相关产品推荐
相关产品推荐

