Unity AssetPostprocessorを使ってインポート時にテクスチャを分割してみる

参考 https://anchan828.github.io/editor-manual/web/assetpostprocessor.html

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
using System.IO;

public class SpriteAssetPostprocessor : AssetPostprocessor {

  private static readonly string SpritePath = "Assets/Sprites/";

#if true
  private bool IsMatchPath { get { return assetPath.StartsWith(SpritePath); } }
#else
  private bool IsMatchPath { get { return false; } }
#endif


  void OnPreprocessTexture() {
    if (!IsMatchPath) { return; }

    var importer = assetImporter as TextureImporter;

    importer.textureType = TextureImporterType.Sprite;
    importer.spriteImportMode = SpriteImportMode.Multiple;
    importer.filterMode = FilterMode.Point;
  }

  void OnPostprocessTexture(Texture2D texture) {
    if (!IsMatchPath) { return; }

    var importer = assetImporter as TextureImporter;
    var offset = Vector2.zero;
    var size = new Vector2(32, 32);
    var padding = Vector2.zero;
    var rects = InternalSpriteUtility.GenerateGridSpriteRectangles(texture, offset, size, padding);
    var fileName = Path.GetFileNameWithoutExtension(assetPath);
    var meta = new List<SpriteMetaData>();

    var i = 0;
    foreach (var rect in rects) {
      meta.Add(new SpriteMetaData {
        name = string.Format("{0}_{1}", fileName, i),
        rect = rect
      });
      ++i;
    }

    importer.spritesheet = meta.ToArray();

    // 下記を追加しないと更新されなかったので...
    // https://anapest.digital/assetpostprocessor-default-options-unity/
    var asset = AssetDatabase.LoadAssetAtPath<Texture2D>(importer.assetPath);
    if (asset) {
      EditorUtility.SetDirty(asset);
    } else {
      importer.SaveAndReimport();
    }
  }

}