You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨场景调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:09:04