PMXEプラグインを作る【プロジェクト作成編①】

前回

orico17.hatenablog.com

目的

今回はプラグインの元となる「プロジェクト」を作成します。
プラグインは「~.dll」という形式ですが、1つのプロジェクトにつき1つのdllファイルが作成されます。

MMDで例えるならpmmファイルあたりが該当するでしょうか。

環境・前提

手順

PMXエディタ同梱テキストのプラグイン解説.txtを参考に進めていきます。
T0R0さんのブロマガであればPMDEプラグインの作り方 導入:T0R0のブロマガ - ブロマガが該当します。

○作り方(VC#2010の場合)

  1. クラスライブラリとしてプロジェクトを作成
  2. PMXエディタの"PEPlugin.dll"を参照設定へ追加
  3. 作成するライブラリクラスに"PEPlugin.IPEPlugin"を実装、
     または"PEPlugin.PEPluginClass"から派生し"Run(IPERunArgs args)"メソッド等をオーバーライド

  4. 必要な処理を記述しビルド

  5. 出来上がった"*.dll"ファイルをPMXエディタの"_plugin"フォルダ内へコピー(配布時はDLL単体で配布してください)

プロジェクトを作成する

1.クラスライブラリとしてプロジェクトを作成

Visual Studioを起動します。
Visual Studio 2019ならこんな画面です。
[新しいプロジェクトの作成]を選択します。 f:id:orico17:20210814182612p:plain

[新しいプロジェクトの作成]画面に遷移します。 f:id:orico17:20210814184049p:plain

[すべての言語]を[C#]にして絞り込みます。 f:id:orico17:20210814184023p:plain

[クラス ライブラリ(.NET Framework)]を選択後、[次へ]を選択します。
[クラス ライブラリ]ではなく[クラス ライブラリ(.NET Framework)]を選択します。 f:id:orico17:20210814190937p:plain

下記のように入力します。

[ソリューションとプロジェクトを同じディレクトリに配置する]はONでもよいのですが、個人的には下図のように[ソリューションとプロジェクトを同じディレクトリに配置する]をOFFにして、[ソリューション名]を付けることをおすすめします。

[作成]を選択します。

f:id:orico17:20210814190441p:plain

クラスライブラリのプロジェクトが作成されました。 f:id:orico17:20210814190609p:plain

フォルダ構成はこんな感じになります。

src
└─PmxePlugin
    │  PmxePlugin.sln
    └─TestPlugin
        │  Class1.cs
        │  TestPlugin.csproj
        ├─bin
        ├─obj
        └─Properties
                AssemblyInfo.cs

1つのプロジェクトにつき1つのdllファイルが作成されるので、今回であればTestPluginフォルダ配下の情報を詰め込んだTestPlugin.dllというファイルができます。
「ソリューション」は複数のプロジェクトをまとめるためのもので、プラグインの内容には直接影響しません。

2つめのプラグインを作成したい場合

1つめのプラグインを作成した時にできた「〇〇.sln」を起動します。
この記事通りに名前を設定した場合はPmxePlugin.slnです。
ファイルをクリックすると画面が起動します。 f:id:orico17:20210814190609p:plain

[ソリューションエクスプローラー]というウィンドウの中で、ソリューション(PmxePlugin)を選択します。
右クリック > [追加] > [新しいプロジェクト] を選択します。 f:id:orico17:20210815142511p:plain

[新しいプロジェクトの作成]画面が開かれるので、以降は同じです。 f:id:orico17:20210814184049p:plain

プロジェクトが追加されました。 f:id:orico17:20210815144310p:plain

フォルダ構成はこんな感じになります。

src
└─PmxePlugin
    │  PmxePlugin.sln
    ├─ClassLibrary1
    │  │  Class1.cs
    │  │  ClassLibrary1.csproj
    │  ├─bin
    │  ├─obj
    │  └─Properties
    │          AssemblyInfo.cs
    └─TestPlugin
        │  Class1.cs
        │  TestPlugin.csproj
        ├─bin
        ├─obj
        └─Properties
                AssemblyInfo.cs

この場合、TestPlugin.dllClassLibrary1.dllが作成されます。

プロジェクトにPEPlugin.dll、SlimDX.dllへの参照を設定する

2.PMXエディタの"PEPlugin.dll"を参照設定へ追加

ソリューションエクスプローラーでプロジェクト(TestPlugin)の [参照] を選択します。
右クリック > [参照の追加] を選択します。 f:id:orico17:20210815145437p:plain

[参照マネージャー] が開かれます。
[参照] を選択します。 f:id:orico17:20210815145704p:plain

f:id:orico17:20210815145958p:plain

PMXエディタのLibフォルダの中のPEPlugin.dllSlimDX.dllを選択してください。

Lib
├─PEPlugin
│  │  PEPlugin.dll ★
│  └─doc
├─PMX仕様
├─SlimDX
│  ├─x64
│  │      SlimDX.dll ★
│  └─x86
│          SlimDX.dll
└─System

[OK] を選択します。 f:id:orico17:20210815150325p:plain

[参照] の中に「PEPlugin」「SlimDX」が追加されました。 f:id:orico17:20210815150604p:plain

参照の「PEPlugin」「SlimDX」を選択し、それぞれ[プロパティウィンドウ]の[ローカルにコピー]を[False]にします。 f:id:orico17:20210815203121p:plain

備考

フレームワークで.NET Framework4.0を選んだ理由

PMXエディタ同梱テキストのreadme.txtにPMXエディタで使われているフレームワークが書かれています。
これに準じています。

●必須ランタイム
.NET Framework4.0 (3.5以下もインストール推奨)
DirectXランタイム
Visual C++ 2010 再頒布可能パッケージ
Visual Studio 2013 Visual C++ 再頒布可能パッケージ

ソリューションエクスプローラ

ソリューションを管理するためのウィンドウです。
詳細は以下を参照してください。

次回

作成中です。

PMXEプラグインを作る【番外編:参考になるもの】

PMDEプラグイン、PmxEプラグインについて

PMDE / PmxE の同梱テキスト

ものすごく丁寧にいろいろ書いてあるので、一回は読んでみるとよいと思います。
とりあえず下記のファイルは重要そうな順に並べました。

readme.txt
PMDE / PmxEの使い方や機能など。

プラグイン解説.txt
Lib > PEPlugin > doc の中にある。
ユーザープラグインの作り方や仕様について。(よく配布されているプラグインはこれ)

PMX仕様.txt
Lib > PMX仕様 の中にある。PMXがどのような構成か。

プラグイン解説_Cプラグイン.txt
Lib > PEPlugin > doc の中にある。
C#スクリプトについて。(編集 > プラグイン > CSScript > C#スクリプト から実行するプラグイン)

とある工房

PMX: とある工房

PMDE、PmxEを配布してくださっている極北Pさんのブログ。
ひとまず検索してみるとヒットするかもしれません。

T0R0さんのブロマガ

PMDEプラグインの作り方の記事:T0R0のブロマガ - ブロマガ

闇鍋プラグインを配布してくださっているT0R0さんのブログ。
ここを読めば大抵のことは書いてあります。
ただブロマガが終了してしまうので、こちらでDLさせていただくのがよいと思います。t0r0_MMD_ブロマガ - BowlRoll

プログラミングの専門用語について

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

こちらのサイトは易しく説明してくれているのでおすすめです。
よくわからない単語がガンガン出てくると思うので、ここでなんとなく理解して次に進めるとよいと思います。

C#について

動画で見たいなら

C#入門 (全36回) - プログラミングならドットインストール

会員登録は必要ですが3分で区切ってくれるので一番とっつきやすいかもしれません。
初心者ほどおすすめ。

文章で読みたいなら

一週間で身につくC#言語の基本|トップページ~C#言語の初心者でも、簡単にプログラミングが気軽に学習できるサイトです。

細かい部分を丁寧にというより、順を追って理解したい、ざっくり俯瞰したい場合はよいと思います。

慣れてきた時に

C# によるプログラミング入門 | ++C++; // 未確認飛行 C
とほほのC#入門 - とほほのWWW入門

C#とはなんぞや、を詳しく説明してくれるサイト。
「配列ってつまりは何なんだ?」など逆引きリファレンスのように私は使っています。

公式

C# 関連のドキュメント - はじめに、チュートリアル、リファレンス。 | Microsoft Docs

C#を作成したMicrosoftチュートリアル
英語サイトによくある特徴的な日本語が平気ならよいかもしれません。

Visual Studioについて

画面レイアウト

VisualStudio(統合開発環境)の画面構成をまとめてみました! | きままブログ

「ソリューションエクスプローラーって何?」という時に。

参考になるソースコード

C#の一般的なソースコード

.NET Tips - DOBON.NET

サンプルソースがたくさんあるサイト。
「ファイルを保存したいけどどうすれば出来るんだ?」というような目標がある場合にとても便利です。

プラグインソースコード

PMDEプラグインの作り方 導入:T0R0のブロマガ - ブロマガ
プラグインの基本的なソースを配布されています。

闇鍋プラグインソースコードも配布してくださっているのでbowlrollを見てみることをおすすめします。
t0r0 - BowlRoll

MMD関連の便利機能など

目的

便利機能をまとめていきます。

PMDEditor / PmxEditor

同梱のreadme.txtを改めて読むといろんな機能がありますね…。

標準機能:自動バックアップ

デフォルトでは無効になっているので、有効にしておくと救われる命があるかもしれません。
小ネタ2 (PMXエディタ): とある工房

編集 > プラグイン > System > 自動バックアップ > 有効:ON

標準機能:プラグインのフォルダの場所を変更できる

基本的には下図のように_plugin内のUserに配布されたプラグインをつっこんで有効化させますが、PmxEditorのバージョンが上がるたびにコピペしないといけないのが少し面倒です。 f:id:orico17:20210814144926p:plain

PmxE
├─PmxEditor_0254g
│  ├─Lib
│  ├─_data
│  └─_plugin
│      ├─CSScript
│      ├─Launcher
│      ├─System
│      └─User ← 同じデータをコピペ
└─PmxEditor_0257
    ├─Lib
    ├─_data
    └─_plugin
        ├─CSScript
        ├─Launcher
        ├─System
        └─User ← 同じデータをコピペ

これを上手いことしてくれる(=外部参照)のが_pluginの中にあるuser.pathというファイルです。
例えば以下のように_pluginフォルダを各バージョンの外に置きます。

PmxE
├─PmxEditor_0254g
│  ├─Lib
│  ├─_data
│  └─_plugin
│      │  user.path ■
│      ├─CSScript
│      ├─Launcher
│      └─System
├─PmxEditor_0257
│  ├─Lib
│  ├─_data
│  └─_plugin
│      │  user.path ■
│      ├─CSScript
│      ├─Launcher
│      └─System
└─_plugin ★
    └─User

_pluginフォルダのパスを調べます。
調べ方はこちら

各バージョンの_pluginフォルダ内にあるuser.pathをメモ帳で開きます。

;このファイルにプラグインの外部参照先を指定可能(UTF8で要テキスト保存)
;例) C:\PmxEditor\_plugin

先ほど調べたパスを入力します。

;このファイルにプラグインの外部参照先を指定可能(UTF8で要テキスト保存)
;例) C:\PmxEditor\_plugin
C:\_app\MMD\_modeling\PmxE\_plugin

;で始まる行は無視される(=コメントアウト)のでそのまま放置でも削除しても問題ないです。未来の自分が忘れた時に思い出すヒントになるので残しておいた方が無難です。

メモ帳で、ファイル > 名前を付けて保存 > ファイルの種類:すべてのファイル、文字コードUTF-8 を選択して保存します。 f:id:orico17:20210814153855p:plain

これでPmxEフォルダ直下にある_pluginフォルダ(★)からプラグインのdllを読み込めるようになりました。

これからは

  • 新しい配布プラグインを追加したい場合 → _pluginフォルダ(★)のUserフォルダに入れる
  • 新しいPmxEを追加したい場合 → user.pathファイルを前のバージョンからコピペする

とするだけでよくなります。

トラブルシューティングなど: とある工房

標準機能:複数の値を一度にコピペ(ベクトルコピー)

1つの項目に対して複数の値が存在するものがあります。
例えばボーンの「位置」ならX座標、Y座標、Z座標。
材質の「拡散色」ならR、G、B。

これらを一気にコピペしたい場合、項目名の部分にマウスカーソルをかざし、紫色に変わった時点で右クリック > ベクトルコピー。

小ネタ2 (PMXエディタ): とある工房

用語

パス

ファイルやフォルダ(ディレクトリ)の場所を示す情報
が「パス(path)」です。
パスとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

パスを調べるにはまず該当のフォルダを開きます。 f:id:orico17:20210814152917p:plain

上部のアドレスバーをクリックすると表示されるのがパスです。
今回だとC:\_app\MMD\_modeling\PmxE\_pluginが_pluginフォルダのパスです。 f:id:orico17:20210814152936p:plain

例えばUserフォルダのパスはC:\_app\MMD\_modeling\PmxE\_plugin\User、memo.txtファイルのパスはC:\_app\MMD\_modeling\PmxE\_plugin\memo.txtとなります。

ボーン検索・一括操作プラグイン(BatchOperate)の使い方

ボーン検索・一括操作プラグイン(BatchOperate)とは

ボーンを検索したり一括更新・置換できるPMXEditorプラグインです。

f:id:orico17:20210808210345p:plain

f:id:orico17:20210810211811p:plain

以下の説明では

  • オレンジ:検索入力部
  • 緑:更新入力部
  • 紫:一覧部

とします。

インストール

_plugin\User配下にフォルダごと置いてください。

f:id:orico17:20210808214047p:plain

検索について

検索入力部に検索内容を入力して[検索]ボタンをクリックすると、一覧部に検索結果一覧が表示されます。

検索 例:ボーン名に「右」を含むIKボーンを検索したい

下図はPMXEのボーンタブ画面

f:id:orico17:20210808210337p:plain

  1. 検索入力部の[ボーン名]に「右」を入力し、[性能 IK]のチェックをONf:id:orico17:20210808210204p:plainにする
  2. [検索]をクリックする
  3. 一覧部に検索結果が表示される

f:id:orico17:20210808210345p:plain

用語

完全一致検索

完全一致検索とは
検索のやり方を指す用語のひとつ
であり
検索キーワードと「完全に同じ」ものを探すよ!なやり方
です。
完全一致検索とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

例えば、「髪」で検索すると「髪」のみヒット、「右髪」「右髪IK」「髪後ろ」はヒットしません。

部分一致検索

部分一致検索とは
検索のやり方を指す用語のひとつ
であり
検索キーワードを「含む」ものを探すよ!なやり方
です。
部分一致検索とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

例えば、「髪」で検索すると「右髪」「右髪IK」「髪後ろ」「髪」がヒットします。

ワイルドカード検索

サクッと一言で説明すると
「ん~とね、何って決まっているわけじゃないんだけど、ここに文字列が入るから」を示す特殊文字
が「ワイルドカード」です。
ワイルドカードとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

「*」が「任意の0文字以上」、「?」が「任意の1文字」を表すワイルドカードです。
例えば、「右*先」で検索すると 「右手先」「右つま先IK」「右中指先」がヒットし、「右?先」で検索すると 「右手先」だけヒットします。

正規表現検索

サクッと一言で説明すると
文字列を指定する際に「これ!」とピンポイントで指定するのではなく「こんな感じ!」とちょっと幅を持たせて指定できる書き方
が「正規表現(セイキヒョウゲン)」です。
正規表現とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

正規表現はめちゃくちゃ便利なんですが、いろいろ出来すぎて例が挙げづらいので興味を持たれた方は下記のページをご参照ください。
サルにもわかる正規表現入門

「左〇〇ボーンの英名を〇〇_Lに統一したいな~」と思った時に下図のように入力すると「〇〇_L」になっていないボーンを探せたりします。

f:id:orico17:20210810231357p:plain

一括更新について

更新入力部に更新内容を入力し[一括更新]ボタンをクリックすると、一覧部で[Chk]列をONにしたものすべてが更新されます。

  • [クリア]ボタンをクリックすると更新入力部がリセットされる
  • 複数の項目を更新することも可能
  • チェックボックスは以下の3つの状態があり、未選択の場合は更新項目にならない
    • 未選択→f:id:orico17:20210808210119p:plain
    • OFF(=False)→f:id:orico17:20210808210154p:plain
    • ON(=True)→f:id:orico17:20210808210204p:plain
  • 更新入力部に表示されていない項目(IKのTargetなど)は未対応

一括更新 例:「右髪先」などの表示先ボーンを非表示にしたい

1 . 検索入力部の[ボーン名]に「先」を入力し、[検索]をクリックする
2 . ボーン名に「先」を含むボーンの一覧が表示される

f:id:orico17:20210808211718p:plain

3 . [全選択]をクリックし、すべての行の[Chk]列をチェックON状態にする
4 . 更新したくないボーンのチェックをOFFにする(今回であれば「左つま先」「右つま先IK」などは表示先ボーンではないためチェックをOFFにする)

f:id:orico17:20210808212343p:plain

5 . 更新入力部の[性能 表示]のチェックをOFFf:id:orico17:20210810210544p:plainにし、[一括更新]をクリックする

f:id:orico17:20210808213256p:plain

6 . 「モデルを更新しました。」のポップアップが表示され、選択したボーンの[表示]がOFFに更新される

f:id:orico17:20210808213023p:plain

f:id:orico17:20210810221537p:plain

f:id:orico17:20210808213500p:plain

※「更新前バックアップ」についてはこちら

一括置換について

f:id:orico17:20210810213539p:plain

一覧部の[一括置換入力]ボタンをクリックすると一括置換入力画面が表示されます。
表示された一括置換入力画面に置換内容を入力して[置換]ボタンをクリックすると、一覧部で[Chk]列をONにしたものすべてが更新されます。

  • 複数の項目を一括で更新することはできない
  • 置換できる項目は[置換項目]で選べるもののみ
  • 正規表現置換可能 → 正規表現

一括置換 例:左ボーンの英名を「~_L」から「~_Left」に変更したい

1 . 検索入力部の[ボーン名(英)]に「_L」を入力し、[検索]をクリックする
2 . ボーン名(英)に「_L」を含むボーンの一覧が表示される

f:id:orico17:20210810214922p:plain

3 . 更新したい行の[Chk]列をチェックON状態にする

f:id:orico17:20210810215028p:plain

4 . 一括置換入力画面で上図のように入力し、[置換]をクリックする

f:id:orico17:20210810215209p:plain

5 . 「モデルを更新しました。」のポップアップが表示され、選択したボーンの[ボーン名(英)]]が「~Left」に更新される

f:id:orico17:20210808213023p:plain

f:id:orico17:20210810215614p:plain

f:id:orico17:20210810215629p:plain

※「更新前バックアップ」についてはこちら

オプション設定

BatchOperate.dll.configで設定できる機能のこと。

更新前バックアップ

一括更新や一括置換を実行した時に、更新直前のモデルデータを保存する機能です。
自分がうっかりバックアップし忘れるのでデフォルトで付けました。
不要な場合はBatchOperate.dll.configIsBackupvalue="true"value="false"にしてください。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- 検索 正規表現:true/false -->
    <add key="SearchRegexCheck" value="false" />
    <!-- 一括置換 正規表現:true/false -->
    <add key="ReplaceRegexCheck" value="false" />
    <!-- 更新前バックアップ:true/false -->
    <add key="IsBackup" value="false" />
  </appSettings>
</configuration>

検索 正規表現・一括置換 正規表現

検索入力部や一括置換入力画面に[正規表現]f:id:orico17:20210810222837p:plainというチェックボックスがありますが、これをデフォルトでONにするかOFFにするかを設定できます。
デフォルトではOFFにしているので、ONにしたい場合はBatchOperate.dll.configSearchRegexCheckもしくはReplaceRegexCheckvalue="false"value="true"にしてください。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- 検索 正規表現:true/false -->
    <add key="SearchRegexCheck" value="true" />
    <!-- 一括置換 正規表現:true/false -->
    <add key="ReplaceRegexCheck" value="true" />
    <!-- 更新前バックアップ:true/false -->
    <add key="IsBackup" value="true" />
  </appSettings>
</configuration>

最新の配布物利用規約 Latest Rules

ENGLISH

Rules

  • If you do not follow the terms, you may not use this tool.
  • These rules are subject to change without notice.
  • I will not take responsiblility for any damage casued by this tool.

Do NOT distribute.
Do NOT claim as your own.
No commercial use.

日本語

利用規約

  • 下記の規約にしたがえない場合、配布物は使用できません。
  • 規約は予告なく変更されることがあります。
  • 配布物を使用して発生したいかなる損害に対しても一切責任を負いません。

禁止

  • 再配布
  • 自作発言
  • 商用利用

謝辞

下記のページを参考にさせていただきました。 ありがとうございます。

PMXEプラグインを作る【開発環境準備編】

目的

自分が久しぶりに作りたくなった時に思い出しやすいように記録しておきます。
プラグインが作りたいけれど一体何がどうなっているんだ…?という方の助けになればよいなと思います。

「開発環境準備」とは、プラグインを作成するために必要なソフト類をインストールしたり設定したりする作業です。
MMDで例えるなら、MMD本体をDLしたりDirectXをインストールしたりMMEを設定したりする段階です。

専門用語に悩んだら

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

こちらのサイトは易しく説明してくれているのでおすすめです。

プラグインを作成するために必要なもの

Visual Studio

プラグインは「C#*1というプログラム言語を使用して作成します。
C#で作成する場合に色々手助けしてくれるツールがVisual Studioです。*2

ダウンロード

DLはこちらのページでできます。
Visual Studio Community 2019 - Free IDE and Developer Tools

Visual Studioには様々なバージョンがあります。

2021年7月現在、最新の安定版は「2019」です。
「2022」はまだプレビュー版(開発中)なので止めておいた方がややこしくありません。

また「Community」「Professional」「Enterprise」のバリエーションがありますが、企業向けの「Professional」「Enterprise」は有料版なので、無料版の「Community」を選びます。

似たような名前の Visual Studio Code(VSCode)というソフトもあるのですが、別物なのでお気をつけください。

インストール

インストールはこちらの記事が分かりやすいと思います。


ワークロードの選択は「VB Visual Studio Community 2019 インストールの手引き」の方がおすすめです。
あとから追加できるのでどちらでも構わないのですが、一気に入れた方が楽なので。
Visual Studioはめちゃくちゃ多機能なのですが、全部有効化させると容量を食うので必要なものだけDLしましょう、というのがワークロードの選択です。

PMXエディタ

プラグインを作りたい人なら既にあると思いますが…。

DLはこちらのページでできます。
ダウンロードページ: とある工房

次回

orico17.hatenablog.com