⚔️

テンプレートイベントプラグインを極める

2021/08/31に公開

『RPGツクールMZ』関連記事 目次

さてこれは『RPGツクールMZ』のプラグイン解説記事です。
ここで興味を失った人はさっさと帰るが良いでございますよ!!(ウルトラマンZ話法)

トリアコンタンさんのプラグインがあれば、他のプラグインは要らない!!
とまでは思ってませんが、誰か一人作者を選ぶとすればトリアコンタンさんになるかと思います。
てなわけで『カスタムメニュー作成プラグインを調べてみた』に引き続き、トリアコンタン謹製プラグインを調べていきます。

今回は TemplateEvent.js (テンプレートイベントプラグイン) です。
使っている人は「神プラグイン」と賞賛し、使ってない人は「なんか意味わからん」などと言われがちな TemplateEvent.js。
個人的には、類似する機能は本体にあるべきだと思ってるぐらいのナイスプラグインです。

TemplateEvent.js とは

プラグインヘルプ読めやぁ!
で済むなら話は簡単ですが、あそこに書いた内容だけで伝えるのはなかなか至難の技です。
適用したゲーム画面の画像を用意したり説明図を用意したりしても伝わらないのが現実です。

ヘルプを読むのはもちろんですが、読んでないのなら本家トリアコンタンさんのページを読むと良いでしょう。
『RPGツクールMV』版の解説ですが、基本は一緒です。

ヘルプと解説ページ読んで理解できましたか?できた?おめでとうございます。もうこのあと読む必要はありません。
ウルトラ察しのいいあなたは、とっとと回れ右してゲームを作るが良いでございますよ(ウルトラマンZ話法)

では「なんだかピンとこないなぁ」と思ったあなたはお友達です。
僕もなかなかピンときませんでした。

複数の箇所から呼び出して同じものを使いまわせるという意味では[コモンイベント]とテンプレートイベントは同じです。
[コモンイベント]は[実行内容]だけ独立した[イベント]ですが、テンプレートイベントは[イベント]の[実行内容]以外の[画像]なども含めて丸ごと使いまわせる、という点が大きな違いです。

テンプレートイベントはコモンイベントとイベントの中間的機能と言えるでしょうし、コモンイベントの機能強化版と捉えることもできるでしょう。
とにかく1個作ったイベントをあっちこっちで使いまわせるので、超便利。
さらにマップ上の位置および名前で管理できるので、標準の[コモンイベント]より使い勝手がいい面もあります。
パソコンのファイルシステムっぽくフォルダに配置するノリでいけますし、『RPGツクールMZ』は素晴らしいことにイベント一覧もついているのでリスト形式で見ることもできます。

宝箱や扉、店などコンテクストメニュー(いわゆる右クリック)で作れる頻出イベントがありますが、あれで作ってしまうと扉に共通の変更を加えようと思った時に全扉イベントの修正が必要になります…つらい、制作挫折(エターナル)まっしぐらです。
でもそんな心配はもう不要! そう、テンプレートイベントプラグインがあるからねっ!!

これからやたら登場するのでテンプレートイベントはTEと略します!

TEを使う準備をしよう

[コモンイベント]を使うには[データベース]-[コモンイベント]で定義しておく必要があります。
同様にTEを使うにも定義が必要です。
[データベース]にはそのような項目はないので、特定のマップの[イベント]をTEとして使用することで[データベース]代わりとします。
それを設定するのが TemplateEvent.js の[プラグインパラメータ]にある[テンプレートマップID]です。
とりあえずテキトーにマップを作ってIDを登録しましょう。
必要なのはマップのIDなので名前は分かりやすく "テンプレートイベント" とか "テンプレートマップ" とつけておけばいいと思います。

実際に表示されることはないマップなので、マップサイズその他設定はお好きに。
ただし、ここで使った画像や音楽はゲームに必要な素材として組み込まれるので、うかつに飾り立てると容量増加の原因になるので注意です。シンプルに!

TEを作る

最初から「TE作るぞー!」って感じで作るのは、慣れないうちは難しいと思います。
ただし特別なことをする必要はなくて、普通に[イベント]を作ってて「あれ?これおんなじヤツ前も作ったぞ」と思った時に、テンプレートマップに[イベント]をコピーすれば、はいできあがりです。
えっ?そんだけ?って思うでしょうが、そんだけです。

ちなみに[イベント]を選択して、[切り取り ⌘X]や[コピー ⌘C]で文字とかと同じようにコピーして、テンプレートマップの適当な場所を選択して[貼り付け ⌘V]です。
この操作って意外と気づかなかったりしますよね。だってマップのタイルの方じゃ普通のコピーできないでしょ。[イベント]もできないのかと思っちゃうじゃないですか。
僕なんかしばらく似たようなイベント作るにもイチから作ってましたし「画面に表示されてないところに動かすのめんどくさいなー」とか思いながらドラッグだけで[イベント]を動かしてましたよ。
カット&ペーストの方がキーボードとマウスを併用できるし、なんならキーボードだけでもできるから移動が楽なのに。
そして別マップ間や別プロジェクト間ですら移動できるということに気づくのはさらに後のことなのでした。
蛇足だけど、プレイヤーや乗り物もカット&ペーストOKです。

TEを呼び出す

TE自体を通常のマップで使うことはなく、TE呼び出し[イベント]を作ることでゲーム実行時に自動的にTEに丸ごと入れ替えられます。
実はこれも簡単。
通常のマップに置いた[イベント]のメモ欄に <TE:TE名> と書くだけ。
<TE:TEのID> でもいけますし、<TE:\v[n]> と変数を使うこともできちゃいます。
色々方法はあるとはいえ <TE:TE名> と名前使うのが一番分かりやすいですね。数字じゃなんだかわからないし、名前だったら日本語も使えますから一目瞭然です。


テンプレートイベントプラグインでは、通常マップに置くTE呼び出しイベントを「固有イベント」と呼んでいますので、以後そう書きます。

入れ替わるのはどの部分か

さて、次に気になるのは、どっからどこまで入れ替わるのかです。
基本的には[実行内容]はもとより[画像][名前][メモ][移動ルート]などなどTEに丸っと入れ替わるんですが、位置だけは固有イベントのものが使われます。
とはいえ、完全に空っぽだとマップエディタで作業する時に分かりにくいので、画像は何か指定しておいてもいいでしょう。
TEアイコンを "img/characters/" か "img/tilesets/" の画像に用意しておくのもいいと思います。このへんはお好みで。


左が編集中の画面で、右が実行中の画面です(右はプラグインで拡大したり影つけたりしてます。説明だからシンプルなのにしなきゃいけないんですけど、ははは)
特に機能的な意味はないのでTEと同じ画像を設定しても見た目が分かりやすくていいと思います。
ただ固有イベントからTEを呼んでることを忘れて「なんで設定が反映されないんだろう」と悩んじゃったりしちゃうので、そこは注意です。

TEを読んだ[イベント]がセーブされた場合もロードして初期状態に戻ったりせず、そのまま続きからプレイできます。
要するに、セーブされることを意識して何か対処する必要はありません。
ただしマップイベントの設定を書き換えてからロードすると前の状態がロードされるので、一度マップを切り替えたりして確認する必要があります。
これは別にテンプレートイベントプラグインに限った話ではなくて、マップイベントの修正全般で気をつけることですけど。

入れ替えさせたくない場合は?

そうは言っても、シンボルエンカウントが全部同じキャラというのも…というようなこともあると思います。

固有イベントのメモ欄に <TE上書き> または <TEOverRide> と書くことで、[画像]、[向き]、[自律移動]、[オプション]、[プライオリティ]、[トリガー]の値が、位置と同様に固有イベント側が使われます。
上書きというと直感と逆な感じがしますが、処理上はテンプレートイベントをコピーした後に元のイベントの情報を上書きしているみたいです。


こんな感じに固有イベントに <TEOverRide> を書いておくと、固有イベントの画像を使うことができます。
<TE上書き> ではなく <TEOverRide> を使っているのは、たまたまヘルプから最初にコピーしたのが英語だっただけです。
ただ、今となっては日本語の方が短いので、そっちが良かった気がしています(笑)
どちらにしろその程度の理由で、深い意味はありません。

注意するのは画像だけ固有イベントを使うというオプションはないので、他の[向き]、[自律移動]、[オプション]、[プライオリティ]、[トリガー]の値もきちんと固有イベント側で設定する必要があるということです。
わりと「設定正しいはずだけど動かないなー」と思ってたらテンプレートイベントの設定を確認してて、固有イベントの設定をチェックしてなかった、なんてことがありがち悩みポイントです。

なお固有イベントに残しておく値はプラグインパラメータの[上書き対象項目]で設定できるので、画像だけ残しておきたいという場合は画像以外をOFF(false)に設定します。
ただし[上書き対象項目]設定はプロジェクト全体に影響するので取り扱い注意です。
個人的には使い方に慣れた2作目でいじるオプションかなと思います。

[自動上書き]オプションは <TEOverRide> タグなしでも上書きにする設定ですが、同様に2作目以降で検討するオプションではないかと思います。

またメモ欄に関しては[メモ欄統合]オプションで、いずれかあるいは両方を使う設定が可能です。
必要ない場合はそもそもタグを書かないので、両方を使う設定が使いやすいかと思います。
この設定もきちんと把握しておかないと「なんでだー動かんー」となりがちなので注意です。

あと[出現条件]は常にTE側の設定が使われるので、これも注意です。

注意多いですね。標準でこの仕組みに対応してたら反映されない項目はグレーアウトして分かりやすくするとかできるんですが、プラグインでエディタのUIは基本的に変更不可能なので、しょーがないです。

TEに固有イベントの[実行内容]を追加したい

あとは、固有イベントの[実行内容]が単にTEのものに入れ替えられてしまうのは勿体ないですね。
なのでTEから固有イベントの[実行内容]を呼ぶ[固有イベントの呼び出し]プラグインコマンドが用意されています。
固有イベントの[実行内容]を[コモンイベント]みたいに使う感じですね。

これで宝箱や敵シンボルの出現内容だけ固有イベントに書くなどして、バリエーションを作れます。
そして呼び出した固有イベントの[実行内容]が終わったら続きを実行します。[コモンイベント]と一緒ですね。


これは先ほどのインプの固有イベントで指定している敵シンボルのTEです。
固有イベント側で[戦闘の処理]コマンドだけ書いておけば、別の種類の敵用のシンボルも簡単に作れます。宝箱に応用するのも簡単ですね。

ちなみに2ページ目はシンボルが消えてから復活するまでの挙動を書いています。
直接テンプレートイベントとは関係ないですが、参考にどうぞ。


[トリガー]を[並列処理]にして、[移動ルートの設定]を[ウェイト]にしているのがミソです。
こうすることでセルフスイッチの切り替えタイミングを[移動ルートの設定]を実行し終わった後にできます。
そして固有イベントに <TEOverRide> を書いているので、[トリガー]を[並列処理]にするのは固有イベントが優先されます。
前述のように[上書き対象項目]でも挙動は変わります。ただ画像以外は、大抵はTEと固有イベントで値を揃えておけば混乱しにくいんじゃないかと思います。
別の値を使う必要があることはそんなにない気がしますし、片方はどんな値だろうが無視されるだけなので、なら揃えた方が分かりやすいというわけです。

[ページ番号]の指定もできるので、TEの方で条件で場合分けして別の[実行内容]が書かれたページを呼び出すこともできます。
TEのページと同じページを呼び出す場合は0を指定します。
規定値は0なので大抵はページの指定は必要ないかと思います。

こんな感じでやればシンボルエンカウント用の敵シンボルなんかは簡単に作れてしまうので、素晴らしいですね。
ついでに同じくトリアコンタンさんの EventMovableLimitation.jsを併用すれば、ランダムでうろつく範囲を規定できるので、より使い勝手の良い敵シンボル(ついでに住人)が作れます。

テンプレートイベントのIDと名前の取得

[スクリプト]を使うと[固有イベントの呼び出し]された固有イベントで、TEのIDと名前が取得できます。
IDの取得

this.character(0).getTemplateId()

名前の取得

this.character(0).getTemplateName()

これができると何が嬉しいかというと、…いや特に嬉しいことないかもしれない(笑)
固有イベント側ではメモ欄でテンプレートイベントを指定しているので、基本的にはもう分かっている情報なんですよね。
プラグイン作者は「どう使うかはわからないが、機能を作ることはできたのでつけておいた」みたいな無責任なことしがちです。
使い方を閃いたときはもちろん使っていいですが、よく分からない機能は「本当に誰も使い方が分からない機能」だったりするので、あまり深く考えないことも大事です。

便利なおまけ機能

テンプレートイベントの機能としては直接には必要ないのですが、いくつか仕組みを流用した機能が追加してあります。
とても便利なので、ついでに解説します。ただし解説内容は、ほぼヘルプの内容そのままなので、さらっと流しても結構です。

マップイベント呼び出し

[固有イベントの呼び出し]コマンドが作れるなら、マップ上のイベントを指定して[実行内容]を呼び出すのもできそうですよね。
[マップイベント呼び出し]コマンドで、できます!

同一マップ上のイベントの[実行内容]を[コモンイベント]みたいに使う感じです。
テンプレートイベントからでも固有イベントからでも、普通のイベントからでも使えます。
こんな感じで本当にテンプレートイベントと関係なく存在している機能です。
現在のマップ、[イベントID]、[ページ番号]で分類管理できるから[コモンイベント]より便利な面も多いと思います。
また素晴らしいことに、[イベントID]は数値だけでなく[名前]でも指定できます!うぇーい!今夜はキノコパーティーだ!

例: 複数イベントに同じ内容を実行させたい

街の出入り口が広い場合に同じ処理を書いた[イベント]を並べるのは定番で、『RPGツクールMZ』のチュートリアルでもその方法が紹介されています。
ですが、ちょっと移動先を変更したい場合に、[イベント]全部書き換えて全部テストするのは面倒臭いですよね。
そういう時に実際の[実行内容]はひとつだけ書いておいて、他は[マップイベント呼び出し]でその[実行内容]を呼び出せば、修正が簡単になります。

ちなみに面積の広いイベントを作りたい場合、トリアコンタンさんの HalfMove.js にイベントのサイズを変更できる機能がついているので、そちらで設定する手もあります。
ただし、マップエディタ上ではイベントひとつ分しか表示されないので、見た目が分かりにくい面もあります。

例: そのマップだけで使う処理をまとめたい

また、マップの左上にでも[マップイベント呼び出し]コマンド専用の[イベント]を置くのもいいでしょう。
全マップ共通に例えば "マップイベント"って名前のイベントを置いておけば、コマンドを使いまわせていいですね。
そのダンジョンマップでしか使わない仕掛けなど、コモンイベントを使うより管理しやすいかと思います。

最終ページの[実行内容]を空にしておけば、間違ってボタンで実行されても何も起きないので安心です。
ちなみに[イベントの一時消去]で消したイベントの[実行内容]は呼び出せなくなるので、お気をつけください。

セルフ変数

これもテンプレートイベントとは直接関係ないですが「セルフ変数」機能がついています。
セルフスイッチの変数版ですね。

[セルフ変数の操作]のオプションは以下の三つ。

  • キー: 変数を指定する文字で、日本語も使えちゃいます!!便利!!
  • 操作種別: 代入とかの操作の種類を選べるんですが、一覧では数値表記になっちゃうんで見づらいです。残念。
  • 設定値: ツクール本体では[オペランド]とか言われてるやつですが、こっちの方が分かりやすい。

例えば、セルフ変数 "話しかけた回数" に +1 する場合は、こんな設定になります。

セルフ変数の表示

セルフ変数は[文章の表示]で制御文字 \sv[n] を使って表示できます。
ただし[セルフ変数の操作]と違って n には整数しか使えないようです。残念。

セルフ変数をイベント出現条件で使用

[実行内容]の先頭に[注釈]を書くことで、それをイベント[出現条件](ページ左上の「セルフスイッチ A が ON」みたいな設定)としてセルフ変数を使えます。
[注釈]って実行されないものじゃないの?って思いますが、プラグインとエディタの橋渡しとして割とよく使われる手法です。
行儀が良い手法ではないのですが、正規の方法が用意されていないのですから、無理やりな工夫で乗り切るのがプラグイン魂です。ジャージ部魂なみに強い魂です。

話が逸れましたが、以下の書式で条件を指定します。複数行の指定も可能です。

\TE{条件}

セルフ変数はテンプレートイベントと関係ないのにTEが使われているのが、なんだか変な感じですが、気にしたら負けだ(つまり僕は負けています)

条件はJavaScriptとして記述し、制御文字でセルフ変数の指定が可能です。
ここの制御文字も n に整数しか使えず、文字を書くと SyntaxError Invalid or unexpected tokenが出てしまいます。残念。


このへんはもうJavaScriptの簡単な知識も必要になってきますし、ヘルプを読んでわからない人は、まず使う必要がない気もします。
便利なんですけど。

セルフ変数をスクリプトで取得する

[変数の操作]や[条件分岐]のコマンドに書く[スクリプト]を使ってセルフ変数が取得できます。

this.getSelfVariable(n)

なんとこの n には文字も使えます!
ただし、ダブルクォーテーション( " )、シングルクォーテーション( ' )、バッククォート( ` )お好きなやつで文字を括ることを忘れずに。
あなたの好みはなんですか?私の好みはダブルクォーテーションです(杉本清アナウンサー話法)

セルフ変数をスクリプトで設定する

[セルフ変数の操作]プラグインコマンドがあるので、あえてスクリプトを使う必要は基本的にはないのですが、プラグインコマンドは[移動ルートの設定]で実行できないので、その時は使えます。

 this.controlSelfVariable(index, type, operand, formulaFlg)

[セルフ変数の操作]プラグインコマンドと、このスクリプトの引数は以下のように対応しています。

  • キー(index): 変数を指定する文字で、日本語も使えちゃいます!!便利!!
  • 操作種別(type): 代入とかの操作の種類を選べるんですが、一覧では数値表記になっちゃうんで見づらいです。残念。
  • 設定値(operand): ツクール本体では[オペランド]とか言われてるやつですが、こっちの方が分かりやすい。

[セルフ変数の操作]の例を書き換えると、このようになります。ご覧のように index には文字が使えます。

this.controlSelfVariable("キー", 1, 1)

ここでは formulaFlg を省略しているので false として解釈されています。
formulaFlgtrue に設定すると、operand を計算式として評価します。とヘルプにはあります。

this.controlSelfVariable("キー", 1, "2*4", true)

こういう感じに数値の代わりに式が使えて、その計算結果を操作種別(type)に従ってセルフ変数に設定するわけです。
…正直使いどころがよく分かりません(笑)

this.controlSelfVariable("キー", 1, 2*4)

でよくない?

セルフ変数をスクリプトで一括設定する

 this.controlSelfVariableRange(start, end, type, operand, formulaFlg)

start が開始セルフ変数番号、end が終了セルフ変数番号で、あとは controlSelfVariable() と一緒ですね。
かなり複雑な処理でないと使わない機能だと思いますし、個人的にはここまで複雑な操作を必要とするようになったら、もうプラグイン自作した方が早いのでは?という気持ちになってきます。
往往にしてそれは間違いで、人が作った仕組みに乗っかった方が楽だったりしますが(笑)

外部のイベントのセルフ変数をスクリプトで取得する

 $gameSelfSwitches.getVariableValue([mapId, eventId, index])

マップID(mapId)とイベントID(eventId)は整数ですが、キー(index)には任意の文字が使えます。
標準のコアスクリプトの Game_SelfSwitches の value() の指定とだいたい一緒です。

 $gameSelfSwitches.value([mapId, eventId, type])

ちなみに type はエディタで指定できるのは A, B, C, D いずれかですがスクリプトだと任意の文字を指定できます。コアスクリプトの裏技です!
基本的にはセルフスイッチとかセルフ変数は、イベントの中で完結しているので使いやすいという面がありますので、あんまり外から取得したりしない方がいいのですが、「それができると話は簡単」となる場面も割とあるので、拳銃は最後の武器だ! のノリで使っていきましょう。

外部のイベントのセルフ変数をスクリプトで設定する

自分自身以外のイベントのセルフ変数を設定する方法も用意されています。

 $gameSelfSwitches.setVariableValue([mapId, eventId, index], value)

標準のコアスクリプトの Game_SelfSwitches の setValue() の指定とだいたい一緒です。

$gameSelfSwitches.setValue([mapId, eventId, type], value)

セルフ変数をプラグインコマンドで使う

「テンプレートイベントプラグイン」の全てのプラグインコマンドで制御文字 \sv[n] が使用できます。n は整数のみです。
流石に全プラグインで使用はできませんが、『RPGツクールMZ』の標準プラグインである PluginCommonBase.js(これもトリアコンタン作です) に対応したプラグインなら制御文字 \v[n] が使えます。
その場合は適当な変数を用意してそこに[変数の操作]コマンドの[スクリプト]を使ってセルフ変数の値を代入し、プラグインコマンドでその変数を指定すれば若干面倒くさいですが、セルフ変数の値は使えます。

最後に

地味なツクールの基礎部分の機能変更・追加するプラグインは応用範囲が広いので、面倒なようでも頑張って身につけるとあとあと楽かなと思います。
しかし「そんなの知るかー」とゴリゴリ作っていく人の方が完成まで持っていく確率が高いようにも思うので、好き好きで!ライクライクで!!
と、なんとも無責任なことを書いて締めとさせていただきます。

Discussion