【MMDAgent解説】MMDAgent1.6でのプラグインの作り方
不定期更新ですが活動してないわけではない熱伝導です。
今回も何故無いのかわからないシリーズ。
自分の忘備録を兼ねてMMDAgentのプラグインの作り方を画像付きでできるだけわかりやすく書いてみたいと思います。こういうの書くの初めてなので至らぬ点はご容赦ください。
環境
- MMDAgent 1.6
- windows 8.1
- VisualStudio2015
OS以外は最新環境だと思います。
MMDAgentのプロジェクト環境作りは説明しませんが公式mmdagent.jpのSourceページからダウンロードしたものの中にあるMMDAgent_vs2010.slnをVisualStudioで開くだけでいいはずです。
ビルドして動かしてみる時はReleaseフォルダにSampleの各種ファイルなどを入れておくのを忘れずに。
1. 準備
プラグインを作るにあたってまずは下記サイトから雛形プロジェクトをダウンロードしてください。
MMDAgent & Project-NAIP wiki > プラグイン作成
大半の人は拝見済み、もしくは既に挫折済みだと思いますが偉大な先駆者様のサイトです。
雛形プロジェクトも結構古いのですが、それでも1から作るよりは雛形プロジェクトを改修した方が早いので利用させていただきます。
ダウンロードして解凍したPlugin_Skeletonディレクトリとその中にあるPlugin_Skeleton.vcprojの名前を変更しておきます。他ファイル名はまだ変えないでください。
ここではPlugin_testCommandにリネームして進めます。
2.VisualStudioでプロジェクトを追加する
リネームしたPlugin_testCommandディレクトリをMMDAgentのソースディレクトリに移動させます。
移動後はVIsualStudioでMMDAgentのソリューションを開き、「ファイル」>「追加」>「既存のプロジェクト」から移動させたtestCommandディレクトリ内のPlugin_testCommand.vcxprojを追加します。
プロジェクトのアップデートを聞かれるのでチェックの入ったままOKで進めます。
追加されたプロジェクトは名前がPlugin_Skeltonになってるので先ほどと同じくPlugin_testCommandに変更します。この段階で各ファイル名も変更可能です。
3.依存プロジェクトを設定する
追加したプラグインのプロジェクトを右クリックして「ビルド依存関係」>「プロジェクトの依存関係」を選択します。
依存関係で
「Library_MMDAgent」
「Library_MMDFile」
をチェックしてOKを押します。
4.必要なライブラリを設定する
ここからはMMDAgent1.6用の設定です。
MMDAgent1.6ではフォント周りと正規表現のライブラリが追加されたらしく、この2つもビルド時に要求されるので設定する必要があります。
まずは必要なライブラリファイルがどのディレクトリにあるか設定します。
プラグインのプロジェクトを右クリックして「プロパティ」>「リンカー」>「全般」>「追加のライブラリディレクトリ」を選択します。
直接書き加えても、右側のリストから編集画面を使ってもいいのですが以下の2行を追加します。
..\Library_FreeType\lib
..\Library_RE2\lib
直接書き加えるときはセミコロンで区切ること。ピリオド2つは親ディレクトリって意味の相対パスです。親であるMMDAgentディレクトリ内の各libディレクトリをを見てくれってことですね。
ライブラリディレクトリの指定は終わりましたので次はどのファイルを使うか設定します。
同じくプロパティから「プロパティ」>「リンカー」>「入力」>「追加の依存ファイル」を選択します。
ライブラリディレクトリと同じように以下の2行を追加します。
FreeType.lib
RE2.lib
これでどこのどのファイルを使うという設定は完了しました。
最後にビルドしたdllファイルを書き出すディレクトリを設定します。
「プロパティ」>「構成プロパティ」>「全般」>「出力ディレクトリ」を下記のように書き換えます。これでMMDAgentのReleaseディレクトリ内のPluginsディレクトリに書き出されるようになります。
これでプロジェクトの設定は終了です。
私の環境では初期設定でなってましたが、場合によっては以下の作業も必要かもしれません。
・「プロパティ」>「全般」>「構成の種類」で「ダイナミックファイル(.dll)」を選択する
5.ソースコードを修正する
ソースが一部古い関数を使っているせいでエラーが出ていると思います。
エラー部分を修正してみましょう。
Plugin_Skeleton.cpp内にあるsendEventMassate関数は古いMMDAgentの関数です。
下記のように最新のものに書き換えます。
コピペ用コード:sendMessage(MMDAGENT_EVENT_PLUGINDISABLE,"%s", PLUGINSKELETON_NAME);
3箇所あるはずなので全て書き換えてしまいます。
これで修正作業はすべて完了です。ビルドして実際にdllファイルが生成されたか確認して見ましょう。
今回追加修正したプロジェクトのフォルダをコピーしておけば以後は名前を変更して既存プロジェクトから追加するだけで使えます。
6.実際に動くかテストしてみる。
ここでは既存のプラグインの中で一番簡単な仕組みのEXECUTEコマンドを真似して動作確認をしてみます。
EXCUTEコマンドの処理内容はwindowsAPIのShellExecuteA関数に引数を渡して実行するだけなので実処理は一行で済みます。
まずはPlugin_Skeleton.cpp内でコマンド名の宣言とwindows.hのインクルードを行います。includeは順番が影響しますのでとりあえず上に書いてください。
ここではコマンド名はS_EXCUTEとしています。これは実際にFSTファイルで使われる文字列と同じものです。
extProcCommand関数に追加して以下のように書き換えます。
ここまで書いたらもう一度ビルドしてみてください。
あとは実際にFSTファイルを適当に書いて動かして見ます。
ホームページは表示されたでしょうか?
もし動かないようならdllファイルがちゃんとPluginsディレクトリに書き出されているかなどを確認してみてください。
プラグインの作り方は以上です。
実際、大したことしてないのでバリバリ書いてる人は今更って内容かもしれませんが自分は毎度環境作りのトラブルでこけてます・・・。1.6の動作確認するまで何時間かかったか・・・
なので他の人がそんな無駄な時間を使わないで済めば幸いです。