CapersProject/Assets/02.Scripts/Editor/HierarchySorter.cs

109 lines
3.6 KiB
C#
Raw Normal View History

2024-06-03 18:26:03 +00:00
using UnityEngine;
using UnityEditor;
using System.Linq;
namespace BlueWater.Editors
{
public class HierarchySorter : EditorWindow
{
private string _baseName = ""; // 기본 이름
private int _numberingStyle = 1; // 숫자 스타일
[MenuItem("Tools/Sort Children by Name")]
private static void SortChildrenByName()
{
if (Selection.activeTransform != null)
{
Undo.RecordObject(Selection.activeTransform.gameObject, "Sort Children by Name");
var children = Selection.activeTransform.Cast<Transform>().OrderBy(t => t.name).ToList();
for (var i = 0; i < children.Count; i++)
{
children[i].SetSiblingIndex(i);
}
EditorUtility.SetDirty(Selection.activeTransform.gameObject);
}
else
{
Debug.LogError("No object selected in the hierarchy");
}
}
[MenuItem("Tools/Sort Children of Selected Objects by Name")]
private static void SortChildrenOfSelectedObjectsByName()
{
foreach (var parentTransform in Selection.transforms)
{
Undo.RecordObject(parentTransform.gameObject, "Sort Children by Name");
var children = parentTransform.Cast<Transform>().OrderBy(t => t.name).ToList();
for (var i = 0; i < children.Count; i++)
{
children[i].SetSiblingIndex(i);
}
EditorUtility.SetDirty(parentTransform.gameObject);
}
}
[MenuItem("Tools/Rename Child Objects Window")]
public static void ShowWindow()
{
GetWindow<HierarchySorter>("Rename Child Objects");
}
private void OnGUI()
{
GUILayout.Label("Base Settings", EditorStyles.boldLabel);
_baseName = EditorGUILayout.TextField("Base Name", _baseName);
_numberingStyle = EditorGUILayout.IntSlider("Numbering Style", _numberingStyle, 1, 3);
if (GUILayout.Button("Rename Children"))
{
RenameChildren();
}
}
private void RenameChildren()
{
var selectedObject = Selection.activeGameObject;
if (selectedObject != null)
{
Undo.SetCurrentGroupName("Rename Child Objects");
var group = Undo.GetCurrentGroup();
for (var i = 0; i < selectedObject.transform.childCount; i++)
{
var child = selectedObject.transform.GetChild(i).gameObject;
Undo.RecordObject(child, "Rename Child");
var newName = _baseName + " (" + GetFormattedNumber(1 + i, _numberingStyle) + ")";
child.name = newName;
}
Undo.CollapseUndoOperations(group);
}
else
{
Debug.LogWarning("선택된 오브젝트가 없습니다.");
}
}
private static string GetFormattedNumber(int number, int style)
{
switch (style)
{
case 1: // (1), (2), (3), ...
return number.ToString();
case 2: // (01), (02), (03), ...
return number.ToString("D2");
case 3: // (001), (002), (003), ...
return number.ToString("D3");
default:
return number.ToString();
}
}
}
}