UnityでLive2Dのファイル(.moc、.mtn)をインポートする時、Unityに持って行く前にbytes拡張子を付けてテキストアセットにする必要があります。
毎回面倒だな〜って思っていたので、ファイルをUnity上にドラッグ&ドロップしたらbytes拡張子をつけるエディタ拡張を作りました。
Editorフォルダを作って以下のスクリプトを入れればOK!
ファイルアクセス系は重そうなので、複製してから削除という処理にしてます。
ソースコード
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分弱ほっておけば削除されます。
始めはAssetDatabaseでやろうと思ったけど、参考URLのように拡張子は変換してくれないのでFileUtilで解決できました。
[参考URL]
アセット読み込み時に独自の処理を実装する
[【Unity】AssetDatabaseでアセットを操る!] (http://yusuke-hata.hatenablog.com/entry/2014/12/04/230630)
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というフリーソフトで一括置換がおススメです