Posts 유니티 - 에디터에서 스크립트로 태그, 레이어 추가하기
Post
Cancel

유니티 - 에디터에서 스크립트로 태그, 레이어 추가하기

Note


프로젝트의 일부를 다른 프로젝트로 옮기는 경우,

특정 씬에서만 사용하는 태그 또는 레이어가 존재할 수 있다.

그런데 옮긴 프로젝트에서 해당 태그 또는 레이어가 존재하지 않으면

직접 추가해줘야 하므로 번거롭다.

따라서 아래 소스 코드를 통해 이를 자동화할 수 있다.


Source Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using UnityEngine;
using UnityEditor;

public static class EditorTagLayerHelper
{
    /// <summary> 태그 중복 확인 및 추가 </summary>
    [System.Diagnostics.Conditional("UNITY_EDITOR")]
    public static void AddNewTag(string tagName)
    {
#if UNITY_EDITOR
        SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
        SerializedProperty tagsProp = tagManager.FindProperty("tags");

        int tagCount = tagsProp.arraySize;

        // [1] 해당 태그가 존재하는지 확인
        bool found = false;
        for (int i = 0; i < tagCount; i++)
        {
            SerializedProperty t = tagsProp.GetArrayElementAtIndex(i);

            if (t.stringValue.Equals(tagName))
            {
                found = true;
                break;
            }
        }

        // [2] 배열 마지막에 태그 추가
        if (!found)
        {
            tagsProp.InsertArrayElementAtIndex(tagCount);
            SerializedProperty n = tagsProp.GetArrayElementAtIndex(tagCount);
            n.stringValue = tagName;
            tagManager.ApplyModifiedProperties();
        }
#endif
    }

    /// <summary> 레이어 중복 확인 및 추가 </summary>
    [System.Diagnostics.Conditional("UNITY_EDITOR")]
    public static void AddNewLayer(string layerName)
    {
#if UNITY_EDITOR
        SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
        SerializedProperty layersProp = tagManager.FindProperty("layers");

        int layerCount = layersProp.arraySize;
        int targetIndex = -1;

        // [1] 해당 레이어가 존재하는지 확인
        // NOTE : 0 ~ 7까지는 Buit-in Layer 공간이므로 무시
        for (int i = 8; i < layerCount; i++)
        {
            SerializedProperty t = layersProp.GetArrayElementAtIndex(i);
            string strValue = t.stringValue;

            // 빈 레이어 공간을 찾은 경우
            if (targetIndex == -1 && string.IsNullOrWhiteSpace(strValue))
            {
                targetIndex = i;
            }

            // 이미 해당 레이어 이름이 존재할 경우
            else if (strValue.Equals(layerName))
            {
                targetIndex = -1;
                break;
            }
        }

        // [2] 빈 공간에 레이어 추가
        if (targetIndex != -1)
        {
            SerializedProperty n = layersProp.GetArrayElementAtIndex(targetIndex);
            n.stringValue = layerName;
            tagManager.ApplyModifiedProperties();
        }
#endif
    }
}


예제

  • 컴파일 완료 시 태그 및 레이어 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#if UNITY_EDITOR
public static class ExampleClass
{
    private static bool isPlaymode = false;

    [InitializeOnEnterPlayMode]
    private static void OnEnterPlayMode()
    {
        isPlaymode = true;
    }

    [InitializeOnLoadMethod]
    private static void OnLoadMethod()
    {
        if (isPlaymode) return;

        AddNewLayer("Layer01");
        AddNewLayer("PostProcess");
    }
}
#endif


References


This post is licensed under CC BY 4.0 by the author.