LoginSignup
13
11

More than 5 years have passed since last update.

Unityで拡張子を変換するエディタ拡張

Last updated at Posted at 2015-02-22

UnityでLive2Dのファイル(.moc、.mtn)をインポートする時、Unityに持って行く前にbytes拡張子を付けてテキストアセットにする必要があります。
毎回面倒だな〜って思っていたので、ファイルをUnity上にドラッグ&ドロップしたらbytes拡張子をつけるエディタ拡張を作りました。

2.png

Editorフォルダを作って以下のスクリプトを入れればOK!
ファイルアクセス系は重そうなので、複製してから削除という処理にしてます。

ソースコード

AssetRenameBytes.cs
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Collections;

public class AssetRenameBytes : AssetPostprocessor {
    /// <summary>
    /// あらゆる種類の任意の数のアセットがインポートが完了したときに呼ばれる処理
    /// </summary>
    /// <param name="importedAssets"> インポートされたアセットのファイルパス。 </param>
    /// <param name="deletedAssets"> 削除されたアセットのファイルパス。 </param>
    /// <param name="movedAssets"> 移動されたアセットのファイルパス。 </param>
    /// <param name="movedFromPath"> 移動されたアセットの移動前のファイルパス。 </param>
    static void OnPostprocessAllAssets
        (string[] importedAssets, string[] deletedAssets,
         string[] movedAssets, string[] movedFromPath)
    {
        // アセットがインポートされた場合
        foreach(string asset in importedAssets){
            // 拡張子のみ取得
            string type  = Path.GetExtension(asset);

            // mtn、mocファイルをインポートした時
            if(type == ".mtn" || type == ".moc"){
                // 拡張子にbytesを付けて複製
                FileUtil.CopyFileOrDirectory(asset, asset + ".bytes");
            }

            // bytesファイル作成時に走る処理
            if(type == ".bytes"){
                // 拡張子なしのファイル名を取得
                string filenm = Path.GetFileNameWithoutExtension(asset);
                // コピー元ファイルとmetaデータを削除
                FileUtil.DeleteFileOrDirectory(asset.Replace(".bytes", ""));
                FileUtil.DeleteFileOrDirectory(asset.Replace(".bytes", ".meta"));
                Debug.Log(filenm + "をbytes拡張子に変換");
                // Editorに反映されるの遅いのでリフレッシュ
                AssetDatabase.Refresh();
            }
        }
    }
}

mocやmtnファイルをドラッグ&ドロップすれば変換してくれます。
なかなか元ファイルが削除されない時があるけど、1分弱ほっておけば削除されます。
result.png

始めはAssetDatabaseでやろうと思ったけど、参考URLのように拡張子は変換してくれないのでFileUtilで解決できました。

[参考URL]
アセット読み込み時に独自の処理を実装する

【Unity】AssetDatabaseでアセットを操る!

2015/02/24追記
実は半年前ぐらいからLive2D Unity SDKに同じような処理がありました。
でも、motionsフォルダごとドラッグ&ドロップすると変換されないファイルがいくつか出るので謎です。
このページに書いたソースならフォルダごと大丈夫でした。
SampleApp1\Assets\Editor\Live2DImporter.cs

2015/10/16追記
ちなみにファイル名.mtn.bytesにするとLive2D Viewerで参照できなくなる。
その場合はコマンドプロンプトで拡張子を一括置換してみるといいかも。
対象フォルダに移動して「ren *.mtn.bytes *.」とするとbytes拡張子が取れる。
macの場合はShupapan.appというフリーソフトで一括置換がおススメです

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11