この記事について
MMDAgentを利用する・開発する上でのあれこれをまとめた記事.前回記事からの続きになっているのでそちらも参照されたし.
前回:MMDAgentについてまとめる FST編
MMDAgentのプラグインについて
MMDAgentのプラグインはPlugin_***というフォルダで分けられており,ビルドされたものはDLL形式でRelease以下に格納される.以下のようなフォルダ編成になっている.
- MMDAgent本体
- Plugin_*** (プラグインフォルダ)
- Release
- ***.dll (プラグインバイナリ)
MMDAgentが起動されるとDLL形式のプラグインバイナリが呼び出され,スレッドの形で起動される.本記事ではwindows開発視点で記述しているのでDLL形式であるが,各OSでビルドすると各OSのダイナミックリンクライブラリ形式で出力される.
例えば,起動時にプラグインをアンロードしたければ,DLLを削除することで行うことができる,また他のPCでビルドされたDLLをコピーして起動することも可能である.プラグインを独立した機能として実装することにより,拡張性や保守性の高い設計になっている.
プラグインの作り方
参考になる記事があるのでそこで十分である.以下にリンクを貼る.
プラグインの作成 - MMDAgent & Project-NAIP wiki
【MMDAgent解説】MMDAgent1.6でのプラグインの作り方
以上の解説では,MMDAgent1.2時点でのプラグインの作り方と,1.6以降の対応関係の話がまとめてある.
MMDAgent1.7以降対応で,VisualStudio2017でのプラグインの雛形を作ったのでリンクを貼っておく.
https://github.com/m-masaki72/MMDAgent_Plugin_Skeleton
プラグインのソース
至極簡単なプラグインは以下のようになる.
#ifdef _WIN32
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C"
#endif /* _WIN32 */
#define PLUGINSKELETON_NAME "Skeleton"
/* headers */
#include "MMDAgent.h"
#include "BoneController.h"
/* variables */
static bool enable;
/* extAppStart: initialize controller */
EXPORT void extAppStart(MMDAgent *mmdagent)
{
enable = true;
mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINENABLE, "%s", PLUGINLOGGER_NAME);
}
/* extProcMessage: process message */
EXPORT void extProcMessage(MMDAgent *mmdagent, const char *type, const char *args)
{
}
EXPORT void extAppEnd(MMDAgent *mmdagent)
{
enable = false;
}
extAppStart部分ではプラグインがロードされた際の実行を記述する.プラグインのenableやsendMessageで起動したメッセージを送ることを行っている.
extProcMessage部分ではプラグインがメッセージを受信した際の動作を記述する.実際のプラグインがなにをやるかはこの部分に記述することが多い.雛形プラグインではまだなにも記述していない.
extAppEnd部分ではプラグインの終了記述を行う.デストラクタの代わりになるものなので,しっかりと記述しておくこと.これが終了しないとMMDAgent自体がフリーズするおそれがある.