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

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;
        }
    }
}

改动说明

  1. 重置rowsjson:在协程开头添加rowsjson = "";,确保每次请求都从空字符串开始拼接新数据,彻底解决旧数据残留问题。
  2. using管理请求对象:用using包裹UnityWebRequest,自动释放资源,无需外部维护www1变量,避免内存泄漏。
  3. 移除冗余逻辑:删除了无效的www.timeout > 2判断(如需设置超时,可在创建请求时添加www.timeout = 2;),以及www.isDone的无效判断(yield return www.SendWebRequest()执行完成后请求必然已结束)。
  4. 索引越界保护:判断lines数组长度,避免Google Sheets数据格式变化时触发数组索引越界异常。
  5. 防重复点击:通过控制按钮交互状态,避免用户短时间内多次点击发起重复请求,提升体验。

内容的提问来源于stack exchange,提问作者user29764560

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:53:14