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循环根本不会执行,自然不会生成任何按钮。
修复步骤:
- 添加JSON包装类:在脚本中创建一个与JSON根结构对应的类,用来容纳按钮数据数组:
public class ButtonDataWrapper { public List<ButtonData> Albania; }
- 修改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
相关产品推荐
相关产品推荐

