PMDエディタでテクスチャのパスを自動変換しちゃうプラグイン

テクスチャはまとめてtextureフォルダに格納しておくとモデルの管理がしやすいです。なのでいつも製作の段階からtextureフォルダにまとめているのですが、Xファイルへの変換時に困ったことが…

フォルダ
|
|—モデル.pmx
|
|—texture

|
|—XXX.png
|—YYY.png

このようににテクスチャはまとめてtextureフォルダの下にあるのですが、BlenderからXファイルへ出力すると正しくファイルパスが書き出されないらしく本来テクスチャのパスは「texture¥Building_L_1.jpg」となるはずですが「Building_L_1.jpg」となってしまっています。このままだと正しいテクスチャが指定されていない状態なので板ポリが表示されるだけです。
スクリーンショット 2015-03-15 18.47.48
3つくらいだったら手作業で正しいファイルパスに書き換えてもいいのですが私が作るモデルは製作の都合上複数のオブジェクトに分けているため材質が増えてしまっています。テクスチャパスの書き換え30個とかやってたらそれだけで疲れてしまいます。

スクリーンショット 2015-03-15 18.47.57

めんどくさい!なら自動化しよう

どうやらPMDエディタはプラグインを作って機能拡張をすることができるみたいなので自作することにしました。どこかに似たような機能をもつプラグインがあるのかもしれませんが、探したところ見つからなかったので作ります。PMDエディタで読み込めるdllプラグインは本来であればVisual Studioをインストールして…と手順があるのですが今回必要な機能はとても単純なのでPMDエディタに付属しているCSScriptを利用してプラグインを作成します。
PMDエディタの「編集」→「プラグイン」→「CSScript」→「C#スクリプト」を選択します。
するとこのようなウィンドウが出てきます。
スクリーンショット 2015-03-15 19.00.19
「簡易形式」というところにプログラムを書いていきます。高度な機能をもつプラグインは「一般形式」を選択して書くべきですが、いろいろとめんどうなので簡易形式で簡単に書きます。PMDエディタのプラグインはC#で記述していくのですが、すでに他のプログラミング言語を扱うことができるのならC#の文法を調べながら書いていくだけなのでそこまで苦労はしないかと思います。全体的にC#の情報は少ないのですが・・・。
——————————————————
String old_tex;
foreach(var i in material){

old_tex = i.Tex;

if(old_tex.Length > 0){

if(old_tex.IndexOf(“texture¥¥”)<0){
i.Tex = “texture¥¥”+old_tex;
}

}

}
MessageBox.Show(“Complete”);
——————————————————

書いたのはオレンジ色の部分だけです。すごく短い。プラグインに求めるのは「材質にテクスチャが指定されているか確認」→「材質にテクスチャが指定されていた場合、テクスチャのファイルパスが正しいかを確認」→「テクスチャのファイルパスが正しくなければ修正する」という機能です。
String old_tex;
材質に設定されているテクスチャパスを記憶するString型の変数 old_tex をつくる。
foreach(var i in material){
foreachはfor文みたいなやつ。PMDエディタではmaterialという変数に材質の一覧が格納されているのでforeach文でひとつずつ変数 i に格納していき処理を加えていく。材質番号0、材質番号2、材質番号3・・・というように順番に読んでいく。
old_tex = i.Tex;
材質情報が変数iに読みこまれたので i.Texと記述することで材質のテクスチャパスを見ることができる。
ここではold_texにテクスチャパスを格納。
if(old_tex.Length > 0)
String型のメソッド .Lengthで文字数をカウント。ここで0文字だとテクスチャにはなにも指定されていないということなのでなにも処理は必要ない。よってそのままスルーしてforeach文の先頭に戻る。
if(old_tex.IndexOf(“texture¥¥”)<0)
String型のメソッド .IndexOfを使いテクスチャのパス内に”texture¥”という文字列が存在するかを調べる。”texture¥”という文字列がある場合はすでに正しいテクスチャパスが指定されているのでこれ以上文字列操作の必要は無い。その場合はこのままスルー。ちなみに、プログラムにおいて”¥”は特別な文字なのでプログラム文中で”¥”を指定する場合は”¥¥”というように円マークを2つ書く。この処理をしておかないとうっかり2回プラグインを実行してしまった場合にテクスチャパスが「texture¥texture¥Building_L_1.jpg」となってしまい直すのが余計面倒になってしまう。安全対策は重要。
i.Tex = “texture¥¥”+old_tex
テクスチャに正しいパスが指定されていない場合はすでに指定されているテクスチャパスの先頭に”texture¥”という文字列を追加して正しいテクスチャパスに書き換える。
MessageBox.Show(“Complete”);
処理が終わったのかわかりにくいので全部の処理が終わったら”Complete”というダイアログボックスがでるようにしました。

書き終わったらCSScriptウィンドウの「ファイル」→「プラグインDLL生成」を選択し、通常はPMDエディタのPluginフォルダ内のUserフォルダに書き出します。
PMDエディタを再起動すると先ほど作成したプラグインがあるはずです。

プラグインを実行

プラグインは「編集」→「プラグイン」→「User」とすすむと「CSScript生成プラグイン」というものがあると思います。「簡易形式」でプラグインを作成すると自由に名前をつけることができないという欠点がありますが、今回は気にしないことにします。
で、プラグインを選択して実行するとテクスチャのパスがこの場合だと「Building_L_1.jpg」から「texture¥Building_L_1.jpg」に書き換わるはずです。
スクリーンショット 2015-03-15 20.20.21

ビューアー側もテクスチャが適用された状態になりました。
スクリーンショット 2015-03-15 20.20.27

今までテクスチャを指定し直す作業で時間がかかっていたのでそこを自動化したことで作業を格段に効率化させることができました。自動化万歳。自分が求める機能が見つからない場合は自分で作ってしまうというのもひとつの手段です。

広告

コメントを残す(連絡がとれるメールアドレスをメールアドレス欄に入力していただければ内容によっては直接メールアドレス宛に返信します)

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中