[Unity] UI Elements의 UXML, USS에 지정된 고급 경로 이동

10575 단어 UnityUI Elementstech

개요


Unity 편집기 확장을 작성할 때 사용하는 UI Elements에서는 Uxml, uss 경로에 GUID를 사용하여 파일의 이동과 이름을 강화합니다.

UI Elements 샘플에서 경로 지정 방식으로 로드


UI Elements의 샘플은 기본적으로 다음과 같은 형식으로 경로를 지정하고 AsseetDatabase를 통해 불러옵니다.
public class MyWindow : EditorWindow
{
    private const string UxmlPath = "Assets/Editor/MyWindow.uxml";
    private const string UssPath =  "Assets/Editor/MyWindow.uss";
    
    protected void OnEnable()
    {
        var template = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(UxmlPath);
        template.CloneTree(rootVisualElement);

        var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(UssPath);
        rootVisualElement.styleSheets.Add(styleSheet);
    }
}

간단하네요.이렇게 하면 순조롭게 읽을 수 있다.
다만, 개발 단계에서 문제가 발생할 수 있다.

파일 위치를 이동할 때 원본 코드를 수정해야 합니다


예를 들어 현재Assets/Editor/에 설치된 uxml,uss가 Assets/Editor/Hoge/ 아래로 이동하려면 아래와 같이 원본 코드를 고쳐야 한다.
public class MyWindow : EditorWindow
{
-    private const string UxmlPath = "Assets/Editor/MyWindow.uxml";
-    private const string UssPath =  "Assets/Editor/MyWindow.uss";
+    private const string UxmlPath = "Assets/Editor/Hoge/MyWindow.uxml";
+    private const string UssPath =  "Assets/Editor/Hoge/MyWindow.uss";

경로가 원본에 박혀 있기 때문에 파일이 이동하는 시간에 수정을 잊어버리기 쉽다.잊어버리면 실행 후 파일을 읽을 수 없는 오류가 발생해 정신 이상을 일으킬 수 있다.
이것은 당연히 파일 이름의 이름에 따라 발생할 것이다.

Seriralize Field 참조를 통해 경로 이동 강화


그럼 어떡하지?
원본 코드에서 경로를 지정해서 발생하면 취소할 수 있습니다.
네, 저는 항상 유닛에서 저를 챙겨주셨던 거예요.
Serialize Field를 작성하여 Inspector로 드래그합니다.

Serialize Field 제작


지금 코드를 수정하여 Serialize Field를 통해 설정할 수 있습니다.
public class MyWindow : EditorWindow
{
    public VisualTreeAsset visualTreeTemplate;
    public StyleSheet styleSheet;
    
    protected void OnEnable()
    {
        visualTreeTemplate.CloneTree(rootVisualElement);
        rootVisualElement.styleSheets.Add(styleSheet);
    }
}
Asseet Database를 통해 경로를 불러오는 것을 중지하고 Serialize Field를 통해MonoBehaviour 등과 같은 방법으로 가져옵니다.
상당히 쉬워졌네요.
그러나 일반적인 MonoBehaviour는 Prefab과 Scene에서 설정한 참고입니다.
이번에는 참조를 어떻게 설정할까요?

Reference 설정


Reference 설정은 자체 선택MyWindow.cs 시 Inspector에서 수행됩니다.
아래의 내용을 참조하시오.

이렇게 하면 Editor Window가 열려 있을 때 이전처럼 경로 지정을 통해 읽지 않더라도 인스턴스를 설정할 수 있습니다.
편리합니다!
이렇게 하면 UXML 및 USS 파일을 이동하거나 이름을 바꾸어도 제대로 읽을 수 있습니다.

어떻게 됐어요?


Serialize Field는 일반적으로 장면과 예비 조립에 저장된 물건이다.
스크립트에 직접 설정하는 건 어떤 상황일까요?
다음은 설정 시MyWindow.cs.meta의 내용이다.defaultReferences 항목에 GUID가 설정되어 있습니다.
여기에 저장하면 Window를 열 때 Unity가 켜집니다.
fileFormatVersion: 2
guid: 957c9efbf85045c8b717564a28fb38d3
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences:
  - m_ViewDataDictionary: {instanceID: 0}
  - visualTreeTemplate: {fileID: 9197481963319205126, guid: a01b586d170f9446eaf1f5a3fa03240e,
      type: 3}
  - styleSheet: {fileID: 7433441132597879392, guid: 298ffae2bc2de45abbb293e822b8eb95,
      type: 3}
  executionOrder: 0
  icon: {instanceID: 0}
  userData: 
  assetBundleName: 
  assetBundleVariant: 

하지만 때로는null?


내 원인과 대책도 잘 모르겠지만, 아래의 스크립트가 컴파일되어 달아난 후, Serialize Field의 복구가 순조롭지 못하면,null가 반환하는 상황이 있을 것 같다.
  • 상기 절차에 따라 제작된 창문을 연 상태
  • 스크립트 수정 및 컴파일 실행
  • 컴파일이 끝난 후 Domain Reload가 발생하고 OnEnable
  • 이 호출됩니다.
  • 공백으로 되돌아갈 수 있음
  • 원인과 대안을 찾지 못했기 때문에 읽을 수 없을 때 Refresh 버튼을 표시하고 Reload를 해서 얼렁뚱땅 넘어간다.좋은 대책이 있으면 말씀해 주세요.
    그게 다야.

    좋은 웹페이지 즐겨찾기