【RPGツクールMV/MZ】マップ単位でキャラクターを自動切り替えするプラグイン UM_MapActorSetting.js

2024/10/282025/04/09ゲーム開発RPGツクール

RPGツクールMVRPGツクールMZで、複数の主人公が登場したり、特定のマップでは特定のキャラクターを操作したりするようなゲームを作りたいと思ったことはありませんか?

通常、マップごとに操作キャラクターを切り替えるには、マップ遷移イベントや場所移動イベントの中に「パーティリーダーの変更」コマンドを配置する必要があります。しかし、対象となるマップが多い場合、この方法は以下のような課題があります。

  • マップごとにイベントを設定・コピーする手間がかかる
  • 設定漏れやキャラクターの指定ミスなど、バグの原因になりやすい。
  • どのマップでどのキャラクターがリーダーになるのか、後から確認・管理するのが大変

これらの課題を解決するために、マップのメモ欄に簡単なタグを記述するだけで、そのマップに入った際に自動的に指定したキャラクターに操作を切り替えるプラグイン「UM_MapActorSetting.js」を作成しました。

この記事では、この自作プラグインの機能、導入方法、設定手順、そして具体的な使用例について解説します。イベントコマンドを使わずに、もっと手軽にキャラクター切り替えを実装したい方におすすめです。

マップ移動時に自動で操作キャラクターが切り替わる様子

この記事の内容

  1. プラグインの概要とメリット
  2. プラグインのインストール方法
  3. 基本的な設定手順 (パラメータとマップメモ)
  4. 具体的な使用例 (勇者と姫の切り替え)
  5. 使用上の注意点
  6. プラグインコード (UM_MapActorSetting.js)

プラグインの概要とメリット

前述の通り、RPGツクールMV/MZでマップごとに操作キャラクターを切り替える標準的な方法は、イベントコマンド「パーティリーダーの変更」を使用することです。しかし、この方法はマップ数が多くなるほど設定が煩雑になり、管理も大変です。

UM_MapActorSetting.js プラグインは、この問題を解決するために開発されました。

主な機能とメリット:

  • マップのメモ欄で指定: どのマップでどのキャラクターを操作させるかを、各マップの「メモ」欄に簡単なタグ(例: ``)で指定します。
  • 自動切り替え: プレイヤーがメモタグを設定したマップに移動すると、プラグインが自動的にパーティの先頭キャラクター(操作キャラクター)を指定されたアクターに入れ替えます。
  • イベント不要: マップごとに切り替え用のイベントを作成・配置する必要がなくなります。
  • 設定がシンプル: プラグインパラメータで「識別子」と「アクターID」を紐付け、マップメモに識別子を書くだけなので、設定が簡単で、後からの確認や変更も容易です。

これにより、複数キャラクターを切り替えるゲームの開発がよりスムーズになります。

プラグインのインストール方法

プラグインの導入は簡単です。

  1. この記事の最後にあるプラグインコードをコピーし、テキストエディタ(メモ帳など)に貼り付けて、ファイル名を `UM_MapActorSetting.js` として保存します。
  2. 作成した `UM_MapActorSetting.js` ファイルを、あなたのRPGツクールプロジェクトフォルダ内の `js/plugins` フォルダに配置します。
  3. RPGツクールエディタを開き、「ツール」メニューから「プラグイン管理」を開きます。
  4. プラグインリストの空いている行をダブルクリックし、「名前」のドロップダウンから `UM_MapActorSetting` を選択し、「状態」を「ON」にして「OK」をクリックします。
RPGツクールMV/MZのプラグイン管理画面でUM_MapActorSettingを有効化

これでプラグインが有効になりました。

基本的な設定手順 (パラメータとマップメモ)

次に、プラグインが正しく動作するように設定を行います。

プラグインパラメータの設定

まず、マップのメモ欄で使う「識別子(任意の文字列)」と、実際に切り替える「アクター(キャラクター)」を紐付けます。

  1. プラグイン管理画面で `UM_MapActorSetting` をダブルクリック(または選択してEnter)し、右側の「パラメータ」欄を開きます。
  2. 「ActorSettings」(アクター設定リスト)という項目をダブルクリックします。
  3. リストの空いている行をダブルクリック(または下の「+」ボタン的なものを操作)して、新しい設定を追加します。
  4. 追加した行で、以下の2つの項目を設定します。
    • Character ID (キャラクターID): マップのメモ欄で使用する任意の識別子(半角英数字推奨、例: `hero`, `princess`, `actor1` など)を入力します。
    • Actor (アクター): 右側のプルダウンメニューから、この識別子に対応させたいアクターをデータベースから選択します。
  5. 切り替えたいキャラクターの数だけ、この設定を追加します。
  6. 設定が終わったら「OK」をクリックして閉じます。
プラグインパラメータActorSettingsの設定画面を開く
Character IDとActorを設定する

マップメモの設定

次に、操作キャラクターを切り替えたいマップ側で設定を行います。

  1. RPGツクールエディタで、操作キャラクターを自動で切り替えたいマップを開きます。
  2. マップ編集画面で、マップ名を右クリック(または編集モードでマップを選択)し、「マップ設定」(または「マップのプロパティ」)を開きます。
  3. 右下にある「メモ」欄に、以下の形式でタグを記述します。
    <Player:識別子>

    識別子 の部分には、プラグインパラメータで設定した「Character ID」を正確に入力します。(例: `<Player:hero>`)

  4. 設定したら「OK」をクリックして閉じます。
マップ設定のメモ欄にタグを記述する

これで、プレイヤーがこのマップに移動してきた際に、<Player:識別子> タグで指定された識別子に対応するアクターが、自動的にパーティの先頭(操作キャラクター)になります。

具体的な使用例 (勇者と姫の切り替え)

例として、「アクターID: 1」が「勇者」、「アクターID: 2」が「姫」としてデータベースに登録されているとします。

1. プラグインパラメータの設定:

プラグイン管理画面で以下のように設定します。

勇者(hero)と姫(princess)のパラメータ設定例
  • 設定1:
    • Character ID: hero
    • Actor: 0001: 勇者 (データベースのアクターID 1)
  • 設定2:
    • Character ID: princess
    • Actor: 0002: 姫 (データベースのアクターID 2)
プラグインパラメータ設定後のリスト表示

2. マップメモの設定:

例えば、2つのマップに対して以下のようにメモを設定します。

  • マップ1(勇者の街)のメモ欄:
    <Player:hero>
  • マップ2(お城)のメモ欄:
    <Player:princess>

結果:

  • プレイヤーが「勇者の街」マップに入ると、操作キャラクターが自動的に「勇者」になります。
  • プレイヤーが「お城」マップに入ると、操作キャラクターが自動的に「姫」になります。
マップ移動でキャラクターが切り替わるデモ

このように、イベントコマンドを一切使わずに、マップごとの操作キャラクター切り替えを実現できます。

使用上の注意点

  • キャラクターの切り替えは、マップ遷移時(場所移動コマンド実行後など)とゲームロード時に自動的に行われます。
  • マップのメモ欄に記述するタグ <Player:識別子> の「識別子」部分は、プラグインパラメータで設定した「Character ID」と完全に一致させてください。大文字・小文字も区別されます。記述を間違えると切り替えは機能しません。
  • プラグインは、指定されたアクターをパーティの先頭に入れ替える(元々いた場合は先頭にし、いなければ追加して先頭にする)シンプルな動作をします。パーティメンバー全体の入れ替えや並び順の制御は行いません。もし元々パーティにいないアクターを指定した場合、そのアクターがパーティに追加されてリーダーになります。(元のリーダーはパーティから外れます)
  • データベースで新しいアクターを追加・変更した場合や、プラグインパラメータの「Character ID」を変更した場合は、必ずプラグインパラメータの設定も更新してください。
  • 他のパーティメンバー変更系プラグインと競合する可能性はあります。併用する場合はご注意ください。

プラグインコード (UM_MapActorSetting.js)

このプラグインコードはご自由にお使いください。改変なども問題ありません。


//=============================================================================
// UM_MapActorSetting
//=============================================================================

/*:
 * @plugindesc マップのメモタグに基づいて、自動的にプレイヤーキャラクターを切り替えます。
 * @author UHIMA
 *
 * @param MapActorSettings
 * @text アクター設定
 * @type struct<ActorConfig>[]
 * @desc 各アクターの設定
 *
 * @help
 * ============================================================================
 * ■ 概要
 * ============================================================================
 * このプラグインは、マップのメモタグに基づいて自動的にプレイヤーキャラクターを
 * 切り替えることを可能にします。
 *
 * ============================================================================
 * ■ 使用方法
 * ============================================================================
 * プレイヤーキャラクターを切り替えたいマップには、以下のメモタグを追加してください:
 *
 * <Player:characterId>
 *
 * プラグインパラメータで「データベース」のアクターIDとキャラクター名を紐づけることができます。
 * これにより<Player:harold>のような簡易的な記述でアクターを切り替えることができます。
 * 新規キャラクターを追加した場合やアクターIDを変更した場合は、このプラグインの紐づけも対応させてください。
 *
 * 例:
 * <Player:harold>
 */

/*~struct~ActorConfig:
 * @param Character ID
 * @text キャラクターID
 * @type string
 * @desc マップメモタグで使用する識別子(例:harold)
 *
 * @param Actor
 * @text アクター
 * @type actor
 * @desc 切り替えるアクター
 */

(function () {
  var parameters = PluginManager.parameters("UM_MapActorSetting");
  var MapActorSettings = JSON.parse(parameters["MapActorSettings"] || "[]").map(
    (setting) => JSON.parse(setting)
  );

  var _Game_Player_performTransfer = Game_Player.prototype.performTransfer;
  Game_Player.prototype.performTransfer = function () {
    _Game_Player_performTransfer.call(this);
    switchActorByMap();
  };

  function switchActorByMap() {
    if ($dataMap && $dataMap.meta.Player) {
      var characterId = $dataMap.meta.Player;
      var actorConfig = MapActorSettings.find(
        (config) => config["Character ID"] === characterId
      );

      if (actorConfig) {
        var newActorId = Number(actorConfig.Actor);
        var currentLeader = $gameParty.leader();
        var currentLeaderId = currentLeader ? currentLeader.actorId() : null;

        if (currentLeaderId !== newActorId) {
          if (currentLeaderId) {
            $gameParty.removeActor(currentLeaderId);
          }
          $gameParty.addActor(newActorId);
          $gamePlayer.refresh();
        }
      }
    }
  }

  var _Scene_Map_start = Scene_Map.prototype.start;
  Scene_Map.prototype.start = function () {
    _Scene_Map_start.call(this);
    switchActorByMap();
  };
})();

この記事をシェアする