열거형(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이 중간에 삽입되어 중복되는 번호가 생기는 경우 이것을 쉽게 수정하기위해 만든 기능입니다.
⚒️ 스크립트
- 이 스크립트를 유니티 에디터 에셋 폴더내에 추가합니다.
/*
* 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 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.
- 아래 배너의 에셋들은 '실시간 무료 에셋 랭킹'을 나타냅니다.
'unity tools & functions' 카테고리의 다른 글
[유니티] WAV. 파일의 decibel 조절 tool (0) | 2023.09.16 |
---|---|
[유니티] 에셋의 이름을 편리하게 변경 (0) | 2023.09.15 |
[유니티] 엑셀(excel) 파일 읽기, json으로 변환하여 사용 (0) | 2023.07.03 |
[유니티] 유니티 에디터 스크린샷 캡쳐 도구 (0) | 2023.06.28 |
[유니티] Hex를 RGB Color로 변환 (0) | 2023.06.27 |