うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】テクスチャを分割するツール

画像を探していると、複数の画像がまとまっていることがありその一部だけ使いたかったことがあったので

画像を分割するツールを作成しました

f:id:hacchi_man:20211126005711p:plain:w450

分割数を指定することで

f:id:hacchi_man:20211126005950p:plain:w300

f:id:hacchi_man:20211126005808p:plain:w300

のように分割することができます

スクリプト

using System.IO;
using UnityEditor;
using UnityEngine;
 
public class SplitImageWindow : EditorWindow
{
    [MenuItem("Tools/SplitImage")]
    private static void ShowWindow()
    {
        var window = GetWindow<SplitImageWindow>();
        window.titleContent = new GUIContent("Image Splitter");
        window.Show();
    }
 
    [SerializeField]
    private Texture2D _texture2D;
    [SerializeField]
    private int _horizontalSplit = 1;
    [SerializeField]
    private int _verticalSplit = 1;
 
    private void OnGUI()
    {
        _texture2D = (Texture2D) EditorGUILayout.ObjectField(_texture2D, typeof(Texture2D), false);
        _horizontalSplit = EditorGUILayout.IntField("Horizontal", _horizontalSplit);
        _verticalSplit = EditorGUILayout.IntField("Vertical", _verticalSplit);

        using (new EditorGUI.DisabledScope(
            _texture2D == null ||
            _horizontalSplit == 1 && _verticalSplit == 1))
        {
            if (GUILayout.Button("Split"))
            {
                SplitTexture(_texture2D, _horizontalSplit, _verticalSplit);
            }
        }
    }
 
    /// <summary>
    /// テクスチャを分割
    /// </summary>
    private void SplitTexture(Texture2D src, int horizontalSplit, int verticalSplit)
    {
        var path = AssetDatabase.GetAssetPath(src);
        var parent =  Directory.GetParent(path);
        var fileName = Path.GetFileNameWithoutExtension(path);
        var rootPath = Path.Combine(parent.FullName, fileName);
        if (!Directory.Exists(rootPath))
        {
            Directory.CreateDirectory(rootPath);
        }
 
        var dst = new Texture2D(src.width, src.height, src.format, false);
        Graphics.CopyTexture(src, dst);
        var size = new Vector2Int(src.width / horizontalSplit, src.height / _verticalSplit);
        for (var xIndex = 0; xIndex < horizontalSplit; xIndex++)
        {
            for (var yIndex = 0; yIndex < verticalSplit; yIndex++)
            {
                var texture = new Texture2D(size.x, size.y, src.format, false);
                for (var x = 0; x < size.x; x++)
                {
                    for (var y = 0; y < size.x; y++)
                    {
                        var color =  dst.GetPixel(xIndex * size.x + x, yIndex * size.y + y);
                        texture.SetPixel(x, y, color);
                    }
                }
                texture.Apply();
 
                var savePath = Path.Combine(rootPath, fileName + "_" + xIndex + "_" + yIndex + Path.GetExtension(path));
                File.WriteAllBytes(savePath, texture.EncodeToPNG());
            }
        }
        AssetDatabase.Refresh();
        DestroyImmediate(dst);
    }
}