JsonHierarchyViewer.unitypackage
0.00MB

 

 

JSON 파일을 위의 dropArea에 갖다 넣으면

 

 

위와 같이 인식되는데

 

 

토글 버튼을 통해서 데이터 열람이 가능하다.

 

 

 

가독성을 위해 들여쓰기 및 스크롤뷰 구현

 

 

using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using System;

public class JsonHierarchyViewer : EditorWindow
{
    private string jsonFilePath = "";
    private bool rootFoldoutState = false; // 파일 이름 토글 상태를 관리할 새 변수
    private List<bool> foldoutStates = new List<bool>();
    private List<dynamic> jsonData = new List<dynamic>();
    private Vector2 scrollPosition; // 스크롤 위치를 저장할 변수

    [MenuItem("Tools/JSON Hierarchy Viewer")]
    public static void ShowWindow()
    {
        GetWindow<JsonHierarchyViewer>("JSON Hierarchy Viewer");
    }

    private void OnGUI()
    {
        GUILayout.Label("Drag and Drop JSON File Here", EditorStyles.boldLabel);

        GUILayout.BeginVertical();
        var dropArea = GUILayoutUtility.GetRect(0.0f, 100.0f, GUILayout.ExpandWidth(true));
        GUI.Box(dropArea, "Drop JSON Here");
        GUILayout.EndVertical();

        DragAndDropVisual(dropArea);

        // 실선 그리기
        DrawLine();
        if (!string.IsNullOrEmpty(jsonFilePath)) // JSON 파일이 선택되었는지 확인
        {
            // 스크롤 뷰 시작
            scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);

            DisplayJsonData();

            // 스크롤 뷰 종료
            EditorGUILayout.EndScrollView();
        }
    }

    private void DragAndDropVisual(Rect dropArea)
    {
        var currentEvent = Event.current;
        switch (currentEvent.type)
        {
            case EventType.DragUpdated:
            case EventType.DragPerform:
                if (!dropArea.Contains(currentEvent.mousePosition))
                    return;

                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;

                if (currentEvent.type == EventType.DragPerform)
                {
                    DragAndDrop.AcceptDrag();
                    foreach (var draggedObject in DragAndDrop.objectReferences)
                    {
                        var path = AssetDatabase.GetAssetPath(draggedObject);
                        if (Path.GetExtension(path).Equals(".json"))
                        {
                            jsonFilePath = path;
                            ParseJsonFile(path);
                            break;
                        }
                    }
                }
                break;
        }
    }

    private void DrawLine()
    {
        var rect = GUILayoutUtility.GetRect(1, 1, GUILayout.ExpandWidth(true));
        EditorGUI.DrawRect(rect, Color.gray);
    }

    private void ParseJsonFile(string filePath)
    {
        string jsonContent = File.ReadAllText(filePath);
        jsonData = JsonConvert.DeserializeObject<List<dynamic>>(jsonContent);
        foldoutStates.Clear();
        for (int i = 0; i < jsonData.Count; i++)
        {
            foldoutStates.Add(false);
        }
        Repaint();
    }

    private void DisplayJsonData()
    {
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(jsonFilePath);
        rootFoldoutState = EditorGUILayout.Foldout(rootFoldoutState, fileNameWithoutExtension, true);

        if (rootFoldoutState) // 토글 상태가 확장된 경우에만 JSON 데이터 표시
        {
            for (int i = 0; i < jsonData.Count; i++)
            {
                EditorGUI.indentLevel++;
                foldoutStates[i] = EditorGUILayout.Foldout(foldoutStates[i], Convert.ToString(i), true);

                if (foldoutStates[i])
                {
                    EditorGUI.indentLevel++;

                    foreach (var prop in jsonData[i])
                    {
                        EditorGUILayout.LabelField($"{prop.Name}: {prop.Value}");
                    }

                    EditorGUI.indentLevel--;
                }
                EditorGUI.indentLevel--;
            }
        }
    }


}

 

 

++++

 

EditorGUI.indentLevel을 사용할 때에는 

 

EditorGUILayout.Label을 쓰면 적용되지 않는 문제가 있다. 

 

(들여쓰기가 되지 않는다.)

 

따라서

 

EditorGUILayout.LabelField 를 사용해야

 

정상적으로 들여쓰기가 작동된다.

 

JsonHierarchyViewer.unitypackage
0.00MB

+ Recent posts