UhiyamaLAB個人開発者の創作備忘録

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

2024/10/282024/11/14ゲーム開発RPGツクール

複数のキャラクターを切り替えながら進むRPGを作りたい方へ向けて、マップごとに操作キャラクターを自動的に切り替えるプラグインを作成しました。

  1. 概要説明
  2. プラグインのインストール
  3. 基本設定
  4. 具体的な使用例
  5. 注意点
  6. プラグインコード

1. 概要説明

RPGツクールMVでは、複数のキャラクターを切り替えて操作する機能を実現するために、通常は「パーティリーダーの変更」イベントを各マップに配置する必要があります。しかし、この方法には以下のような問題があります:

  • マップごとにイベントを配置する手間がかかる
  • キャラクター不一致などのバグが発生する可能性がある
  • 設定内容の確認や管理が煩雑

このプラグインでは、マップのメモ欄に簡単な記述をするだけで、自動的に操作キャラクターを切り替えることができます。

2. プラグインのインストール

  1. プラグインファイルをjs/pluginsフォルダに配置
  2. プラグイン管理画面でUM_MapActorSettingを有効化

UM_MapActorSettingの導入

3. 基本設定

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

プラグインパラメータで、アクターIDとキャラクター名を紐づけます:

  1. プラグイン管理画面でUM_MapActorSettingのパラメータを開く
  2. ActorSettings+ボタンを押して新しい設定を追加
  3. 以下の項目を設定:
    • Character ID: マップメモで使用する識別子(例:hero)
    • Actor: データベースに登録されているアクターを選択

マップメモの設定

切り替えたいマップのメモ欄に以下のタグを記述:

<Player:識別子>

4. 具体的な使用例

例えば、「勇者と姫」が登場するRPGで以下のような設定ができます:

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


キャラクターA
- Character ID: hero
- Actor: 1(勇者)

キャラクターB
- Character ID: princess
- Actor: 2(姫)

2. マップメモの設定:

マップ1: <Player:hero>
マップ2: <Player:princess>

これにより:

  • マップ1では自動的に勇者が操作キャラクターになる
  • マップ2では自動的に姫が操作キャラクターになる

5. 注意点

  • マップ遷移時に自動的にキャラクターが切り替わります
  • セーブ&ロード時も正しく切り替わります
  • メモタグの記述を間違えると切り替えが機能しないので、識別子は正確に入力してください
  • 新しいアクターを追加した場合は、プラグインパラメータの設定も忘れずに行ってください

6. プラグインコード

下記プラグインはご自由に利用・改変等してください。


//=============================================================================
// 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();
  };
})();

この記事をシェアする