事前のお知らせ

RPGツクールMZ 攻略本レベル5 プラグインの作り方

RPGツクールMZ・MVプラグインの作り方入門その6:スイッチに応じてゲームオーバーの処理を変更(プラグインパラメーター)

前回の記事では、メモタグを活用して、敵キャラ毎に消滅音を指定するプラグインを作りました。
RPGツクールMZ・MVプラグインの作り方入門その5:敵キャラ毎に消滅音を変更(メモタグ)

今回の目標(スイッチに応じてゲームオーバーの処理を変更)

筆者が初めて作ったプラグインです。
ツクマテでリクエストがあったのを見て「作れそうだな」と思ったので、手を付けたのがきっかけです。

一部のマップでゲームオーバーになっても、流れていたBGMを そのまま流し続けるようにしたい
tm.lucky-duet.com/viewtopic.php?t=8915

第一印象は「一部のマップってマップIDで管理するのめんどくさすぎだろ…」と考え、「指定スイッチがONの時だけ動作が変われば良い」と判断しました。

動作の仕様を決定

指定スイッチがONの時だけ、そのマップで流れているBGMが流れ続けます。
OFFの時は、通常のゲームオーバーのBGMが流れます。

検索するキーワードの選定

これは考えなしに「gameover」で検索しました。

関数を探す

「playGameoverMusic」これでしょ!
プラグインテンプレートに貼り、console.logを入れます。

(() => {
    "use strict";

    Scene_Gameover.prototype.playGameoverMusic = function () {
        AudioManager.stopBgm();
        AudioManager.stopBgs();
        AudioManager.playMe($dataSystem.gameoverMe);
        console.log($dataSystem.gameoverMe);
    };

})();

ファイル名を決める

今回は、最終的にプラグインパラメーターで動くようにする予定なので、ファイル名を決めておきます。
(後からでも変えられます)
「SwitchGameoverMusic.js」とします。

マップイベントに
◆ゲームオーバー
を設定し、テストします。

テストプレイを実行し、F8(またはF12)キーを押して、コンソールを表示しておきます。
イベントを実行すると下記のようなログが出ます。

SwitchGameoverMusic.js:8
{name: "Gameover1", pan: 0, pitch: 100, volume: 90}

これは、今回入れた「$dataSystem.gameoverMe」の中身がこのようなデータであることを示しています。
前記事でSEを再生させた時の形式と同じですね。

元のコードを眺めると、BGMなどを止めてから、ゲームオーバーのME(ミュージックエフェクト)を流しているようです。
ここをスイッチで分岐して、動作を分ければ良いでしょう。

条件分岐を追加する

まず、スイッチをどう書くのかを調べます。
「RPGツクールMV スクリプト スイッチ」で検索します。
すると、そのまんまの記事が出てきました。

ツクールMVのスクリプトで条件分岐を行う方法
rpgmaker-script-wiki.xyz/condition_mv.php

サンプルコードを使ってプラグインを書き換えます。

(() => {
    "use strict";

    Scene_Gameover.prototype.playGameoverMusic = function () {
        console.log('$gameSwitches.value(3)');
        console.log($gameSwitches.value(3));
        if ($gameSwitches.value(3)) {
            //何もしない
            console.log('何もしない');
        } else {
            AudioManager.stopBgm();
            AudioManager.stopBgs();
            AudioManager.playMe($dataSystem.gameoverMe);
            console.log($dataSystem.gameoverMe);
        }
    };

})();

ここはJavaScriptの基本知識が必要になります。

「JavaScript if」で検索すると下記の記事が出てきます。
developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else

MDNはJavaScriptを網羅したリファレンス的存在だと思ってください。
このサイト内でも検索できますが…筆者はあまり上手く検索できたことがありません。
Googleで検索してMDNの記事を探したほうが上手く見つかっている気がします。

if文の情報に戻ります。
リンク先の記事の通り、if(xxx)のxxxの中の条件が満たされた場合、直後の{}内の処理が実行され、満たされなかった場合、else{}内の処理が実行されます。
今回はスイッチがONだとtrueを返すので、このような書き方になります。
つまり、スイッチがONの時はBGM等を止めずに、ゲームオーバーのMEも流さない事になります。
逆に、スイッチがOFFであれば、通常のゲームオーバーの動作をします。

それではスイッチID3をONの時とOFFの時で、コンソールの出力やBGMが変わっているのかテストしましょう。

上手く動作しましたね。

リファクタ(コード改善)と 競合対策(重複コードをフック)

連載を続けて読んでいる方には、おなじみの同じ挙動をプラグインに残さないフックの処理と、少しコードを簡易にするリファクタをします。

まず、リファクタをします。
if文の条件について学びます。

developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators#Logical_operators

論理否定 (NOT) (!)
!expr
単一の被演算子を true と見ることができる場合は、false を返します。そうでない場合は true を返します。

今回はこれを利用するとelseが省略できます。

(() => {
    "use strict";

    Scene_Gameover.prototype.playGameoverMusic = function () {
        if (!$gameSwitches.value(3)) {
            AudioManager.stopBgm();
            AudioManager.stopBgs();
            AudioManager.playMe($dataSystem.gameoverMe);
        }
    };

})();

スイッチがOFFの場合のみ{}の中が実行され、それ以外の時は何もしなくなります。
片方が何も実行しない場合、このようにして順番を入れ替えるとコードが短く情報の整理されます。

次にフックです。

(() => {
    "use strict";

    const _Scene_Gameover_playGameoverMusic = Scene_Gameover.prototype.playGameoverMusic;
    Scene_Gameover.prototype.playGameoverMusic = function () {
        if (!$gameSwitches.value(3)) {
            _Scene_Gameover_playGameoverMusic.call(this);
        }
    };

})();

機能としては完成です。

プラグインパラメーターの追加

スイッチIDをプラグインパラメーターで指定できるようにします。

$gameSwitches.value(3); の3だけをパラメーターから変更できれば、これが可能になります。
最初に完成形を出し、それを情報の整理します。

/*:
 * @target MZ MV
 * @plugindesc 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
 * 
 * @param Game Over Switch Id
 * @text 発動スイッチ
 * @type switch
 * @desc 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
 * @default 0
 * 
 * @help
 * 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
 */

(() => {
    "use strict";

    const pluginName = 'SwitchGameoverMusic';
    const parameters = PluginManager.parameters(pluginName);
    const gameOverSwitchId = Number(parameters['Game Over Switch Id']);

    const _Scene_Gameover_playGameoverMusic = Scene_Gameover.prototype.playGameoverMusic;
    Scene_Gameover.prototype.playGameoverMusic = function () {
        if (!$gameSwitches.value(gameOverSwitchId)) {
            _Scene_Gameover_playGameoverMusic;
        }
    };

})();

プラグインパラメーターの情報

 * @param Game Over Switch Id
 * @text 発動スイッチ
 * @type switch
 * @desc 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
 * @default 0

この部分は
/*:
*/
の間にある必要があります。
ひと塊になっていれば、項目の順番はあまり関係ないようです。
(多分、一番上に@paramがあれば、あとは自由みたいです)

「@param」はパラメーター名です。
同一プラグインの中でユニーク(他と被らない)ものを設定すれば何でも良いですが、現状は半角英数字を使うのが一般になっています。

「@text」はプラグインパラメーターの設定画面での表示テキストです。
省略可能です。

「@type」はこのパラメーター内容を変更する時の挙動を決めます。
今回はスイッチ選択画面を出すために「switch」にしてあります。
省略可能ですが、ないと通常のテキストを入力するフォームになってしまい、スイッチIDを数字で入力することになります。

「@desc」は説明文です。
プラグインパラメーター変更画面を開くと下部に表示されるテキストです。
省略可能です。

「@default」はプラグインを入れた時に、自動的に設定される値です。
省略可能です。

プラグインパラメーターを変数にして取り込む

    const pluginName = 'SwitchGameoverMusic';
    const parameters = PluginManager.parameters(pluginName);
    const gameOverSwitchId = Number(parameters['Game Over Switch Id'] || 0);

この3行でプラグインパラメーターをプラグイン内の変数として取り込んでいます。

これを1行にすると下記のようになります。
(動作確認していませんが、多分…大丈夫)

const gameOverSwitchId = Number(PluginManager.parameters('SwitchGameoverMusic')['Game Over Switch Id'] || 0);

可読性が悪く、プラグインパラメーターが増えてゆくと、とても面倒になりミスが多くなるので、最初のような書き方が一般的になってきています。
pluginName はプラグインコマンドにも使う事もできるので、この慣習には従ったほうが良いと思います。

「pluginName」に続いて''で括った文字列がファイル名です。
ここはファイル名を指定する必要があります。
ファイル名を指定する理由を知るには、プラグインパラメーターの設定値がどこに、どのように保存されているのかを知る必要があります。

プロジェクトフォルダ/js/の中に「plugins.js」というファイルがあるので、開いてみましょう。

// Generated by RPG Maker.
// Do not edit this file directly.
var $plugins =
[
{"name":"SwitchGameoverMusic","status":true,"description":"","parameters":{"Game Over Switch Id":"1"}}
];

このようにプラグインファイル名に続いて、保存データが書かれます。
パラメーターの保存インデックスとなる"name":"SwitchGameoverMusic"はファイル名から取得されているので、データを参照の紐付けに統一する必要があります。
これはツクールの仕様ですが、プラグインフォルダ内に同じファイル名は存在できないため、インデックスが重複する事故が防げるというわけです。

プラグインパラメーターで取得したデータをコードに入れる

        // if (!$gameSwitches.value(3)) {
        if (!$gameSwitches.value(gameOverSwitchId)) {

テストでスイッチIDを3にしていた箇所を、プラグインパラメーターで取得した「gameOverSwitchId」に書き換えてあります。
これで、プラグインパラメーターで指定したスイッチID番号が代入されます。
これには前準備で、パラメーターの文字列を数値に変換しておく必要があります。

その処理が下記です。

const gameOverSwitchId = Number(parameters['Game Over Switch Id'] || 0);

これはパラメーター名「Game Over Switch Id」をNumber()で括ることで数値に変換しています。
その後ろの「 || 0」は、間違って無効なデータが入っていた(何も入っていない)場合、0(デフォルト値)にするという処理です。
「 || 0」は省略できますが、保険に入れておいたほうが良いでしょう。

完成品

色々GitHubを情報の整理している時に、消しちゃいました(笑)
今回作り直したものを、再掲載しておきます。

fungamemake.com/archives/12432

他のプラグインパラメーター情報

これは奥が深いので、ここでは関連情報だけを書いておきます。

別の記事で、タイプ別の取り込み方の情報を整理します。

次のステップ

プラグインコマンドを作ります。
仕様を把握し、JavaScriptでツクールのゲームデータを引き出したり、配列を操作する初歩に触れます。

RPGツクールMZ・MVプラグインの作り方入門その7:プラグインコマンドの作り方(JavaScriptの配列)

スポンサードリンク

スポンサードリンク

-RPGツクールMZ, 攻略本レベル5 プラグインの作り方

Copyright© RPGツクールMZ・MV初心者的備忘録 - ムノクラのメモ帳 , 2021 All Rights Reserved.