【RPGツクールMZ】移動ルートでマップイベントやコモンイベントを実行する方法(2024/2/23 更新)
はじめに
ツクールMZでシューティングミニゲームを作っていた際、移動ルートのスクリプトからイベントを呼び出せるといいなぁと思って色々調べたり情報提供を頂いたので、ここに纏めておきます。
(情報提供者:あわやまたな氏)
大前提として
移動ルートスクリプトでイベント呼び出しをする際、マップイベントのスクリプトと決定的に違う点があります。
コモンイベントを直接呼び出すことが出来ない
です。
つまり、呼び出し元のイベントIDを保持することが不可能となります。
(マップイベントの呼び出しについては、元々保持されません)
この問題を解決しようとするとコアスクリプトの解析が必須になり、コアスクリプトの理解が浅い筆者だと解説不可なので、本記事では対象外としています。
(2024/2/23追記)
逆にイベント実行内容に移動ルートを設定する方法もあるみたいです。
マップイベントの呼び出し
呼び出し先のイベントが1ページのみ(呼び出し元も1つ)
$gameMap.event().start()を使えばオッケーです。
ツクール公式からも発信されている情報です。
呼び出し先のイベントのページがひとつだけならこれで解決します。
呼び出し先のイベントが1ページのみ(呼び出し元が複数)
複数のイベントをから呼び出す場合、呼び出し元にアニメーションを表示させるなど呼び出し元毎に処理を分けたい場合は、呼び出し元イベント毎に呼び出し先イベントを作成する必要があります。(理由は後述)
例)呼び出し元Aには呼び出し先A、呼び出し元Bには呼び出し先Bを呼ぶようにする
呼び出し先が複数ページある
$gameMap.event().start()だと、
指定イベントの有効なページのうち、最もページ番号が大きい所のイベント処理を自動で取得してくるようになっています。(マップイベントを調べた時の挙動と同じです)
その為、任意のページを呼び出そうとする場合は
呼び出しイベントのページ管理をスイッチか変数で管理する
呼び出し元で呼び出すページを指定する
のどちらかの対応が必要になります。
1はイベント内で有効なページが1つだけになるように、スイッチや変数でページ管理をする方法です。
2はイベント呼び出し直前に呼び出し先ページを変数にセットし、呼び出し先のイベント内で変数値に応じて呼び出すページを切り替える方法です。
1は複数イベントを同時に動かそうとすると、大量のスイッチor変数を状況に応じて値を設定していく必要があるため、管理が面倒なのでオススメしません。
2の方法もスイッチや変数を使わないのかというと、そうではありませんが1よりも管理が楽だと思います。
ただ、手順がちょっとややこしいので順を追って説明します。
1.下記プラグインを導入する
このプラグインはマップイベントの呼び出しの際、ページ指定して呼び出す機能を提供してくれます。
2.イベント呼び出し直前に変数に呼び出すページ番号を格納する
変数格納のスクリプトの値は下記の通りに対応しています。
$gameVariables.setValue([保存する変数番号], [ページ番号]);
この処理の後に、$gameMap.event().start()で対応する中継イベントを呼び出せばオッケーです。(中継イベントについては後述)
※ 注意 ※
同じマップで複数イベントを同時に動かす場合、変数を使い回すと同時に呼び出された際に競合して処理が上書きされてしまい、バグ発生の元になる為、呼び出し元の数だけ変数の定義が必要です。(呼び出し元と変数の関係が1対1になるようにする)
例)呼び出し元Aには変数1、呼び出し元Bには変数2…
3.中継イベントを作成する
$gameMap.event().start()だとページ指定が出来ないので、移動ルートから呼び出した中継イベントで、呼び出すマップをページ指定して呼び出します。
多分ワケわからないと思うので、図にしておきます。
こうして中継イベントを挟むことで、擬似的に移動ルート内でマップイベントを実行させることが可能になります。
※ 注意 ※
手順2の変数と同じく、中継イベントも呼び出し元と1対1の関係になるように作成して下さい。
例)呼び出し元Aには中継イベントA、呼び出し元Bには中継イベントB…
4.中継イベントに処理を書き込む
中継イベントに下記のコマンドを入れます。
トリガーは「自動実行」「並列処理」以外を選んで下さい。
単純にプラグインコマンドで呼び出したいイベントを、ページ指定で呼び出しているだけです。
念のため、設定値について解説しておきます。
イベントID:呼び出したいイベントIDを入れて下さい(変数指定可)
イベント名:名前で呼び出したい場合はこちらを利用
ページ番号:手順2で設定した変数番号を指定して下さい
後は呼び出し先のイベントを作成して、実行したい内容を入れるだけで完了です。
※ 注意 ※
呼び出し先のイベントで、呼び出し元のイベントに応じて処理を分けたい場合は『呼び出し先のイベントが1ページのみ(呼び出し元が複数)』を参考に、呼び出し元と呼び出し先が1対1になるようにして下さい。
コモンイベントの呼び出し
『呼び出し先が複数ページある場合』の手順と同じです。
中継イベントの処理を、呼び出したいコモンイベントに差し替えればオッケーです。
※ 注意 ※
呼び出し元ごとに処理を分けたい場合は、呼び出し元と呼び出すコモンイベントを1対1になるようにする必要があります。
(それって、コモンイベントである意味があるのか…?)
補足解説
呼び出し元と1対1の関係になるように定義しているのは、呼び出し元のイベントIDが保持されないので、複数の呼び出し元から呼ばれた時にどのイベントから呼び出されたか判定出来ないからです。
また、中継イベントなんて使わず、移動ルートスクリプトで直接プラグインコマンドを呼び出せば良いだろうと思った方もいらっしゃると思いますが、呼び出し中の処理でエラーが出るので、中継イベントから呼び出す形を取っています。
実行コマンド例)
PluginManager.callCommand(this, 'NRP_CallEvent' , 'CallMapEvent', {"EventId": '14', "PageNo": '2'});
マップイベントのスクリプトからだと正常に動くため、移動ルートスクリプトとの仕様の違いが原因だと思われます。
直接呼び出す方法をご存じの方がいらっしゃれば教えて下さい。
おわりに
移動ルートとマップイベントのスクリプトの仕様は一緒だと思っていたので、この仕様の違いは驚きでした。
ここで紹介している方法は保守性に欠ける為、呼び出し元イベントが100個とかになるとメンテナンスが大変になります。
しかし、現状はこれ以外で対応できる方法が見つかりません。
移動ルートスクリプトから直接コモンイベントを呼び出すことが出来てかつ、呼び出し元のイベントIDが保持出来るプラグインが欲しい…