제 1장 에디터 확장에서 사용되는 폴더

2019. 7. 27. 22:53유니티/(Old)에디터 확장

 

Unity エディター拡張入門

Web版無償公開中!Unityエディター拡張の入門書!

anchan828.github.io

에디터 확장을 시작하기에 앞서 알아야 되는 것이 있습니다. 이 장에서는 에디터 확장의 세계에 들어가기 위한 첫 걸음으로 에디터 확장의 필요한 폴더에 대해서 설명합니다.

1.1 Editor 폴더

Editor 폴더는 에디터 API를 사용하기 위한 특별한 폴더입니다. 보통 에디터 API는 런타임에서 동작하지 않습니다.

시험삼아 다음 코드를 Assets 폴더 바로 밑에 두고 작성하고, Build Settings 윈도우에서 빌드를 해봅니다.

using UnityEngine;
using UnityEditor;
 
public class NewBehaviourScript : MonoBehaviour
{
}

 

그러면 빌드가 실패하고 다음과 같이 로그가 표시됩니다.

그림 1.1 : 빌드 에러, 이름공간 [UnityEditor]를 찾을 수 없습니다.

이 에러는 빌드 때 발생하는 Assembly-CSharp.dllUnityEditor.dll의 참조할 수 없기 때문입니다.

하지만 개발을 할 때 Unity 에디터에서 생성된 Assembly-CSharp.dll은 UnityEditor.dll를 참조를 할 수 있기 때문에 스크립트의 컴파일에서는 에러를 발생하지 않습니다. 빌드를 할 때 생성되는 Assembly-CSharp.dll은 UnityEditor.dll을 참조하지 않는 것을 기억해야합니다. 이 것을 모를 경우 [갑자기 빌드가 되지 않는다]와 같은 원인을 생각하게 됩니다.

그림 1.2 : Monodevelop에서 살펴보면 UnityEditor.dl을 참조하고 있습니다.

이러면 에디터 API를 만족스럽게 사용할 수가 없습니다. 빌드를 위해 에디터 API를 사용하고 있는 스크립트파일을 제거하는 것도 있지만 이 것은 손이 많이 갑니다.

Assembly-CSharp-Editor.dll

UnityEditor는 Assembly-CSharp-Editor.dll을 생성할 때,에디터 API와 런타임 API를 구분짓기에 이 문제를 해결합니다. 이 Assembly-CSharp-Editor.dll는 빌드할 때는 포함되지 않기 때문에 에러가 발생하지 않습니다.

Assembly-CSharp-Editor.dll는 Editor폴더 내의 스크립트 파일이 컴파일해서 생성합니다.

Editor 폴더의 위치는 특별히 제한은 없습니다. 어디에도 복수로 작성이 가능합니다.

● Assets/Editor

● Assets/MyFolder/Scripts/Editor

● Assets/Standard Assets/Editor

그림 1.3 : 폴더 명이 Editor라면 장소는 상관없습니다.

다만, 「Standard Assets」, 「Pro Standard Assets」, 「Plugins」 폴더 내의 Editor 폴더를 작성할 경우, 스크립트는

Assembly-CSharp-Editor-firstpass.dll로부터 컴파일됩니다.

그림 1.4: firspass가 참조되고 있는 것을 알 수 있습니다

Assembly-CSharp-Editor 로부터는 firstpass 를 참조할 수 있지만, 역으로 firstpass로부터 Assembly-CSharp-Editor.dll 를 참조할 수 없으니 주의해주세요.

Editor 폴더에 포함하지 않고 동작하는 방법

런타임으로 동작할 스크립트를 에디터 API와 같이 기술할 수 있습니다. 이 경우 [#define]을 이용합니다.

유니티는 Editor에서만 처리를 할 수 있도록 UNITY_EDITOR 심볼이 제공합니다. 빌드를 하면 스크립트 컴파일에는 [#if UNITY_EDITOR]로 둘러싼 코드는 컴파일을 하지 않습니다.

using UnityEngine;
 
#if UNITY_EDITOR
using UnityEditor;
#endif
 
public class NewBehaviourScript : MonoBehaviour
{
    void OnEnable()
    {
#if UNITY_EDITOR
        EditorWindow.GetWindow<ExampleWindow>();
#endif
    }
}

1.2 Editor Default Resources 폴더

「Resources」 폴더 중에서 에디터 전용으로 제공하는 리소스를 관리해주는 폴더입니다.

「Editor Default Resources」폴더 내에 있는 에셋은 EditorGUIUtility.Load으로부터 접근하는 것이 가능합니다.

그림 1.5 : logo.png의 화상 파일이 있습니다.

var tex = EditorGUIUtility.Load("logo.png"as Texture;

내장용(Build-In) 리소스

Build-In : 내장, 유니티 에디터 용으로 내장 시키겠다는 의미입니다.

Editor Default Resources 폴더는 에디터 전용으로 사용되는 리소스를 관리하는 것이며, 출시 목적으로 리소스를 관리하기 위하여 사용하는 것이 아닙니다.

내장용(Build-In) 리소스를 불러오기

에디터에서 사용할 내장용 리소스는 하나의 에셋번들로 취급됩니다.

확인을 위하여 EditorGUIUtility.GetEditorAssetBundle을 사용하여 에셋번들을 얻어봅니다.

그림 1.6 : AssetBundle.GetAllAssetNames를 통하여 경로를 확인

[InitializeOnLoadMethod]
static void GetBultinAssetNames()
{
    var flags = BindingFlags.Static | BindingFlags.NonPublic;
    var info = typeof(EditorGUIUility).GetMethod("GetEditorAssetBundle", flags);
    var bundle = info.Invoke(nullnew object[0]) as AssetBundle;
 
    foreach (var n in bundle.GetAllAssetNames())
    {
        Debug.Log(n);
    }
}

경로를 확인하면 후에 EditorGUIUtility.Load로 에셋을 불러올 수 있습니다. 반드시, Load 변수로 에셋을 로드를 해주세요. 앞에서 취득한 에셋번들로부터 로드한 것을 사용해서는 안됩니다.

EditorGUIUtility.Load는 먼저 Unity 프로젝트의 「"Assets/Editor Default Resources/" + path」 경로를 검색합니다. 이 때 에셋이 존재하면 해당 에셋을 사용하고 없으면 내장된 에셋번들로부터 에셋을 불러옵니다. 이러한 처리 방식을 통해, 「내장용 리소스를 관리하는 것」이 가능합니다.

 

'유니티 > (Old)에디터 확장' 카테고리의 다른 글

제 5장 SerializedObject에 대해서  (0) 2019.07.28
제4장 ScriptableObject  (0) 2019.07.28
제3장 데이터 보존  (0) 2019.07.28
제2장 표준에서 사용하는 에디터 확장기능  (0) 2019.07.27
개요  (0) 2019.07.27