본문 바로가기

[unity] Open Path Utility editor class

앤디가이 2022. 5. 30.

Unity의 UIElements를 사용하여, 자주 사용하는 폴더를 바로 열어볼 수 있는 기능을 가진 Open Path Utility Editor Class를 작성해보자.

 

1.  Open Path Utility Class 제작 이유

- 유니티를 하다 보면 항상 특정 폴더를 열어야 할 때(Asset Path, PersistentDataPath, StreamingAssetPath 등) 파인더를 열어서, 해당 폴더를 찾아가곤 했다. 개발할 때 이런 시간적 비용이 점점 커짐에 따라, 해당 기능을 유니티 에디터 기능으로 만들고, 유니티에서 바로 폴더를 열 수 있는 기능을 제작해 놓으면, 상당 부분 개발 시간(비용)을 줄일 수 있다.

 

 

2.  Unity UIElements 소개

 - UIElement는 unity 2019버전부터 새롭게 선보인 UI 시스템이다.

 - 기존 UGUI 시스템과 다르게 웹 기술에 기반하여 구현 및 동작하도록 구성되어 있다(xml, css, jQuery 등)

 - 개인적으로 기존 웹 기반 기술을 가진 개발자라면 접근이 쉬울 것으로 생각되지만, 앱 위주 개발을 했던 개발자라면 조금 어려울 수 있을 것 같기도 하다.

Runtime dev UI Runtime game UI Editor 장단점
IMGUI 디버깅용 권장하지 않음 가능 에디터에서 적용하기
간편함
UGUI 가능 가능 불가능 대부분 게임UI에 많이 사용 중, 사용성 편리함 
UIElements 2019.x 부터 가능 2020.x 부터 가능 2019.1 부터 가능 에디터 및 런타임 게임 UI에 동시 사용 가능
적용 방법 어려움

 

3. Unity UIElement 생성

 - Assets 폴더 적당한 곳에 Utils 폴더를 만들고 Editor 폴더를 만들어 준다.

 - 빈 공간에서 마우스 우클릭 -> Create -> UIElements -> Editor Window로 생성한다.

UIElements Editor Window 생성
UIElements Editor Window 생성

 - OpenPathUtility 라는 이름으로 생성한다.

UIElements Asset Create
UIElements Asset Create

 - 생성을 하게 되면 총 3개의 파일이 생성된다.

  .cs 파일 : Editor Window 클래스

  .uss 파일 : 디자인(스타일)  정보를 가지고 있는 파일

  .uxml 파일 : UI 위치 정보 및 화면의 정보를 가지고 있는 xml 파일

 

 

4. Elements Editor Window 생성

 - .uxml 파일을 열고 기존 내용을 삭제하고, 버튼을 생성해주는 아래 코드를 넣어준다.

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
    <ui:Button name="dataPath" text="Application.dataPath" />
    <ui:Button name="persistentDataPath" text="Application.persistentDataPath" />
    <ui:Button name="streamingAssetsPath" text="Application.streamingAssetsPath" />
    <ui:Button name="temporaryCachePath" text="Application.temporaryCachePath" />
</ui:UXML>

 - .cs 파일을 열고 MenuItem 부분의 경로를 "Utils/OpenPathUtility"로 수정해준다.

 - CreateGUI() 함수의 label 항목을 삭제해 준다.

 - 코드는 아래를 참고하자.

using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;


public class OpenPathUtility : EditorWindow
{
    [MenuItem("Utils/OpenPathUtility")]
    public static void ShowExample()
    {
        OpenPathUtility wnd = GetWindow<OpenPathUtility>();
        wnd.titleContent = new GUIContent("OpenPathUtility");
    }

    public void CreateGUI()
    {
        // Each editor window contains a root VisualElement object
        VisualElement root = rootVisualElement;

        // Import UXML
        var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Modules/Utils/OpenFolder/Editor/OpenPathUtility.uxml");
        VisualElement labelFromUXML = visualTree.CloneTree();
        root.Add(labelFromUXML);
    }
}

 - 저장 후 보면 상단에 Utils 라는 Editor Menu가 생기고, 해당 메뉴를 클릭하면 OpenPathUtility EditorWindow가 생성되는 모습을 볼 수 있다.

Open Path Utility
Open Path Utility

 

5. 버튼 이벤트 스크립트 작성

 - Editor Window의 모습이 완성되었으니, 각 버튼을 클릭했을 때 해당 폴더가 열리는 기능을 작성해보자.

 - .cs 스크립트를 열고 CreateGUI() 함수에 아래와 같이 스크립트를 추가 작성한다.

    public void CreateGUI()
    {
        // Each editor window contains a root VisualElement object
        VisualElement root = rootVisualElement;

        // Import UXML
        var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Modules/Utils/OpenFolder/Editor/OpenPathUtility.uxml");
        VisualElement labelFromUXML = visualTree.CloneTree();
        root.Add(labelFromUXML);

        root.Query<Button>(nameof(Application.dataPath)).First().clickable.clicked += () =>
        {
            Debug.Log(Application.dataPath);
            EditorUtility.RevealInFinder(Application.dataPath);
        };
        root.Query<Button>(nameof(Application.persistentDataPath)).First().clickable.clicked += () =>
        {
            Debug.Log(Application.persistentDataPath);
            EditorUtility.RevealInFinder(Application.persistentDataPath);
        };
        root.Query<Button>(nameof(Application.streamingAssetsPath)).First().clickable.clicked += () =>
        {
            Debug.Log(Application.streamingAssetsPath);
            EditorUtility.RevealInFinder(Application.streamingAssetsPath);
        };
        root.Query<Button>(nameof(Application.temporaryCachePath)).First().clickable.clicked += () =>
        {
            Debug.Log(Application.temporaryCachePath);
            EditorUtility.RevealInFinder(Application.temporaryCachePath);
        };
    }

 - 컴파일 후 다시 Menu -> Utils -> OpenPathUtility를 실행하여 EditorWindow에서 각 버튼을 클릭해 보면. 해당 폴더가 잘 열리는 걸 확인해 볼 수 있다.

 

5. 응용

 - 위 기능을 이용하여, .uxml 파일에 원하는 버튼을 만든 후 cs파일에서 내가 원하는 폴더 경로를 연결해주면 내가 원하는 폴더를 에디터 스크립트를 통해 바로 열어 볼 수 있게 된다.

 - Assets 폴더 밑에 Build 폴더를 만든 후, 해당 폴더 바로 열기를 추가한다면 스크립트는 다음과 같다.

 - .uxml 에 해당 내용 추가

    <ui:Button name="BuildPath" text="BuildPath" />

 - .cs CreateGUI() 함수에 해당 내용 추가

        root.Query<Button>("BuildPath").First().clickable.clicked += () =>
        {
            string path = Path.Combine(Application.dataPath, "Build");

            EditorUtility.RevealInFinder(path);
        };

 - 최종 EditorWindow 모습은 다음과 같다.

open path utility editor window
open path utility editor window

댓글