画像を探していると、複数の画像がまとまっていることがありその一部だけ使いたかったことがあったので
画像を分割するツールを作成しました
分割数を指定することで
を
のように分割することができます
スクリプト
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); } }