[#if UNITY_EDITOR] 줄이는 편법

내 경우 유니티 에디터 확장을 따로 짜기 귀찮아서 MonoBehaviour 대신 VFW의 BaseBehaviour를 자주 사용한다. 그래서 에디터에서만 쓸수있는 클래스가 스크립트에서 자주 등장한다. 대표적인 예로 UnityEditor.AssetDatabase가 있다.

using UnityEditor;

class AssetFindDemo : BaseBehaviour {
    [Show]
    void Find_AssetDB() {
        var founds = AssetDatabase.FindAssets("AssetFindDemo");
        foreach (var found in founds) {
            var x = AssetDatabase.GUIDToAssetPath(found);
            Debug.LogFormat("found : {0}", x);
        }
    }
}

겉보기에는 멀정해보이지만 이 코드로는 빌드를 뽑을수 없다. UnityEditor 네임스페이스는 빌드에서는 못쓰기 떄문이다. 그래서 빌드를 뽑고 싶으면 전처리기를 이용해야한다.

#if UNITY_EDITOR
using UnityEditor;
#endif

class AssetFindDemo : BaseBehaviour {
    [Show]
    void Find_AssetDB() {
#if UNITY_EDITOR
        var founds = AssetDatabase.FindAssets("AssetFindDemo");
        foreach (var found in founds) {
            var x = AssetDatabase.GUIDToAssetPath(found);
            Debug.LogFormat("found : {0}", x);
        }
#endif
    }
}

#if UNITY_EDITOR, #endif 를 직접 치다보니까 짜증나더라. 함수에서 문제있는 구역을 전처리기로 감싸는 작업은 익숙해졌지만 using UnityEditor;를 전처리기로 감싸는건 자주 잊어버렸다. 그래서 접근법을 바꾸기로 했다.

UnityEditor.AssetDatabase를 통째로 감싸는거다. 아래 같은 느낌으로 AssetDatabase를 감싸는 새로운 클래스 CustomAssetDatabase를 만들었다.

#if UNITY_EDITOR
using UnityEditor;
#endif


class CustomAssetDatabase {
    public static string GUIDToAssetPath(string guid) {
#if UNITY_EDITOR
        return AssetDatabase.GUIDToAssetPath(guid);
#else
        return null;
#endif
    }
      
    public static string[] FindAssets(string filter) {
#if UNITY_EDITOR
        return AssetDatabase.FindAssets(filter);
#else
        return null;
#endif
    }
}

그리고 AssetDatabase가 필요한 상황에서는 CustomAssetDatabase를 쓴다.

class AssetFindDemo : BaseBehaviour {
    [Show]
    void Find_CustomAssetDB() {
        var founds = CustomAssetDatabase.FindAssets("AssetFindDemo");
        foreach(var found in founds) {
            var x = CustomAssetDatabase.GUIDToAssetPath(found);
            Debug.LogFormat("found : {0}", x);
        }
    }
}

#if UNITY_EDITOR, #endif 를 CustomAssetDatabase에 전부 몰아넣었기 때문에 다른 곳에서는 전처리기를 안써도 된다.


comments powered by Disqus