開発日誌

プラグイン/スクリプト

[ テクニック ] [ プラグイン/スクリプト ] サブフォルダ内のプラグイン名取得

2021-06-22 23:14:17

※追記:
バージョン1.3.2の修正で、本対応は不要となりました。逆に動作しない原因となるため、お手数ですが各プラグインの再ダウンロードをお願いします。
サブフォルダ付きプラグインの仕様変更」記事参照。

RPGツクールMZのバージョン1.3.0(1.3.1)がリリースされ、プラグインフォルダにサブフォルダを作れるようになりました。

多くのプラグインは、プラグインパラメータやプラグインコマンドの取得のため、自分のプラグイン名を指定する必要がありますが、jsファイルをサブフォルダ内に入れることは基本的に想定されていないため、このままだと動作しなくなってしまいます。

ここではプラグイン作者向けに、サブフォルダ内に格納された場合でも、自分のプラグイン名を正しく取得するスクリプトを紹介します。

サブフォルダでプラグイン整理

RPGツクールでプラグインとして提供されるjsファイルは、プロジェクトフォルダの中にある js/pluins フォルダの中に格納する決まりになっています。

しかし、プラグインは何十個と導入するケースも珍しくなく、pluginsフォルダの中に大量のファイルが存在することになってしまいます。

このことから、RPGツクールMZバージョン1.3.0では、pluginsフォルダの中にサブフォルダを作ることができるようになりました。これによって、プラグイン作者別に整理したり、戦闘系・マップ系・メニュー系・立ち絵系……などとジャンル別に整理したり、といったことが可能になりました。

非常に便利ですね!

▲フォルダ内に雑然とあったファイルが…

▲この通りフォルダ分けされてスッキリ!

プラグイン作者泣かせの変更

しかし、この変更はプラグイン作者にとってはかなり厄介です。

プラグインパラメータやプラグインコマンドの実装の際、自分のプラグイン名を指定する必要があります。サブフォルダ内に格納されたプラグインの場合は、このプラグイン名が「サブフォルダ名/プラグイン名」となります。

もともとサブフォルダ内に格納できる仕様ではなかったため、多くのプラグインでは冒頭で、

const pluginName = 'プラグイン名';

のように自プラグイン名を直接指定しており、「プラグインのファイル名は変えないでください」で通していました。しかし、サブフォルダ名はユーザーの任意で付けられるので、プラグイン作者の方で事前に指定することができません。

document.currentScript.scrで自ファイル名を自動的に取得する方法もありますが、現在普及している書き方はやはり、サブフォルダ内に格納されることを想定していないため、正常に動作しません。

また、サブフォルダの中にさらにサブフォルダを作ることも可能となっており、全てのパターンに対応しようとすると、けっこう一筋縄ではいきません。

自分のプラグイン名を取得する

というわけで、自分のプラグイン名を取得するのにどう書けばいいのかということですが、トリアコンタンさんが真っ先に取得方法を上げてくださっていました。ありがとうございます。

https://gist.github.com/triacontane/71064daf535160d4d355aeb9bc3c49f9

以下は、それを参考に少しアレンジしたコードです。ご自由にお使いください。

const pluginName = decodeURIComponent(document.currentScript.src).replace(/^.*?\/plugins\/(.*).js$/, "$1");

※追記:
さらに、うなぎおおとろさんが改良版を上げていらっしゃったので、それを採用しました。ありがとうございます。

https://github.com/unagiootoro/RPGMZ

const pluginName = decodeURIComponent(document.currentScript.src).match(/^.*\/js\/plugins\/(.+)\.js$/)[1];

少し詳しく解説すると、decodeURIComponentは、フォルダ名やファイル名が日本語(非ASCII文字)の場合に、正しく日本語に変換(デコード処理)するための関数です。

document.currentScript.srcで自分のjsファイル名を取得できますが、これで取得できるのはフルURIのため、ここからプラグイン名のみを抽出する必要があります。

抽出は正規表現を使って、/js/plugins/から末尾の.jsまでの間の文字をプラグイン名として取得しています。

※さらに追記:
当初、正規表現の冒頭を^.*?として最短マッチを使うことで、サブフォルダ名に「plugins」が使われても正しくマッチさせるようにしていましたが、逆に配信サイトのURLに万一「plugins」が入っていた場合に動かなくなるとの指摘をいただいたため、修正しました。そんなことする人もいないと思いますが、サブフォルダをjs/pluginsにはしないようにしてください。

他に、もっとスマートな書き方とか、この書き方だと正常に動作しないケースとかがあれば、教えてください。

当サイトのプラグインも修正しました

というわけで、プラグインパラメータもプラグインコマンドも使っていないプラグイン以外は、現在出回っているほとんどのプラグインに影響が出ると思います。厄介なことしてくれちゃって……。

まあ、フォルダ分けしなければ影響は出ないので、使えなくなるというわけでもありませんし、修正はごくわずかです。ユーザーの方でも難しい修正では全然ありません。

拙作プラグインもほとんど影響が出るので、全て修正しました。めんどくさかった……。

[ テクニック ] [ 素材 ] [ プラグイン/スクリプト ] イベントキャラ移動の改善プラグイン

2021-06-17 23:08:30

イベントキャラクターのランダム移動やプレイヤーに近づく移動を改善するプラグインを作りました。RPGツクールMVとRPGツクールMZの両方に対応しています。

イベントキャラクターの移動に関して以下の3点を改善します。

1点目は「移動ルートの設定」における「ランダムに移動」。

RPGツクールの標準のランダム移動は、まず上下左右4方向からランダムに移動方向を決定し、その方向に移動ができたら移動する、という仕組みになっています。ランダムに決定された方向に障害物があって動けない時は、移動が発生しません。

したがって、3方向を囲まれた袋小路のような場所にキャラクターがいる場合、1/4の確率でしか動かないことになります。

このプラグインはそれを改善します。先に上下左右4方向で移動可能な方向をリストアップし、その移動可能な方向の中からランダムに移動方向を決定します。したがって、袋小路のような場所でも必ず動ける方向に動きます。

2点目は「自律移動」の「ランダム」。

RPGツクールにおける自律移動タイプの「ランダム」は、実は完全にランダムに移動するわけではなく、1/2の確率で今向いている方向にそのまま前進、1/6の確率でその場に停止、1/3の確率でランダムな方向に移動する仕組みになっています。

完全にランダムだと周りをウロウロするだけの怪しい動きになってしまうので、これ自体は動きを自然に見せるための仕組みだと評価できます。ただ、それぞれの確率を調整したい場合もあるでしょう。

このプラグインは、プラグインパラメータで前進と停止の確率を調整できます。デフォルトは前進が50%(1/2)、停止が17%(1/6)となっており、この値を変更すれば、ランダム移動の確率を高くしたりすることができます。

また、1点目のランダム移動の改善も適用されるため、キャラクターがランダム移動で狭い場所に入り込んでしまった時の動きが、劇的に改善されると思います。

そして3点目は「自律移動」の「近づく」。

RPGツクールにおける自律移動タイプの「近づく」は、ランダムと同様、常にプレイヤーに近づいてくるわけではなく、少し遊びのある動きをします。具体的には、プレイヤーに近づいてくる移動は2/3の確率であり、1/6の確率でランダムに移動、1/6の確率で今向いている方向にそのまま前進します。

敵が追いかけてくるような動きの場合は、この確率だと少々無駄な動きが多く、かといってカスタム移動の「プレイヤーに近づく」だと100%近づいてきてしまうため、それはそれで逃げ場がありません。

ランダム移動と同様、プラグインパラメータでランダム移動と前進の確率を調整できます。デフォルトはどちらも17%(1/6)で、この値を小さくすれば、より積極的に近づいてくる動きになります。

実際の動きはこんな感じ。狭い場所に入った時のランダムな動きや、プレイヤーへの接近具合が改善されているのが分かります。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ テクニック ] [ プラグイン/スクリプト ] 戦闘中にアイテムコマンドで武器変更

2021-06-05 22:22:57

戦闘コマンドの「アイテム」で、アイテムの使用だけでなく武器の装備変更もできるプラグインを作りました。RPGツクールMVとRPGツクールMZの両方に対応しています。

※追記:「戦闘中アイテムコマンド名」が空欄のままだとエラーになる問題を修正しました。

戦闘中に装備が変更できるプラグインは既にありますが、独自のコマンドではなく既存の「アイテム」コマンドにその機能を追加したところがポイントで、戦闘コマンドの数が増えないのでレイアウトに影響を及ぼしません。

代わりに、武器以外の装備を変更したり、変更前後の攻撃力を確認できる機能などは持たせていません。実際、戦闘中に武器を持ち替えるのは問題なくできそうですが、鎧を一度脱いで別の鎧に着替えてたりしたら、その間に一方的に攻撃を受けてしまいそうですw

あと、二刀流の場合の考慮も適当で、一方の武器しか変更できません。というか、両手の武器を変更するのにうまいインターフェースがあれば教えてください。

デフォルトでは、武器を変更したら、その新しい武器で通常攻撃をするようになっており、直ちに敵ターゲットの選択に移ります(全体攻撃武器の場合は次のアクターのコマンド選択に移ります)。もちろんターゲット選択をキャンセルすれば、別の行動を選択することもできます。武器の変更にはターンを消費しないので、何度でも武器の変更は可能です。

この挙動はプラグインパラメータで変更も可能で、「武器変更後通常攻撃」をOFFにすると、武器変更後は戦闘コマンドの選択に戻ります。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ テクニック ] [ プラグイン/スクリプト ] 敵キャラの複数回行動を細かく制御

2021-06-01 21:04:32

VX Ace以降のRPGツクールでは、特徴の「行動回数追加」で1ターンに2回以上行動する敵キャラを簡単に作成できます。

しかし、複数回行動の内訳を自由に決めることはできないため、場合によっては同じ補助魔法を2回連続で唱えてしまったり、凶悪な全体攻撃を2回連続で放ってきたりといった事態に陥ります。

そこで、複数回行動での条件を設定できるプラグインを作りました。RPGツクールMV/MZ両対応です。

※追記:「敵キャラの変身」に対応したバージョン1.1.0に更新しました。

※追記:条件の設定方法を改善したバージョン2を下記で公開しています。
敵キャラの複数回行動を細かく制御・2

これを使うと、2回行動のうち1回目は通常攻撃で2回目は魔法攻撃とか、1回目は攻撃魔法で2回目は補助魔法とか、強力な全体ブレス攻撃の場合は1回行動で終了とかいった、細かい調整が可能です。

複数回行動の制御にはステートやTPを駆使した方法もありますが、このプラグインを使った方が楽でしょう。

使い方としては、以下を敵キャラのメモ欄に記述します。

<MultiActionX:行動パターン番号>
指定した行動パターンは複数回行動のうちX回目の行動でのみ選択されます。
<LastAction:行動パターン番号>
指定した行動パターンを選択すると以降の複数回行動は行わなくなります。

行動パターン番号には、行動パターン一覧の順番をカンマ(,)区切りで指定します。

具体的には、敵キャラの行動パターンが以下のように設定されているとします。

  • (1) 通常攻撃
  • (2) ファイア(単体魔法)
  • (3) スパーク(全体魔法)
  • (4) ヒール(回復魔法)

この時、以下の記述をメモ欄にしたとします。

<MultiAction1:2,3>

<MultiAction2:4>

<LastAction:3>

この場合、1番の通常攻撃は設定がないので2回行動のうち1回目でも2回目でも、どちらでも選択されます。2番のファイアと3番のスパークは、MultiAction1の記述により、1回目の行動でのみ選択されます。4番のヒールは、MultiAction2の記述により、2回目の行動でのみ選択されます。また3番のスパークは、LastActionの記述により、選択されたら以降の行動は行わなくなります。

まとめると、2回行動は以下のようなパターンになります。

  • 通常攻撃+通常攻撃
  • 通常攻撃+ヒール
  • ファイア+通常攻撃
  • ファイア+ヒール
  • スパークのみ

こうすることで、2回とも回復してしまうのを避けたり、強い全体魔法は1回だけにしたりと、ある程度のバランス制御を行うことが可能です。

バランス制御だけでなく、例えば魔法戦士的な敵キャラに物理攻撃と魔法攻撃をそれぞれ1回ずつ行わせたり、騎兵のような敵キャラに馬の突進攻撃と兵の物理攻撃を1回ずつ行わせたりと、敵キャラの性格付けなどにも応用できます。

また、2回行動だけでなく、3回以上の行動にも対応しています。

行動回数を増やした場合は、プラグインパラメータの「複数回行動最大値」で、最大の行動回数を設定してください。最大値以上の行動を設定しても無視されます。最大値は何回にでも設定できますが、必要以上に増やしすぎると処理が重くなりますので、ご注意を。

行動パターンを番号で指定しなければいけないのが、ちょっと残念なところではあります。番号が画面上に表示されているわけではないので、行動パターンがたくさんある場合は、数え間違いに注意してください。行動パターンにもメモ欄があったり、もう少し細かい設定がいろいろできればいいんですけどね。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。

[ テクニック ] [ プラグイン/スクリプト ] 画像の先読みを改善して画像表示のラグ解消

2021-05-29 18:55:56

お久しぶりです。

twitterの方では時々制作状況を紹介していますが、それをするとこちらの方ではあまり語ることがなくなるので、どうしても更新頻度が落ちてしまいますね。それでも、新しいプラグインや小技の紹介などはたまにしていきたいと思っています。

さて今回は、RPGツクールMZにおける画像表示のラグを解消するプラグインを公開します。

テストプレイ時やダウンロード版の場合はローカルから読み込むので特に気になるということはありませんが、「ゲームアツマール」などブラウザ版でプレイする場合は、サーバーから画像ファイルをダウンロードしてこないといけないので、特にサイズの大きい画像は画像表示のラグ(遅延)が割と顕著に発生します。

RPGツクールMZのデフォルトでは、イベントの開始時に、イベントコマンドの先頭から200行目までをチェックして、その中に登場する「文章の表示」の顔グラフィック画像と「ピクチャの表示」のピクチャ画像を、先に読み込むようになっています。先に画像を読み込んでキャッシュしておくことで、実際に画像を表示する際に素早く表示できる仕組みになっているわけです。

ですが、長いイベントの場合はイベントコマンドが200行以上になることもあり、そういう場合はどうなるのかというと、特に何もしてくれません。途中で200行目以降を追加で先読みしてくれるというようなことはなく、そのため、イベントの途中から画像表示のラグが目立つようになってきます。

このプラグインを使えば、先読みする行数をデフォルトの200行から、任意の行数に設定することができます。また、行数を0に設定すると、イベントの全行を対象に先読みするようになり、この使い方が普通かと思います。

ただし、1000行を超えるような非常に長いイベントの場合、全行を対象にすると、逆に最初の先読みに時間がかかってしまう可能性があります。特に通信速度が遅い環境だと、イベントの開始が明らかに遅くなるでしょう。長いイベントがある場合は、先読みの行数は200行くらいに抑えて、後で解説する「画像先読み」のプラグインコマンドを併用してみてください。

また、デフォルトでは先読みの対象が「文章の表示」の顔グラと「ピクチャの表示」のピクチャ画像だけですが、それに加えて「遠景の変更」の遠景画像と、「移動ルートの設定」の中の「画像の変更」で使われるキャラ画像も、先読みしてくれるようになっています。「遠景の変更」はあまり使用する機会がないかもしれませんが、遠景画像はサイズが大きいので効果も大きいです。

また、イベント開始時の自動的な先読み以外にも、任意のタイミングで任意の画像ファイルを先読みできるように、プラグインコマンドも用意しました。

プラグインコマンドの「画像先読み」を使用すれば、imgフォルダの下にある任意の画像ファイルを読み込ませることができます。自動的な先読みでは対応していない、タイルセット画像や戦闘背景の画像なども、これを使えば先読みさせることができます。

前述の非常に長いイベントの場合は、自動的な先読みは200行までにしておいて、途中で200行目以降に登場する画像ファイルをプラグインコマンドで先読みさせる、といったことが可能です。

質問やアドバイスなどはコメント欄まで、お気軽にお願いします。素材利用条件などについては、このサイトについての「提供素材について」の項目などをご覧ください。