본문 바로가기

카테고리 없음

unity script로 texture2d Sprite의 pivot 한번에 바꾸기

using UnityEngine;
using UnityEditor;

public class BatchSetPivot : EditorWindow
{
    [MenuItem("Tools/Batch Set Sprite Pivot to Center Bottom")]
    public static void ShowWindow()
    {
        GetWindow<BatchSetPivot>("Batch Pivot Setter");
    }

    private void OnGUI()
    {
        GUILayout.Label("Set Pivot for Multiple Sprites", EditorStyles.boldLabel);

        if (GUILayout.Button("Set Pivot to Center Bottom"))
        {
            SetPivotCenterBottom();
        }
    }

    private void SetPivotCenterBottom()
    {
        // 선택된 모든 Texture2D 에셋 가져오기
        Object[] selectedTextures = Selection.GetFiltered<Texture2D>(SelectionMode.Assets);

        if (selectedTextures.Length == 0)
        {
            EditorUtility.DisplayDialog("경고", "먼저 하나 이상의 Texture2D 에셋을 선택하세요.", "확인");
            return;
        }

        int successCount = 0;
        int failCount = 0;

        foreach (Texture2D texture in selectedTextures)
        {
            string assetPath = AssetDatabase.GetAssetPath(texture);
            TextureImporter importer = AssetImporter.GetAtPath(assetPath) as TextureImporter;

            if (importer == null)
            {
                Debug.LogWarning($"'{texture.name}'은/는 TextureImporter를 찾을 수 없습니다.");
                failCount++;
                continue;
            }

            if (importer.spriteImportMode != SpriteImportMode.Multiple)
            {
                Debug.LogWarning($"'{texture.name}'은/는 Multiple 스프라이트 모드가 아닙니다.");
                failCount++;
                continue;
            }

            SpriteMetaData[] metaData = importer.spritesheet;

            if (metaData == null || metaData.Length == 0)
            {
                Debug.LogWarning($"'{texture.name}'에 스프라이트 데이터가 없습니다.");
                failCount++;
                continue;
            }

            bool isModified = false;

            for (int i = 0; i < metaData.Length; i++)
            {
                Vector2 currentPivot = metaData[i].pivot;
                // 피벗이 Center Bottom이 아닌 경우에만 수정
                if (metaData[i].alignment != (int)SpriteAlignment.Custom ||
                    Mathf.Abs(currentPivot.x - 0.5f) > 0.001f ||
                    Mathf.Abs(currentPivot.y - 0f) > 0.001f)
                {
                    metaData[i].alignment = (int)SpriteAlignment.Custom;
                    metaData[i].pivot = new Vector2(0.5f, 0f); // Center Bottom
                    isModified = true;

                    Debug.Log($"'{texture.name}'의 스프라이트 '{metaData[i].name}' 피벗을 Center Bottom으로 변경.");
                }
                else
                {
                    Debug.Log($"'{texture.name}'의 스프라이트 '{metaData[i].name}' 피벗이 이미 Center Bottom입니다.");
                }
            }

            if (isModified)
            {
                importer.spritesheet = metaData;
                EditorUtility.SetDirty(importer);
                AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate);
                successCount++;
                Debug.Log($"'{texture.name}'의 피벗을 Center Bottom으로 성공적으로 변경했습니다.");
            }
            else
            {
                Debug.Log($"'{texture.name}'의 모든 스프라이트가 이미 Center Bottom으로 설정되어 있습니다.");
            }
        }

        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();

        EditorUtility.DisplayDialog("완료",
            $"피벗 설정 완료:\n성공: {successCount}\n실패: {failCount}",
            "확인");
    }
}