본문 바로가기
개발/Unity Editor Tool)

UnityEditorToo) 커스텀 콘솔 (Custom Console)

by 테샤르 2024. 11. 3.

커스텀 콘솔 (Custom Console)

Unity Console을 커스텀 해서 CallStack에 있는 정보를 좀 더 편하게 이동하기 위해서 만들었다.

반응형

 

< 유용한 기능>

Console 창이 작아도 노출이 가능하고 내용도 확인이 편하다. 줄바꿈이나 다른 영향을 받지 않는다.

특정 Console의 Log 마우스 오른쪽으로 해당 메뉴를 선택후 Unity에 지정된 IDE로 연결이 가능하다.(바로가기)

 

 

< Log Type 에 따른 커스텀 >

 Log Type 에 따른 다른 표기도 가능하다.

 

 

CallStack을 기반으로 해당 위치로 이동하게 처리를 했다.

 

< PopupWindow 코드 >

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

namespace CustomConsole
{
    public class CustomConsoleInfo
    {
        public string guid;
        public int line;
        public string functionName;
    }

    public class CustomConsoleMenu : PopupWindowContent
    {
        private List<CustomConsoleInfo> callStackTargets = default;
        public bool allowDuplicateNames { get; set; }

        private GUIStyle buttonStyle; // 왼쪽 정렬 버튼 스타일
        private GUIStyle ButtonStyle
        {
            get 
            { 
                if(buttonStyle == null)
                {
                    buttonStyle = new GUIStyle(GUI.skin.button);
                    buttonStyle.alignment = TextAnchor.MiddleLeft; // 왼쪽 정렬
                    buttonStyle.fixedHeight = 18; // 고정 높이 설정
                }
                return buttonStyle;
            }
        }

        public CustomConsoleMenu SetList(List<CustomConsoleInfo> _list)
        {
            callStackTargets = _list;
            return this;
        }

        public override Vector2 GetWindowSize()
        {
            float maxWidth = 0;
            float totalHeight = 0;
            foreach (var item in callStackTargets)
            {
                // 텍스트와 아이콘을 포함한 너비 계산
                Vector2 size = ButtonStyle.CalcSize(new GUIContent(item.functionName));
                maxWidth = Mathf.Max(maxWidth, size.x + 10);
                totalHeight += (size.y + 2);
            }

            return new Vector2(maxWidth, totalHeight);
        }

        public CustomConsoleMenu ShowAtMouse()
        {
            Vector2 mousePosition = Event.current.mousePosition;
            Rect rect = new Rect(mousePosition.x, mousePosition.y, 0, 0);
            PopupWindow.Show(rect, this);
            return this;
        }

        public override void OnGUI(Rect rect)
        {
            if(callStackTargets == null)
                return;
            if (callStackTargets.Count <= 0)
                return;

            for (int i = 0; i < callStackTargets.Count; i++)
            {
                var stackFrame = callStackTargets[i];
                if (GUILayout.Button(new GUIContent(stackFrame.functionName), ButtonStyle))
                {
                    var assetPath = AssetDatabase.GUIDToAssetPath(stackFrame.guid);
                    AssetDatabase.OpenAsset(AssetDatabase.LoadMainAssetAtPath(assetPath), stackFrame.line);
                    editorWindow.Close(); 
                }
            }
        }
    }
}

 

★★★★

 

반응형

댓글