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

Unity动态视频菜单加载JSON按钮无显示问题排查求助

问题:动态加载JSON数据生成按钮失败,无按钮显示

开发一个可动态加载视频跳转按钮的菜单系统,计划通过JSON脚本提供按钮数据,但目前无法将数据显示为按钮。已确认以下几点:

  • 按钮预制体可用
  • JSON文件能正常读取且无路径错误
  • panelTransform GameObject已正确赋值

JSON文件内容

{
  "Albania":
  [
    {
      "buttonId": 1,
      "buttonText": "Tirana1"
    },
    {
      "buttonId": 2,
      "buttonText": "Tirana2"
    },
    {
      "buttonId": 3,
      "buttonText": "Tirana3"
    },
    {
      "buttonId": 4,
      "buttonText": "Tirana3"
    }
  ]
}

挂载在Canvas对象上的脚本

using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Collections.Generic;
using TMPro;

public class ButtonsMenu1 : MonoBehaviour
{
    //public List<ButtonData> buttonData;
    public GameObject buttonPrefab;
    public Transform panelTransform;
    public string jsonFilePath;

    void Start()
    {
        string json = File.ReadAllText(jsonFilePath);
        Debug.Log(json);
        List<ButtonData> buttonData = JsonUtility.FromJson<List<ButtonData>>(json);

        Debug.Log("Panel object: " + panelTransform.name);

        foreach (ButtonData data in buttonData)
        {
            GameObject buttonObj = Instantiate(buttonPrefab, panelTransform); //Instantiates the button within the Transform of the panel
            Button button = buttonObj.GetComponent<Button>(); 
            TMP_Text buttonText = buttonObj.GetComponentInChildren<TMP_Text>();

            button.onClick.AddListener(() => { ButtonClicked(data.buttonId); });
            buttonText.text = data.buttonText;
        }
    }

    void ButtonClicked(int buttonId)
    {
        // Handle button click based on button ID
    }

    public class ButtonData
    {
        public int buttonId;
        public string buttonText;
    }
}

问题原因与解决方案

核心问题:JSON结构与解析代码不匹配

Unity的JsonUtility无法直接解析外层带有键名(这里是Albania)的数组结构。你的代码尝试直接把整个JSON解析成List<ButtonData>,但JSON的根对象是一个包含Albania数组的对象,导致解析后buttonData为null,后续的foreach循环根本不会执行,自然不会生成任何按钮。

修复步骤:

  1. 添加JSON包装类:在脚本中创建一个与JSON根结构对应的类,用来容纳按钮数据数组:
public class ButtonDataWrapper
{
    public List<ButtonData> Albania;
}
  1. 修改JSON解析逻辑:在Start方法中,先解析成包装类,再取出按钮数据列表:
void Start()
{
    string json = File.ReadAllText(jsonFilePath);
    Debug.Log(json);
    // 替换原解析代码
    ButtonDataWrapper wrapper = JsonUtility.FromJson<ButtonDataWrapper>(json);
    List<ButtonData> buttonData = wrapper.Albania;

    Debug.Log("Panel object: " + panelTransform.name);
    // 增加空值判断,避免空引用报错
    if(buttonData == null)
    {
        Debug.LogError("Button data is null, check JSON structure or parsing logic");
        return;
    }

    foreach (ButtonData data in buttonData)
    {
        GameObject buttonObj = Instantiate(buttonPrefab, panelTransform);
        Button button = buttonObj.GetComponent<Button>(); 
        TMP_Text buttonText = buttonObj.GetComponentInChildren<TMP_Text>();

        button.onClick.AddListener(() => { ButtonClicked(data.buttonId); });
        buttonText.text = data.buttonText;
    }
}

额外检查点:

  • 打开Unity控制台,查看是否有NullReferenceException报错,如果有,说明解析后的数据为空
  • 确保ButtonData类的字段名与JSON中的键名完全一致(大小写敏感)
  • 检查按钮预制体的RectTransform尺寸是否正常,避免因尺寸为0导致看不见按钮
  • 确认panelTransform对象添加了合适的布局组件(比如Vertical Layout Group),确保生成的按钮能自动排列显示

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:27:49