まず以下の説明では Visual Studio Express 2013 for Windows Desktop を使います。
※無料版(ExpressEdition)の古いバージョン(VC#2010とか)だと、説明中のプロセスアタッチ機能が使えない場合があるのでご注意ください。
最初にプラグイン作成の雛形まで作ります。
1. 新規プロジェクトから C#のクラスライブラリを選択
2. プロジェクトのプロパティからフレームワークを ".NET Framework 4" へ変更
3. 参照設定から PMXエディタ内(Libフォルダ以下)の "PEPlugin.dll" と "SlimDX.dll" を追加
これで最低限の雛形ができました。
※SlimDXのプロパティ "特定バージョン" が "False" になっていないと、公開プラグインでは面倒が出るかもしれません。
では実際に以下のプラグインを使って確認してみましょう(Class1.cs に全貼り付けでOK)。内容としては モデル名をメッセージ表示するだけの簡単なものです。
※参照設定から "System.Windows.Forms" を追加しておきましょう。
using System;
using System.Windows.Forms;
using PEPlugin;
namespace PluginTest
{
public class Class1 : PEPluginClass
{
public override void Run(IPERunArgs args)
{
base.Run(args);
try {
var pmx = args.Host.Connector.Pmx.GetCurrentState();
MessageBox.Show(pmx.ModelInfo.ModelName);
}
catch (Exception ex) {
System.Diagnostics.Debug.Assert(false, ex.Message);
}
}
}
}
通常、PMXエディタのプラグインは "_plugin"フォルダ以下に DLLファイルを配置して使いますが、一々コピーして起動していては面倒なので、プラグインの外部実行機能を利用します。
本体メニュー [編集]-[プラグインDLLの直接実行] から以下の操作窓が表示できるので、
この窓に作成されたプラグインの DLLファイル(bin/Debug/****.dll) をドロップしてやれば、そのままプラグインとして実行することができます。
あとはコード側から起動中の PMXエディタにプロセスアタッチすることで、デバッグ機能を使ったプラグインの確認ができるようになります。
※ブレークポイントやステップ実行の方法などは、既にあちらこちらで説明されているのでここでは省略します。
で、デバッグを終了しソース編集に戻ってリビルドし直してみましょう。
こんな感じでエラーになってしまったと思います。従来のプラグインでは一度本体側に取り込まれたプラグインは切り離すことができないため、このようなエラーが出てしまいます。解決するには PMXエディタ自体を再起動する必要があります。
簡単な内容のプラグインなら一々再起動して対応できないこともないでしょうが、色々手間なことには違いありません。まして規模が大きくなったり、前提条件を一々設定し直さなければならない場合などは尚更です。
ということで、今回作成した Cプラグインの出番となります。PMXエディタは一旦終了して再起動しておいてください。
まずコードを貼ってしまいましょう。
using System;
using PXCPlugin;
using PEPlugin.Pmx;
using PEPlugin.SDX;
namespace PXCPlugin
{
public class Register : RegisterBase
{
public override string[] ClassNames
{
get
{
return new string[]{
"CPluginTest.Class1"
};
}
}
}
}
namespace CPluginTest
{
public class Class1 : PXCPluginClass
{
public override void Run(IPXCPluginRunArgs args)
{
base.Run(args);
try {
// PMX取得
IPXPmx pmx = PXCBridge.GetCurrentPmx(args.Connector);
IPXMaterial m = null;
if (pmx.Material.Count < 1) {
// 材質追加
m = m_bld.Material();
V3 col = new V3(1, 0, 1);
m.Diffuse = new V4(col, 1);
m.Ambient = col;
m.Toon = "toon01.bmp";
m.Shadow = true;
pmx.Material.Add(m);
}
else {
m = pmx.Material[0];
}
V3.SetRandSeed((int)DateTime.Now.Ticks);
V3 pos = V3.Rand(new V3(-20, 0, -20), new V3(20, 20, 20));
float r = V3.Rand(1, 3).X;
// ボーン(物理用)
var bone = m_bld.Bone();
bone.Position = pos;
bone.IsTranslation = true;
pmx.Bone.Add(bone);
// 球追加
PXCBridge.PrimitiveBuilder.AddSphere(pmx, 0, pos, r, 12, 8, bone);
// 同サイズの剛体追加
var body = m_bld.Body();
body.Bone = bone;
body.BoxKind = PEPlugin.Pmd.BodyBoxKind.Sphere;
body.BoxSize = new V3(r, 0, 0);
body.Position = pos;
body.Mode = PEPlugin.Pmd.BodyMode.Dynamic;
body.Restitution = 1;
body.PositionDamping = 0;
body.RotationDamping = 0;
pmx.Body.Add(body);
// PMX更新
PXCBridge.UpdatePmx(args.Connector, pmx);
}
catch (Exception ex) {
System.Diagnostics.Debug.Assert(false, ex.Message);
}
}
}
}
先のプラグインと同じように雛形から Class1.cs に全貼り付けで OKです。
あまり簡素な内容でもつまらないので、ちょっと長くなっていますが、何をやっているかは実行してみればすぐに解ると思います。
アタッチするのは後回しにして、ビルド後に DLLをプラグイン実行窓へドロップしてみましょう。先ほどとは異なり右側の "破棄" ボタンが使えるようになっています。
試しに実行してみるとこんな感じになります(何度か実行処理を繰り返しています)
※今回の主題とは特に関係ありませんが、TransformViewで物理演算の確認をしてみれば、プラグインの内容も見えてくるかと思います。
動作確認もできたので、一度プラグインを実行窓から破棄してみましょう。破棄ボタンを押すだけです。
破棄後、ソース編集側へ戻りリビルドしてみると、(従来プラグインではエラーになりましたが) Cプラグインでは問題なくビルドが完了したと思います。
※破棄したプラグインDLLは同じボタンでリロードが可能なので、修正後の再実行も簡単に行えます。
後は先ほどと同じようにプロセスアタッチを併用すれば、デバッグ機能を使いながら効率よくプラグインの編集、作成ができるというわけです。
ちなみにプロセスアタッチの作業も通常の方法([ツール]-[プロセスにアタッチ])ではテスト毎に一々プロセス選択が必要だったりと ちと面倒なので、これももっと簡単な方法にしてしまいましょう。
まずプラグインのソリューションに既存プロジェクトを追加。追加するファイルに "PmxEditor.exe" を指定します。
※プロジェクトファイルじゃないのに大丈夫なの?と最初思われるかもしれませんが、論より証拠。とりあえずやってみましょう。
PMXエディタがソリューション内に取り込まれたはずなので、あとは
・PmxEditor をスタートアッププロジェクトへ変更
・PmxEditor のプロパティを表示し、アタッチを "はい" へ変更
とすれば OKです。
これで通常のデバッグと同様に F5 で自動的にアタッチするようになります。
※DLL側のビルドは手動(F7など)で行う必要があるようです(依存関係は作れないっぽい?)
本体側の破棄/リロードは必要ですが、プラグインDLLを一般的な実行可能アプリのような感覚で作成することができるようになるかと思われます。
従来のプラグインをある程度の規模で作成されたことのある方は、デバッグやテストに関してその面倒さに辟易されたと思いますが、新しい環境では非常に楽ができるようになりました。
以上、少々・・・と言うにはかなり無理がある分量になってしまいましたが、プラグイン作成でのデバッグ利用についての紹介でした。
【関連する記事】
