神様は有休消化中です。

Unity関連の技術ネタを書いてます。

【Unity】Inspectorで管理できる汎用アセットインポーターを公開しました

仕事で所属しているプロジェクトが佳境に入りまして、テクスチャの最適化などをアーティストさんと共同で進めております。
その中で「この非圧縮テクスチャを圧縮に変えたいのに変わらない!」「テクスチャのmaxSizeを512にしたいのにできない!」というような叫び声がよく聞こえるわけです。AssetPostProcessorのせいですね、はい。
開発初期〜中期であればゲームを作るだけなので放り込めばそれなりに動くインポーターでも問題ないのですが、佳境に入るとパフォーマンス対策のために細かく設定したくなります。
もっと欲をいえば、アーティストさん側にインポーターの設定管理までお願いしたい・・・というわけで、GUIで設定できる汎用のアセットインポーターを作って公開しました。

github.com

作った経緯

そもそもAssetPostProcessorってアーティストさんに優しくないよね?と常々思っておりました。プログラムを読まないと何しているかわからないし、どのフォルダに効いているのかもわからない。
Art「このファイルの設定が変わらなくて・・・」
Eng「ああ、このフォルダ以下はインポーターが設定してるから・・・」
Art「そうなんですか。ではこのフォルダだけ除外してください」
とか非効率この上ないと思います。

Unity-Asset-Importer-Extension

このアセットは、フォルダのインスペクターからアセットのインポート設定が行えます。
親フォルダの設定を子フォルダが引き継ぐため、親フォルダ側で大まかな設定(例:UI-Textureフォルダ以下のテクスチャはすべてSpriteにする等)を行い、子フォルダ側で細かい設定(例:圧縮するか、mipmap作るか等)を行うことができます。
f:id:appleorbit:20180725213129p:plain
もちろん、親フォルダの設定を子フォルダで無効化することも可能です。無効化した場合は、無効化した子フォルダ以下のフォルダには適用されなくなります。

デフォルトで、Unity2017.1f1で定義されているAssetImporterに設定を流し込む仕組みを提供しています。
DefaultTextureImporterなどがそれです。
これらのデフォルトインポーターは自動生成しており、生成するツールも同梱しているので、Unityのバージョンが合わない人はREADMEに書いた手順で出力し直してもらえればと思います。

いちおし機能

このアセットのいちおしは、独自のインポーターもGUIで設定できるようになることです。

public class CustomTextureImporter : IAssetImporterExtension
{
    private bool isHogeFiag;

    public System.Type GetTargetImporterType()
    {
        return typeof(TextureImporter);
    }

    public void Apply (AssetImporter originalImporter, string assetPath, Property[] properties)
    {
        bool hogeFlag = properties.Where(o => o.name == "isHogeFlag").Select(o=>bool.Parse(o.value)).First();
        // hogeFlagを使った処理
    }
}

のようなクラスを定義すれば、フォルダのインスペクターからインポーターの適用・isHogeFlagの設定が行えるようになります。
現状だとAssetPostProcessorのOnPreprocess〜にしか対応していないのですが、OnPostprocess〜にも対応すればアセットコピーやAssetBundleNameの自動設定なんかもこのアセットで実装できるようになります。

簡単に対応できそうだったんでOnPostprocess対応しました。
OnPostprocessAllAssetsのタイミングで、IAssetImporterExtension.OnPostprocessとOnRemoveprocessをアセットごとに呼び出します。
サンプルとして、CustomImporter/以下にCopyAssetImporterを実装しています。
これで、テクスチャを特定フォルダに入れればサイズの違うテクスチャを自動生成とかできるようになりました。

最後に

作ったばかりなのでまだ使いにくいところなどあるとは思いますが、使ってみてフィードバックやらissueやらいただけると大変励みになります。

スペシャルサンクス

頭に「.」をつけたファイルはUnityがインポートしないからインポート順に悩まなくて済むとか、XMLシリアライズするとUnityバージョン考えなくて良いからポータビリティ高いよねとか、ベース部分の設計は私の師匠の書いたコードから引継ぎました。大変勉強になりました。