Unity WebGL运行时从Google Sheets更新JSON仅生效一次的解决办法
解决Unity中Google Sheets数据仅首次点击更新的问题
你的代码核心问题是**rowsjson变量未在每次请求前清空**,第一次请求后它会保留旧数据,后续点击时新数据会追加到旧数据后,导致解析出的lines数组包含历史内容,最终显示的还是第一次的结果。此外还有一些冗余逻辑影响请求流程,以下是修复方案:
关键修复点
- 每次发起请求前重置
rowsjson,确保只处理当前请求的新数据 - 优化
UnityWebRequest的使用方式,自动管理资源避免内存泄漏 - 移除无效逻辑判断,简化代码流程
- 添加索引越界保护,避免数据格式异常时崩溃
- 可选:添加防重复点击机制,避免短时间内多次触发请求
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using SimpleJSON; using UnityEngine.UI; using TMPro; public class ReadGoogleSheet : MonoBehaviour { public TMP_Text outputArea; List<string> eachrow; string rowsjson; string[] lines; // 可选:用于防重复点击,需将按钮拖入该字段 public Button requestButton; public void GetAdress() { // 可选:点击后禁用按钮,防止重复发起请求 if(requestButton != null) requestButton.interactable = false; StartCoroutine(ObtainSheetData()); } IEnumerator ObtainSheetData() { // 每次请求前清空rowsjson,避免旧数据累加 rowsjson = ""; using (UnityWebRequest www = UnityWebRequest.Get("https://sheets.googleapis.com/v4/spreadsheets/1XRobihBf7CyH2hLRV7cczki8nLuH2umWM-z63ytavUs/values/Fighters?alt=json&key=AIzaSyCQlPYIzm0X4x6fUR62o-OtFIQvCG15jsc")) { yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) { Debug.Log("Error: " + www.error); Debug.Log("Offline"); } else { string json = www.downloadHandler.text; var o = JSON.Parse(json); foreach (var item in o["values"]) { var itemo = JSON.Parse(item.ToString()); eachrow = itemo[0].AsStringList; foreach (var bro in eachrow) { rowsjson += bro + ","; } rowsjson += "\n"; } lines = rowsjson.Split(new char[] { '\n' }); // 确保数组有足够元素再赋值,避免索引越界崩溃 if(lines.Length >= 2) { outputArea.text = lines[0] + ": " + lines[1]; } else { outputArea.text = "数据格式异常"; } Debug.Log("Success DownloadData()"); } // 可选:请求完成后恢复按钮可点击状态 if(requestButton != null) requestButton.interactable = true; } } }
改动说明
- 重置
rowsjson:在协程开头添加rowsjson = "";,确保每次请求都从空字符串开始拼接新数据,彻底解决旧数据残留问题。 using管理请求对象:用using包裹UnityWebRequest,自动释放资源,无需外部维护www1变量,避免内存泄漏。- 移除冗余逻辑:删除了无效的
www.timeout > 2判断(如需设置超时,可在创建请求时添加www.timeout = 2;),以及www.isDone的无效判断(yield return www.SendWebRequest()执行完成后请求必然已结束)。 - 索引越界保护:判断
lines数组长度,避免Google Sheets数据格式变化时触发数组索引越界异常。 - 防重复点击:通过控制按钮交互状态,避免用户短时间内多次点击发起重复请求,提升体验。
内容的提问来源于stack exchange,提问作者user29764560
相关产品推荐
相关产品推荐

