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 를 사용해야
정상적으로 들여쓰기가 작동된다.
'UnityDataTools' 카테고리의 다른 글
Random Seed Generator (0) | 2024.03.24 |
---|---|
MoveToFileEditor (0) | 2024.03.21 |
PlayerPrefs Viewer 수정 (+float type) (0) | 2024.03.19 |
[UnityDataTools] Big Number Converter - 리얼 숫자 변환/역변환 + 계산기 (0) | 2024.02.22 |
[UnityDataTools] Excel to JSON Converter - 파일 자동 변환 도구 (xlsx -> json, cs) (0) | 2024.02.14 |