前回の記事では、RPGツクールMVで動作するプラグインコマンドを作り、配列について触れました。
プラグインの作り方入門その7:プラグインコマンドの作り方(JavaScriptの配列)
今回は、前回を下地にRPGツクールMZ用のプラグインコマンドを作成します。
公式プラグインを読み解く | プラグインを作ってみる | プラグイン講座 | RPGツクールMZ
tkool.jp/mz/plugin/make/koushiki.html
に書いてあります…と終わってしまうのも寂しいのと、筆者的には上記でも最初に挑戦するにはハードルが高い内容になっていると感じたので、筆者なりのレベルに合わせたまとめをします。
目次
目的(MZプラグインコマンドでウェブサイトを開く)
前回(その7)、RPGツクールMV用に作ったプラグインコマンドと同じ内容を作ります。
新規に作る方法と、MV用のコードをそのまま流用する方法(邪道)をまとめます。
MZ用プラグインコマンドのテンプレート
/*:
* @target MZ
*
* @command コマンド名
* @text
* @desc
*
* @arg 指定値
* @text
* @desc
* @type
* @default
*/
(() => {
"use strict";
const pluginName = 'ファイル名';
PluginManager.registerCommand(pluginName, "コマンド名", args => {
// 処理
});
})();
プラグインコマンドの仕様を確認
テンプレートに最低限の内容をいれて、仕様を確認します。
/*:
* @target MZ
*
* @command test
* @text テスト
* @desc テストだよ。
*
* @arg hogehoge
* @text ほげほげ
* @desc ほげほげ
* @type string
* @default
*/
(() => {
"use strict";
const pluginName = 'pluginCommandMZ';
PluginManager.registerCommand(pluginName, "test", args => {
console.log(args);
});
})();
実行して、ログを見ましょう。
pluginCommandMZ.js:21
{hogehoge: "値を入れましょボンボリに"}
というログが出ました。
ここで出てきたargsの中身はオブジェクトのようです。
developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/Basics
オブジェクトの値の引き出し方
オブジェクトの値を引き出す方法は、配列とは少々異なります。
(() => {
"use strict";
const pluginName = 'pluginCommandMZ';
PluginManager.registerCommand(pluginName, "test", function (args) {
console.log(args);
console.log(args.hogehoge);
});
})();
ログを加えて実行します。
pluginCommandMZ.js:21
{hogehoge: "値を入れましょボンボリに"}
pluginCommandMZ.js:22
値を入れましょボンボリに
とログに出ました。
このように @arg で指定したパラメーター名を argとドット(.)で繋げることで、その値を指定して引き出すことが出来ます。
ウェブサイトを開くプラグインコマンド
プラグインをまるごと書き換えます。
/*:
* @target MZ
*
* @command openURL
* @text URLを開く
* @desc 指定したURLを別ウィンドウで開きます。
*
* @arg inputUrl
* @text URL
* @desc 開くURLを入力してください。
* @type string
* @default https://tkool.jp/mz/
*/
(() => {
"use strict";
const pluginName = 'pluginCommandMZ';
PluginManager.registerCommand(pluginName, "openURL", function (args) {
const url = String(args.inputUrl);
window.open(url);
});
})();
ツクールの編集画面でプラグインコマンドの呼び出しを書き直します。
実行すると、別ウィンドウにURLの内容が表示されました。
アクターが変身(別アクターと交代)するプラグインコマンド
先に前回のコードをひっぱってきて、それを書き換えただけのものを出します。
/*:
* @target MZ
*
* @command changeActor
* @text アクター変身
* @desc アクターを入れ替えます。
*
* @arg beforeActor
* @text 変身前アクター
* @desc 変身前のアクターIDを指定してください。
* @type actor
* @default 0
*
* @arg afterActor
* @text 変身後アクター
* @desc 変身後のアクターIDを指定してください。
* @type actor
* @default 0
*/
(() => {
"use strict";
const pluginName = 'pluginCommandMZ';
PluginManager.registerCommand(pluginName, "changeActor", function (args) {
console.log(args);
const before = Number(args.beforeActor);
const after = Number(args.afterActor);
$gameParty._actors.splice($gameParty._actors.indexOf(before), 1, after);
$gamePlayer.refresh();
$gameMap.requestRefresh();
});
})();
プラグインコマンドを入力し直します。
ログは下記のように出ます。
pluginCommandMZ.js:27
{beforeActor: "1", afterActor: "2"}
beforeActor: "1"
afterActor: "2"
__proto__: Object
このように、RPGツクールMVと比較すると、下記の点が大きく異なります。
- MZではプラグインパラメーターによって、プラグインコマンドの入力項目を設定する必要がある。
しかし、このため入力ミスを減らしたり @type を使用することで、楽にしたり画像ファイル等にデプロイメント対策をするのが直感的になっている。 - 渡される値の型が配列からオブジェクトになり、引き出し方が変わっている。
MZの方が名前がついているために、直感的なコードが書きやすくなっている。
完成品
※こちらのプラグインコマンドはMZでは戦闘中に使用するとバグるので、対応したものに書き換えられています。
まるで別物です。
fungamemake.com/archives/12055
RPGツクールMZへMVのプラグインコマンドを移植する(邪道)
RPGツクールMVのプラグインコマンドを移植しようとした時に「arg[xxx]」の箇所を毎回書き換えるとなると、大変でミスも出やすいコードの場合にショートカットする邪道です。
オブジェクトから配列に変換してしまおうという発想です。
例1
(() => {
"use strict";
const pluginName = 'pluginCommandMZ';
PluginManager.registerCommand(pluginName, "changeActor", function (arr) {
// オブジェクトを配列に入れてしまう
const args = [arr.beforeActor, arr.afterActor];
console.log(args);
const before = Number(args[0]);
const after = Number(args[1]);
$gameParty._actors.splice($gameParty._actors.indexOf(before), 1, after);
$gamePlayer.refresh();
$gameMap.requestRefresh();
});
})();
例2
(() => {
"use strict";
const pluginName = 'pluginCommandMZ';
PluginManager.registerCommand(pluginName, "changeActor", function (arr) {
// オブジェクトを配列に入れてしまう2
const args = Object.entries(arr).map(([key, value]) => `${value}`);
console.log(args);
const before = Number(args[0]);
const after = Number(args[1]);
$gameParty._actors.splice($gameParty._actors.indexOf(before), 1, after);
$gamePlayer.refresh();
$gameMap.requestRefresh();
});
})();
両方とも同じログになります。
どちらも結果は同じですが、移植元の項目が多く、コードの中に入り組んで arg[xx] が入っているようなコードの場合、例2を使用するとコードの変更がほとんど必要なく動作します。
しかし、どちらにしても、プラグインパラメーターの追加は必要となります。
注意点(アロー関数)
このプラグイン作成入門で、テンプレートとしている最初の行
(() => {
はアロー関数と呼びます。
RPGツクールMVのプラグインの多くは、この行は
(function(){
になっています。
アロー関数は、JavaScriptでは比較的新しく追加された記述方法でMVの発売当時には無かったことが大きな要因だと予想します。
そして、即時関数にするという目的だけならば、どちらでも動作が同じなので、文字数の少ないアロー関数が主流に変わったのだと予想しています。
そして、プラグインの中は即時関数にしておくことで、他のプラグインとの競合が起こりにくくすることができます。
有名なMOGシリーズ、YEPシリーズ(おそらくMZにおけるVisuStellaシリーズも)は、これを全く守っていないため、非常に競合しやすいと言われています。
(おそらく、利用者が即時関数化しただけでは、簡単には動作しない作り(YEPシリーズなどCoreとXプラグインのように連動するタイプは特に)でしょうし、作者が競合を気にしない性格というかポリシーなのでしょう。
プラグイン講座をよく読むと下記のように書いてあります。
もし、Game_Interpreterのメソッドを呼び出したい場合、アロー関数を使わずに関数を記述したうえで、thisを付けて呼び出します。
PluginManager.registerCommand("プラグイン名", "コマンド名", function(args) { this.character(0); });
アロー関数とfunction式とは、このような点で異なります。
developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions
アロー関数を基本としていますが、function式でなければ動作しないコードもあるので、ご注意ください。
コメントを投稿するにはログインしてください。