using System.IO; using TMPro; using UnityEditor; using UnityEngine; using UnityEngine.UI; public static class MyUIUtil { [MenuItem("Tools/Safe Rename Files (Space → Underscore)")] public static void RenameFilesInSelectedFolder() { Object obj = Selection.activeObject; if (obj == null) { Debug.LogError("폴더를 선택하세요."); return; } string folderPath = AssetDatabase.GetAssetPath(obj); if (!Directory.Exists(folderPath)) { Debug.LogError("폴더만 선택 가능합니다."); return; } string[] guids = AssetDatabase.FindAssets("", new[] { folderPath }); foreach (var guid in guids) { string assetPath = AssetDatabase.GUIDToAssetPath(guid); if (assetPath.EndsWith(".meta")) continue; string name = Path.GetFileName(assetPath); if (!name.Contains(" ")) continue; string newName = name.Replace(" ", "_"); AssetDatabase.RenameAsset(assetPath, Path.GetFileNameWithoutExtension(newName)); Debug.Log($"변경: {name} → {newName}"); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log("완료!"); } static string path_whitebg = "Assets/ResWork/UI_Image/Common/whitebg.png"; static void SetLayerRecursively(GameObject obj, string newLayer = "UI") { obj.layer = LayerMask.NameToLayer(newLayer); foreach (Transform child in obj.transform) SetLayerRecursively(child.gameObject, newLayer); // 재귀 호출로 자식까지 처리 } [MenuItem("GameObject/UI/New Image &i")] // &i는 Alt + I를 의미 static void CreateUIImage() { GameObject imageObject = new GameObject("New Image", typeof(Image)); // 생성된 오브젝트에 대한 Undo 기록 추가 Undo.RegisterCreatedObjectUndo(imageObject, "New Image"); var img = imageObject.GetComponent(); img.raycastTarget = false; img.sprite = AssetDatabase.LoadAssetAtPath(path_whitebg); if (Selection.activeGameObject != null) { imageObject.transform.SetParent(Selection.activeGameObject.transform, false); SetLayerRecursively(imageObject); // 새로 생성된 오브젝트를 선택 Selection.activeGameObject = imageObject; // 씬 뷰에서 해당 오브젝트에 포커스 맞추기 //SceneView.lastActiveSceneView.FrameSelected(); } } [MenuItem("GameObject/UI/Text Only &t")] // &t는 Alt + T를 의미 static void CreateUITextMeshPro() { GameObject textObject = new GameObject("New TMP", typeof(TextMeshProUGUI)); // 생성된 오브젝트에 대한 Undo 기록 추가 Undo.RegisterCreatedObjectUndo(textObject, "New TMP"); var tm = textObject.GetComponent(); tm.raycastTarget = false; tm.alignment = TextAlignmentOptions.Midline; tm.textWrappingMode = TextWrappingModes.NoWrap; if (Selection.activeGameObject != null) { textObject.transform.SetParent(Selection.activeGameObject.transform, false); SetLayerRecursively(textObject); // 새로 생성된 오브젝트를 선택 Selection.activeGameObject = textObject; // 씬 뷰에서 해당 오브젝트에 포커스 맞추기 //SceneView.lastActiveSceneView.FrameSelected(); } } [MenuItem("GameObject/UI/Text - Local &y")] static void CreateUITextMeshProWithLocal() { GameObject textObject = new GameObject("Local TMP", typeof(TextMeshProUGUI)); // 생성된 오브젝트에 대한 Undo 기록 추가 Undo.RegisterCreatedObjectUndo(textObject, "Local TMP"); var tm = textObject.GetComponent(); tm.raycastTarget = false; tm.alignment = TextAlignmentOptions.Midline; tm.textWrappingMode = TextWrappingModes.NoWrap; if (Selection.activeGameObject != null) { textObject.transform.SetParent(Selection.activeGameObject.transform, false); SetLayerRecursively(textObject); // 새로 생성된 오브젝트를 선택 Selection.activeGameObject = textObject; // 씬 뷰에서 해당 오브젝트에 포커스 맞추기 //SceneView.lastActiveSceneView.FrameSelected(); } } [MenuItem("GameObject/UI/Button &b")] // Alt + B: Button 생성 (Image, Button, PlayClickSound_Only 추가) static void CreateUIButton() { // 버튼 오브젝트 생성 (Image, Button 컴포넌트 포함) GameObject buttonObject = new GameObject("btn_"); // 생성된 오브젝트에 대한 Undo 기록 추가 Undo.RegisterCreatedObjectUndo(buttonObject, "btn_"); buttonObject.AddComponent().sprite = AssetDatabase.LoadAssetAtPath(path_whitebg); buttonObject.AddComponent