11
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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というフリーソフトで一括置換がおススメです

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
11
Help us understand the problem. What are the problem?