게임 개발/유니티(Unity)

[Unity] 오브젝트 네이밍 자동화

마달랭 2024. 12. 27. 13:59
반응형

개요

유니티에서 오브젝트를 관리할 때 이전에 사용했던 오브젝트를 복제하여 재활용 하는일이 많다.

예를 들어 유사한 구조로 이루어 진 레벨을 관리할 때 Level1 오브젝트를 복사하여 Level2 오브젝트로 만들어 사용하곤 한다.

이럴 때 오브젝트를 복사하게 되면 Level1 (1) 이런 식으로 오브젝트가 복사된다.

하지만 내부 child오브젝트들은 복사한 부모 오브젝트의 이름을 그대로 따라가게 된다.

이런 특성은 간혹 혼란을 유발하곤 하여 보통은 child오브젝트의 이름도 변경해 주는 편이다.

 

하지만 Level오브젝트 내에 무수히 많은 child오브젝트가 존재한다면 어떻게 될까?

매번 수동으로 오브젝트 이름을 변경해 주기가 귀찮고 시간이 많이 소요될 것이다.

Unity Editor을 사용하여 이런 부분에 대한 자동화를 진행할 수 있다.

 

 

에디터 스크립트

오브젝트 복제 시 자동 네이밍 기능을 구현하기 위해 에디터 스크립트를 작성해 주어야 한다.

아래 작업을 통해 유니티 엔진에서 자동화를 구현할 수 있다.

  1. Assets 폴더에 Editor 폴더가 없다면 폴더 생성
  2. Editor폴더 안에 c# 스크립트 파일 생성
  3. 스크립트 작성 후 저장
  4. 유니티 Tools메뉴에 작성한 에디터 스크립트가 존재하는지 확인
  5. 작성한 자동화 스크립트 실행

우선 내가 사용한 예제 코드는 다음과 같다.

 

using UnityEditor;
using UnityEngine;
using System.Text.RegularExpressions;

public class AutoRenameLevelObjects : EditorWindow
{
    private GameObject parentObject;

    [MenuItem("Tools/Auto Rename Level Objects")]
    public static void ShowWindow()
    {
        GetWindow<AutoRenameLevelObjects>("Auto Rename Level Objects");
    }

    void OnGUI()
    {
        GUILayout.Label("레벨 오브젝트 자동 네이밍", EditorStyles.boldLabel);

        parentObject = (GameObject)EditorGUILayout.ObjectField("부모 오브젝트", parentObject, typeof(GameObject), true);

        if (GUILayout.Button("네이밍 실행"))
        {
            RenameLevelObjects();
        }
    }

    void RenameLevelObjects()
    {
        if (parentObject == null)
        {
            Debug.LogWarning("부모 오브젝트를 설정하세요.");
            return;
        }

        // 부모 이름에서 숫자 파싱
        int parentIndex = ExtractIndexFromName(parentObject.name);
        if (parentIndex == -1)
        {
            Debug.LogWarning("부모 오브젝트 이름에서 인덱스를 찾을 수 없습니다.");
            return;
        }

        foreach (Transform child in parentObject.transform)
        {
            string newName = ReplaceIndexInName(child.name, parentIndex);
            child.name = newName;
        }

        EditorUtility.SetDirty(parentObject);
        Debug.Log($"레벨 {parentIndex} 오브젝트 네이밍 완료!");
    }

    // 부모 이름에서 숫자 추출
    int ExtractIndexFromName(string name)
    {
        Match match = Regex.Match(name, @"\d+");  // 숫자 추출
        if (match.Success)
        {
            return int.Parse(match.Value);
        }
        return -1;  // 숫자가 없으면 -1 반환
    }

    // 기존 이름에서 인덱스만 교체
    string ReplaceIndexInName(string originalName, int index)
    {
        // 뒤에 붙은 _숫자 부분만 교체 (예: _3 → _1)
        return Regex.Replace(originalName, @"_\d+$", $"_{index}");
    }
}

 

 

테스트

내가 관리하는 레벨 오브젝트를 예시로 들어본다.

─Level1
    └MapBounds_Tilemap_1
    └Walkable_Tilemap_1
    └Unwalkable_Tilemap_1
    └PlayerSpawn_Entry_1
    └LevelTransition_Previous_1
    └LevelTransition_Next_1
    └PlayerSpawn_Exit_1

 

Level1을 기준으로 현재 이런 형태의 구조로 이루어져있다.

해당 오브젝트를 Ctrl + D를 통해 동일한 오브젝트를 복사해 주면 아래와 같이 생성될 것이다.

 

오브젝트 이름이 Level1 (1)이 되었고, child오브젝트들은 모두 부모 오브젝트의 child와 이름이 동일하다.

이제 Level1 (1)을 Level2로 변경해 준 뒤 Tools메뉴에 위에서 작성한 자동 네이밍 스크립트를 실행해 준다.

 

부모 오브젝트 슬롯에 Level2를 드래그하여 놓은 뒤에 네이밍 실행 버튼을 클릭하여 실행해 준다.

 

 

Level2 오브젝트의 child 오브젝트들의 이름이 정상적으로 변경된 점을 확인할 수 있다.

이 처럼 유니티 에디터를 사용하면 유니티 엔진 내에서의 단순 반복 작업을 자동화 할 수 있다.

 

728x90
반응형

'게임 개발 > 유니티(Unity)' 카테고리의 다른 글

[Unity] 2D 캐릭터 위치 변경  (0) 2024.12.27
[Unity] 2D 타일 충돌 처리  (0) 2024.12.26
[Unity] 2D 캐릭터 이동  (0) 2024.12.26
[Unity] 2D 타일맵 배치  (1) 2024.12.26