열거형(enum)을 사용할 때 기획 의도에 따라 이미 선언된 enum id에서 중간에 번호가 삽입되어 중복되는 enum 번호가 생길 수 있습니다. 이런 경우 자동으로 enum ID를 중복되지 않게 갱신해 주는 툴을 사용할 수 있습니다.

 

📺 미리 보기

enum MsgId
{
	....
    
    // 생성된 GenerateTransformSync를 파괴
    C_DESTROY_GENERATE_TRANSFORM_SYNC = 14;
    S_DESTROY_GENERATE_TRANSFORM_SYNC = 14;
    C_TRANSFORM_SYNC = 15;
    S_TRANSFORM_SYNC = 16;
    C_MOVE_RIGIDBODY_TRANSFORM_SYNC = 17;
    C_REQUEST_RIGIDBODY_SYNC_TEST_1 = 17;
    C_REQUEST_RIGIDBODY_SYNC_TEST_2 = 17;
    C_REQUEST_RIGIDBODY_SYNC_TEST_3 = 17;
    C_REQUEST_RIGIDBODY_SYNC_TEST_4 = 17;
    C_REQUEST_RIGIDBODY_SYNC_TEST_5 = 17;
    S_MOVE_RIGIDBODY_TRANSFORM_SYNC = 18;
    C_STOP_RIGIDBODY_TRANSFORM_SYNC = 19;
    S_STOP_RIGIDBODY_TRANSFORM_SYNC = 20;

	....
}
  • 위와 같이 중간에 Enum이 삽입된 경우 중복되는 번호를 쉽게 업데이트 할 수 있습니다.

 

쉽게 갱신이 중복되지 않은 값으로 갱신이 가능

 

 

💬 서론

  • 이 스크립트는 구글 프로토콜 버퍼에서 프로토콜을 디자인할 때 Enum이 중간에 삽입되어 중복되는 번호가 생기는 경우 이것을 쉽게 수정하기위해 만든 기능입니다.

 

 

⚒️ 스크립트

  • 이 스크립트를 유니티 에디터 에셋 폴더내에 추가합니다.

EnumIdEditorWindow.cs
0.00MB

/*
 * Enum ID Editor Window
 * 작성자: [Bonnate] https://bonnate.tistory.com/
 * 라이선스: 없음 (명시적인 라이선스 없이 제공됨)
 * 설명: 이 스크립트는 Unity Editor에서 Enum ID를 업데이트하기 위한 툴인 Enum ID Editor Window를 제공합니다.
 * 사용 방법: Unity Editor의 Tools 메뉴에서 "Bonnate > Enum ID Editor"을 선택하여 툴을 실행합니다. Enum 스니펫을 입력하고 "Enum ID 업데이트" 버튼을 클릭하여 업데이트할 수 있습니다.
 */

#if   UNITY_EDITOR

using UnityEditor;
using UnityEngine;

public class EnumIdEditorWindow : EditorWindow
{
    private string mEnumSnippet = "";
    private Vector2 mScrollPosition;

    [MenuItem("Tools/Bonnate/Enum ID Editor")]
    public static void ShowWindow()
    {
        EnumIdEditorWindow window = EditorWindow.GetWindow<EnumIdEditorWindow>(false, "Enum ID 편집기");
        window.minSize = new Vector2(200f, 200f);
    }

    private void OnGUI()
    {
        GUILayout.BeginHorizontal();

        GUILayout.Label("Enum 스니펫", EditorStyles.boldLabel);

        if (GUILayout.Button("Enum ID 업데이트", GUILayout.Width(120f)))
        {
            UpdateEnumIds();
            GUI.FocusControl(null);
        }

        GUILayout.EndHorizontal();

        GUILayout.BeginVertical(GUILayout.ExpandHeight(true));

        mScrollPosition = EditorGUILayout.BeginScrollView(mScrollPosition, GUILayout.ExpandHeight(true));

        mEnumSnippet = EditorGUILayout.TextArea(mEnumSnippet, GUILayout.ExpandHeight(true));

        EditorGUILayout.EndScrollView();

        GUILayout.Space(20);

        GUILayout.BeginHorizontal();

        EditorGUILayout.LabelField("Powered by: Bonnate");

        if (GUILayout.Button("Github", GetHyperlinkLabelStyle()))
        {
            OpenURL("https://github.com/bonnate");
        }

        if (GUILayout.Button("Blog", GetHyperlinkLabelStyle()))
        {
            OpenURL("https://bonnate.tistory.com/");
        }

        GUILayout.EndHorizontal();

        GUILayout.EndVertical();
    }

    private GUIStyle GetHyperlinkLabelStyle()
    {
        GUIStyle style = new GUIStyle(GUI.skin.label);
        style.normal.textColor = new Color(0f, 0.5f, 1f);
        style.stretchWidth = false;
        style.wordWrap = false;
        return style;
    }

    private void OpenURL(string url)
    {
        EditorUtility.OpenWithDefaultApp(url);
    }

    private void UpdateEnumIds()
    {
        // Enum 스니펫을 파싱하여 Enum 값들을 업데이트합니다.
        string[] lines = mEnumSnippet.Split('\n');
        int enumId = 0;

        for (int i = 0; i < lines.Length; i++)
        {
            string line = lines[i];

            if (line.StartsWith("//") || string.IsNullOrEmpty(line))
                continue;

            if (line.Contains("="))
            {
                int equalIndex = line.IndexOf('=');
                string enumName = line.Substring(0, equalIndex).TrimEnd() + " "; // 뒷 공백 추가
                string enumValue = enumId.ToString();

                // Enum 값 업데이트
                lines[i] = enumName + " = " + enumValue + ";";

                enumId++;
            }
        }

        // 업데이트된 Enum 스니펫을 하나의 문자열로 조합합니다.
        string updatedSnippet = string.Join("\n", lines);

        // 입력 필드의 Enum 스니펫을 업데이트합니다.
        mEnumSnippet = updatedSnippet;
    }
}

#endif

 

 

✅ 사용

  • Tools/Bonnate/Enum ID Editor을 눌러 창을 엽니다.

 

  • 중복이 있는 Enum 코드를 입력필드에 복사하여 붙여넣습니다.
  • 우측 위 [Enum ID 업데이트] 버튼을 누릅니다.

 

  • 업데이트 된 내용을 기존 코드로 교체합니다.

 

🕹️ Unity Affiliate

  • Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.
  • 아래 배너의 에셋들은 '실시간 무료 에셋 랭킹'을 나타냅니다.
bonnate