[Unity] Custom Editor Window 데이터 Import 시, Save/Load

2024. 4. 28. 09:00·엔진, 프레임워크/Unity
목차
  1. 1. 상황
  2. 2. 문제가 생긴 이유
  3. 3. UI Toolkit의 작동 원리
  4. 4. 해결 방법 


[Unity] Editor Refresh 시 EditorWindow 데이터 Save/Load


1. 상황

Data 변환기를 EditorWindow로 만들었다. 평소에는 이런 상황이 나타나는 기능을 개발한 적이 없어서 몰랐는데, Field에 값을 채우면 Unity가 새로고침 되면서 Field에 채운 값들이 사라졌다.

 

변환기는 1차 작업과 2차 작업으로 나눌 수 있다. 1차 작업은 Field의 값을 바탕으로 Script를 생성하는 것이고 2차 작업은 Field의 값을 바탕으로 S.O를 생성하는 것이다. Script 생성 시, 자동으로 새로고침이 되면서 Field의 값을 날리기 때문에 2차 작업에 필요한 값을 요구할 수 없는 상황이었다. 설정을 통해서 자동 새로고침을 끌 수 있지만, 내가 원하는 해결 방법은 아니었다.

 

2. 문제가 생긴 이유

나는 UI Toolkit을 써서 Data 변환기를 만들었는데, Unity는 새로운 파일이 Project 폴더에 나타나면 자동으로 새로고침한다. 이 과정이 실시되면 실행되어 있는 EditorWindow도 재실행을 하게 된다. 

 

Data 변환기는 다음과 같은 코드로 이루어져있다.

public partial class DataConverterEditor : EditorWindow
{
    [MenuItem("Data Converter/Data Converter Editor")]
    public static void ShowWindow()
    {
        ...
    }

    public void CreateGUI()
    {
        ...
    }
    
    ...
}

ShowWindow 메서드는 Editor에서 Data 변환기를 실행하는 역할을 담당하고 CreateGUI 메서드는 Monobehaviour 클래스의 Start 메서드와 같이 Window가 열리면서 실행되는 메서드다.

 

CreateGUI 메서드에서 VisualTreeAsset 타입을 rootVisualElement 변수에 Add 하는 작업과 필요한 Editor 컴포넌트들을 캐스팅 하는 작업을 수행한다. 이후, 사용자에게 값을 받아서 컴포넌트의 값을 채운다.

 

아래 링크는 유니티에서 새로고침이 실행되는 과정을 설명한다.

 

에셋 데이터베이스 새로 고치기 - Unity 매뉴얼

Unity는 다음의 경우 에셋 데이터베이스를 새로 고칩니다.

docs.unity3d.com

 

새로고침 과정 중에서 다음과 같은 내용들이 있다.

1)  코드와 관련된 파일 임포트 및 컴파일
컴파일러는 프로젝트의 스크립트 파일과 어셈블리 정의 파일을 사용하여 어셈블리를 생성합니다.

2) 핫 리로드
우선 로드된 모든 스크립트에서 직렬화 가능한 변수 값을 저장하고 다시 스크립트를 로드한 후 값을 복원합니다. 직렬화할 수 없는 변수에 저장된 모든 데이터는 핫 리로드 중에 잃게 됩니다.

정확한 위 두 과정으로 데이터가 변경되는 것인지는 모르겠지만, 새로고침 과정 중 일부로 인해서 데이터가 변경되는 것은 확실하다.

 

새로고침이 진행되면, CreateGUI 메서드가 재실행된다. 그로 인해서 사용자가 작성한 값들이 사라지게 되는 것이다.

 

3. UI Toolkit의 작동 원리

CreateGUI 메서드가 실행되면 왜 값이 날라가는 것인지 알기 위해서는 UI Toolkit의 작동 원리를 알아야 한다. 가볍게만 보자.

 

먼저 UI Toolkit은 Unity가 웹 프로그래밍 방법을 가져와 만든 Unity의 UI 시스템이다. 사용을 위해 Script를 생성하고 EditorWindow 타입을 상속받으면, VisualElement 타입의 rootVisualElement 변수를 사용할 수 있다.

 

나만의 Window를 만들기 위해서는 반드시 rootVisualElement 변수를 사용해서 만들어야 한다. rootVisualElement 변수에 Add 메서드를 통해 값을 추가하고 Unity에서는 rootVisualElement 변수를 Draw 하는 방식이기 때문이다.

 

그래서, 유니티 에디터를 통해 수정되는 값들은 우리가 만든 VisualTreeAsset 타입이나 UXML 확장자 파일과 연결되는 것이 아니다. rootVisualElement가 Window를 만드는 과정에서 우리가 만든 VisualTreeAsset을 복사하는 방식이기 때문이다.

 

그렇기 때문에 새로고침이 실행되면 재복사를 하는 과정이 생겨나고, 이때 모든 값들이 초기화가 되는 것이다.

 

4. 해결 방법 

Editor의 값을 저장하는 EditorPrefs 타입 사용하고 CreateGUI 메서드를 이용하면 새로고침이 진행되어도 값이 날라가지 않는 Editor를 가질 수 있다.

 

EditorPrefs 타입은 PlayerPrefs 타입과 같은 용도로 사용된다. 단, Editor에서 사용이 되는 값이라는 차이가 있다.

    private void UpdateField(string path)
    {
        EditorPrefs.SetString("ExcelPath", path);
        _excelTextField.value = EditorPrefs.GetString("ExcelPath");
        
        LoadExcelAtPath(_excelTextField.value);
    }

값을 입력을 받게 되면, EditorPrefs 타입으로 저장하고 실제로 구현에 필요한 값들은 EditorPrefs 타입의 GetString 메서드를 통해서 전달한다.

 

그리고 모든 값들을 다시 불러오는 Reload 메서드를 만들고 CreateGUI 메서드의 하단 부분에 넣어둔다.

public void CreateGUI() 
{
    ...
    
    Reload();
}

private void Reload()
{
    ...
    // 값을 불러오고 사용되는 값들에 다시 넣어준다.
}

위와 같이 처리하면 새로고침이 되면서 CreateGUI 메서드를 다시 불러오기 때문에 사용자가 정의한 값을 넣어줄 수 있다.

 

이외로 필요한 ISheet 타입은 사용자가 정의한 값을 기반으로 다시 ISheet 인스턴스를 추가하는 메서드를 불러와 실행시켰다.

'엔진, 프레임워크 > Unity' 카테고리의 다른 글

[Unity] Reflection을 사용해서 List에 값 추가하기  (0) 2024.04.27
[WARNING] Unable to find style 'ToolbarSeachTextField' in skin 'DarkSkin' Used  (0) 2024.04.12
[인프런] 따라하면서 배우는 고박사의 유니티 하이퍼캐주얼게임 시리즈 01 후기  (1) 2024.03.22
UI에서 Particle System 추가하는 방법 - Raw Image & Render Texture  (1) 2023.11.12
Unity - Bezier Curve에 대해서 학습해보자.  (0) 2023.08.31
  1. 1. 상황
  2. 2. 문제가 생긴 이유
  3. 3. UI Toolkit의 작동 원리
  4. 4. 해결 방법 
'엔진, 프레임워크/Unity' 카테고리의 다른 글
  • [Unity] Reflection을 사용해서 List에 값 추가하기
  • [WARNING] Unable to find style 'ToolbarSeachTextField' in skin 'DarkSkin' Used
  • [인프런] 따라하면서 배우는 고박사의 유니티 하이퍼캐주얼게임 시리즈 01 후기
  • UI에서 Particle System 추가하는 방법 - Raw Image & Render Texture
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
      오블완
      티스토리챌린지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [Unity] Custom Editor Window 데이터 Import 시, Save/Load
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.