RPGツクールMZ 【解決済み】Scene_Equipを直接読み込んだ時の挙動について

JackGames

ユーザー
MZのバージョンv1.10.0です。


スクリプトコマンドで、

SceneManager.push(Scene_Equip);
SceneManager.push(Scene_Item);

と読み込ませたとき、何故か初回だけ顔グラフィックが表示されません。
一度メニューを閉じ、再度開くことで顔グラフィックが読み込まれます。

これを解決する方法はないのでしょうか。



ちなみに、自作メニューでの使用を想定しており、
実際のスクリプトでは、
var actor = $gameParty.allMembers()[0];
$gameParty.setMenuActor(actor);
SceneManager.push(Scene_Equip);
と記載しています。



よろしくお願いいたします。


2026y03m10d_214302365.jpg
2026y03m10d_214336600.jpg
 
はじめまして。
 Scene_EquipScene_Itemを直接呼び出した時、顔グラフィックが表示されないとのことで、私は内部設計にそこまで明るくないため推測ではありますが、両者の仕様上は Scene_MenuBase を通過する前提で設計されているため、直接呼び出すと顔グラフィックの描画が間に合わないのではないかと思われます。
 また、利用想定は自作メニューとのことですが自作メニューの仕様がわからないため、今回は新規プラグインでの解決を試みます。検証環境は以下になります。

RPGツクールMZ(コアスクリプトv1.10.0)
ゲーム内マップ画面(Scene_Map)


 プラグインの新規作成については以下にまとめたので、わからない場合は[非表示]ボタンを押して展開してください。
1. 任意のテキストエディタを用意します(メモ帳でも可。その場合は編集後に拡張子を「js」に変更します)。

2. 新規のテキストファイルを作成します。

3. ファイル内に以下のようなテンプレートを入力します。「@」から始まる文字列はアノテーションと呼ばれる識別用の注釈です。個人利用であれば @target MZ だけでも十分です。アノテーションの詳細については『RPGツクールMZ』公式サイトを参考にしてください。


コード:
/*:ja
 * @target MZ
 * @plugindesc エディターで表示される説明を入力します。
 * @author プラグインの製作者(新規プラグインなので自分の名前を入力しましょう)
 * @url エディターからブラウザに飛べるリンクを作成します。日本語を含むURLは変換されて長くなります。
 * 
 * @help プラグインの設定画面でのヘルプ欄に表示する文章を入力します。機能の詳細などが一般的です。
 * 
 */

4. 以下のように JavaScript の即時実行関数式を入力します。 ※現在では主にプラグインの競合対策として一般的な方式ですが『RPGツクールMV』用の古いプラグインなどではその限りではないため、古いプラグインの利用時は注意が必要です。
JavaScript:
(() => {
    "use strict";

    // ここからコードを入力していきます。

})();

5. プラグインを作成する準備ができました!

 今回は処理の関係で顔グラフィックの描画が間に合わないと仮定して、シーンの開始時にウィンドウの更新処理を行います。まずは以下のアイテム画面用のコードをプラグイン用ファイルに入力します。
JavaScript:
    // 『RPGツクールMZ』のコードの応用。
    const _Scene_Item_start = Scene_Item.prototype.start;
    Scene_Item.prototype.start = function() {
        _Scene_Item_start.call(this);
        this._actorWindow.refresh();
    };
 アイテム画面の開始時に、回復アイテムなどを選択した際に表示されるアクターウィンドウを更新します。this._actorWindow.refresh()Window_MenuActor.prototype.refresh() の処理を行います。これによって直接 Scene_Item へ遷移した際にアクターウィンドウに顔グラフィックが表示されるようになります。

 次は以下の装備画面用のコードを入力します。
JavaScript:
    // 『RPGツクールMZ』のコードの応用。
    const _Scene_Equip_start = Scene_Equip.prototype.start;
    Scene_Equip.prototype.start = function() {
        _Scene_Equip_start.call(this);
        this._statusWindow.refresh();
    };
 処理内容はアイテム画面と似ていますね。こちらでは Window_EquipStatus の処理を行います。これによって直接 Scene_Equip へ遷移した際にアクターウィンドウに顔グラフィックが表示されるようになります。

 基本的には上記だけで問題の解決に至るかと思われます。
 ついでといっては何ですが、イベントコマンドの「スクリプト」を利用していた場合に代替可能なプラグインコマンドの作成方法も以下に記載しておきますので、必要であればお試しください。

1. まず、プラグインコマンドの実行に必要なアノテーションを追加します。
コード:
 * @command sceneItem_Start
 * @text アイテム画面に遷移
 * @desc アイテム画面に切り替えます。
 入力する場所は /* ~ */ で囲われたコメントの中でわかりやすい場所でよいです。一般的には @help の前であることが多い気がします。

2. 次に、コード内に定数を定義します。以下のコードを入力します。
JavaScript:
    // 新規のコード。
    const pluginName = 'SceneItemAndEquipDirect';
 pluginName が定数の名前で、クォーテーションで囲った文字列がプラグインのファイル名です。ファイル名について今回は「SceneItemAndEquipDirect」(.js)としています。入力する場所については即時実行関数式内の "use strict"; の次の行あたりでよいでしょう。

3. 最後に以下のプラグインコマンド用のコードを追加します。
JavaScript:
    // 『RPGツクールMZ』のコードの応用。
    PluginManager.registerCommand(pluginName, 'sceneItem_Start', () => {
        SceneManager.push(Scene_Item);
    });
 こちらでは引数に先ほど定義した定数とアノテーションで追加した @command の後ろの文字列を指定します。これによって以下の画像のようにプラグインコマンドを設定できるようになります。

2026-03-12-01.png


4. これでプラグインコマンドからアイテム画面への遷移が行えるようになりました!
1. 基本的に上記のアイテム画面と同じ流れです。まずはアノテーションを追加します。
コード:
 * @command sceneEquip_Start_SelectActor
 * @text 装備画面に遷移(パーティ並び順指定)
 * @desc パーティの並び順から指定して装備画面に切り替えます。
 * 
 * @arg actorId
 * @text パーティの並び順
 * @desc パーティの並び順を選択してください。0 = 先頭。
 * @default 0
 * @type number
 * @min 0
 こちらではプラグインコマンドにJackGames様が使用されているコードと同じ機能を持たせるため、引数のアノテーション @arg を追加しています。

2. プラグインコマンド用のコードを追加します。定数 pluginName については上記の「【上級】プラグインコマンドでアイテム画面に遷移する場合」を参照してください。
JavaScript:
    // 『RPGツクールMZ』のコードの応用。
    PluginManager.registerCommand(pluginName, 'sceneEquip_Start_SelectActor', (args) => {
        let actor = $gameParty.allMembers()[args.actorId];
        if (actor) {
            $gameParty.setMenuActor(actor);
        }
        SceneManager.push(Scene_Equip);
    });
 基本的にはアクターを指定して装備画面へ遷移する処理となっていますが、例えばパーティメンバーが4人だった場合に5人目を指定してしまうと undefined エラーとなってしまうため、存在しないメンバーの番号を指定した場合には一番最後に表示されたアクターが表示されるようになっています。
 これによって以下の画像のようにプラグインコマンドを設定できるようになります。

2026-03-12-02.png


3. これでプラグインコマンドから装備画面への遷移が行えるようになりました!

4. さらなる応用として変数で並び順を指定するやり方もあります。その場合、引数の @typevariable にし、let から始まる変数 actor$gameParty.allMembers()[$gameVariables.value(args.actorId)] を指定します(別途、イベントコマンド「変数の操作」が必要です)。
 
コメントありがとうございます。
お陰様で無事表示されるようになりました。
また、プラグインコマンドの応用まで教えていただきありがとうございます。

このプラグインを見ながらコアプラグインを見直したところ、ItemとEquipのみprototype.startの記載がなかったことで起こったことだと推察できました。また、別途でこのように追記しても動作するのだということも分かって勉強になりました。

プラグインコマンド作成の更なる応用など聞きたい事は山ほどありますが、脱線してしまいそうなので今回はこれで解決済みとさせていただきます。
ご協力ありがとうございました。
 
Back
トップ