神無月サスケの波瀾万丈な日常

神無月サスケのツイッター(@ktakaki00)を補完する長文を書きます。

ツクールMZサンプルに込めた、MZの可能性とアピールポイント

この記事は、ツクールフォーラム・アドベントカレンダーの12月3日の記事になります。

今年、2020(令和2)年は、RPGツクールの新作、MZが発売されたことで、ツクール界隈は盛り上がりを見せています。僕、神無月サスケは、ロンチプラグインの制作とサンプルゲーム「ルイーゼと秘密の地下室」の作成に関わりました。おかげさまで、いずれも好評をいただけているようです。皆さまに感謝いたします。

ロンチプラグインについて

まず最初に。今回、MZの公式プラグインは、トリアコンタン様が、かなり多くの物を作っておられます。今回、この「公式プラグイン」は、MVの公式プラグインと異なり「MITライセンスではない」「他ツールへの流用不可など、かなり厳しい制限がある」ことにご留意ください。

僕が担当したのは、主に「MV公式プラグインのうち、MZのデータベースに採用されなかった機能を持つプラグインをMZに移植」という点でした。また、僕が制作したMVプラグインのうち、特に需要の高かったものも自主的に移植しています。これらにつきましては、以下のツイッターのモーメントにまとめてあります。

神無月サスケ謹製 RPGツクールMZ プラグイン集

上記を読めば、僕が作成したロンチプラグインの範囲が分かると思います。具体的には……

  • WeaponSkill.js, KeyItemNumber.js など、MZではデータベースで設定可能になったプラグインは見送り
  • ExtraEquipType.js (装備可能武器の動的追加)などは、SimplePassiveSkillMZ.js(装備の特徴や設定を元にした、簡易的なパッシブスキル作成)としてより汎用的、包括的なものに置き換え
  • EventEffects.js のように、MV、MZ両対応のプラグインでも、パラメータの指定方法を分かりやすくするなど、些細な改良を追加
  • TinyGetInfoWndMZ.js のように、同名同機能のMVプラグインがあり、MZ専用のものにはプラグイン名末尾にMZを追加

といったものです。

公開後、いくつか不具合の報告があったため、MZのVer1.1.0では、修正されたものも多数あります。ご利用される方は、ぜひ最新版をお試しください。

ロンチプラグインに見る、プラグインの進化

今回、MZ用のプラグインは、MV用と区別するために、ヘルプのアノテーションに対して「@target MZ」といった記法が導入されました。両対応のプラグインでも、「@target MV MZ」と記述することが勧められています。まだMV側では「@target」アノテーションに対応していませんが、将来、導入される可能性があるため、MV対応の是非もこのアノテーションで記述するのが望ましいです。

このように、プラグイン利用者がパラメータの設定を容易にするために、様々なアノテーションが新規導入されました。詳しくは、公式サイトのプラグイン講座でのアノテーション解説をご覧ください。これらの一部は、RPGツクールMVの後期バージョンで採用されていましたが、今回新設されたものもあります。プラグイン作者様方には、ぜひ有効活用してもらいたいものです。ロンチプラグインでも、これらの記述が加わり、MV版よりも使いやすくなっている物が多いです。

最大の変更は、プラグインコマンドでしょう。MVでは1行のコマンド入力でしたが、MZでは、GUIに変更されており、「新たなイベントコマンドを作成する」ような感覚で、プラグインを作成することが可能になりました。

以前より、海外のツクールフォーラムを中心に「新たなイベントコマンドをユーザー側で作成可能にしたい」という意見が多かったようですが、今回、このような形で、答えを出してくれたわけです。

これらの結果、プラグインが、より設定のしやすい、利便性の増したものになったことは特筆すべきだと思います。

コアスクリプトの進化とプラグインのMV/MZ互換性

プラグインを作るうえで、ベースにするのがコアスクリプト。MVからMZになって、大きく変わった点もありますが、MVのプラグインの中で、あまり手を加えずに使えるものも、意外と少なくないことに気づきます。

そのまま動く可能性が多いもの

  • マップ関連のもの。8方向移動やタイルの特徴を利用したプラグインは、これらに大きな変更がないので動く。
    • ただし今回、マップには任意のレイヤに任意のタイルが置けるようになったため、MVの「特定のレイヤにはその層特定のタイルしか置かれない」と仮定しているプラグインは正常動作しない。
  • アクターや敵のパラメータに関するプラグイン。パラメータには大きな変更がないため、例えば「Buff/Debuffを2段階から4段階以上などに変更する」といったプラグインは、変更なしで動く公算が大きい。

多少の改修が必要な物

  • メニュー画面系。今回、常に「戻る」ボタン(フィールドでは「メニュー」ボタン)が画面に表示されている。よって、ウィンドウの配置も、この領域に何も置かないようなレイアウトに変更することを余儀なくされている。
  • 新たにウィンドウを作成する際、座標をRectangleで指定する必要が出てきたこと。これによって、新しくウィンドウを作成する部分はMVから書き換えなければならない。

大きく書き直す必要があるもの

  • メッセージウィンドウ関連。今回、アラビア語のような「右から左へ流れる言語」にも対応したため、既存の関数名も大きく変わり、処理は完全に別物になったと言っていい。--ロンチプラグインでも、MVのNovelMessage.jsは、僕ではなくほぼ尾島氏の添削によるものだが、MVとMZのコードの違いに対処しきれず、尾島氏に下駄をあずける形となっている。
    • メッセージウィンドウで文字ごとにSEを演奏するロンチプラグイン「PlayMsgWndCharSeMZ.js」。処理がMVから完全に変わったことから、このプラグインも、MV版と別物になっている。
  • バトルシーケンス関連。今回、タイムプログレッシブ戦闘という、ATBによく似たシステムが導入され、ターン制、アクティブ、ウェイトから選べるようになったが、驚くべきは、これらが全て共通のルーチンで処理されていること。通常のプログラマなら、それぞれ用のプログラムを書き、別々のルーチンを準備するだろう。これを共通で出来るというのは、相当熟練したプログラマであることが伺える。
    • このため、MVにあった、バトルコマンドウィンドウ(戦う/逃げる)に、「オート」や「リピート」を入れるのが現実的でなくなった。これらはターン制以外まともに機能しない。ロンチプログラムは、苦肉の策として、アクター毎にオートにするかどうかを選択可能にするもの(AddAutoToActorCommand.js)を導入した。

全体的に言えること

公式のアナウンスは「MVとMZのプラグインレベルでの互換性はない」である。しかし、あまり変更の少ない部分を扱うプラグインは両対応出来る物もあるし、微細な修正で対処できるものもある。MVのプラグインはMZで「動いたらラッキー」程度に考えるべきである。

コアスクリプトJavaScriptは、ES5からES6へ。しかし……

これはJavaScriptを知っている人向けの話題だが、コアスクリプトプラグインで利用している言語であるJavaScriptが、MV発売の時は最新はES5だったのに対し、MZの時にはES6という新記法を採用した。厳密にはツクールMVでも、Ver1.6.0以降は、ES6に対応、という報告も聞くが、一貫性を考えると、MVでのES6使用はおすすめできない。一方、ツクールMZは、ES6を前提にコードが組まれている。ただし……

MZでも依然と残るprototypeやfunctionなどのES5記法

コアスクリプトというのは、原則「プラグインで書き替えてもらうこと」を前提に作られています。このため、わざと、class などのES6構文を使わず、意図的にES5時点のfunctionとprototype構文で書かれています。なぜなら、そちらの方が、書き換えが容易だからです。このことは「コアスクリプトが十分にES6を活用していない」と、早くから話題になり、議論が起きていましたが、僕にとっては、「考慮に考慮が重ねられた結果だ」と受け止めています。

結論:プラグインでは自由

上記の理由によって皆さんがプラグインを作る際は、ES6記法は自由に使ってよいと考えられます。

ツクールMZでの制作。エディタ周りについて

スクリプトの話はここまでにして、今度は実際にサンプルゲームを作っていて便利だと感じたものをいくつか書いていきます。大抵のことは、よそが書いているので、独自の視点で。

64bitソフトになったことで、64bitOSで軽量化された

RPGツクールMVは、32bitソフトであり、32bit/64bitの双方で動くプログラムでしたが、この時点で大半のユーザーは64bitOSを使っていたものと思われます。実は、64bitOSが32bitOSを実行する場合、OSレベルでは、若干手間のかかることを行います。32bitで受け取った値を、一旦CPUでの計算用に64bitに変換し、計算結果をまた32bitに戻す……といった具合のことをしています。Windowsなら、この処理をWOW64が承っています。普通なら速度への影響は、ほぼ問題のない些細なレベルです。しかし、ちりも積もれば山となる。64bitOSでは、同じ内容の32bitソフトより、64bitソフトの方が、若干軽くなります。

  • 先日公式がツイッターで「ツクールMZのエディタはツクールMVより軽快なこともある」と書きましたが、これは大げさな話ではなく事実であり、これによるものなのです。
  • なお、32bitの弊害として「4GBの壁」がありますが、これが問題になるような状態はツクールはあまりありませんでしたね。

オーディオにm4aが必要なくなり、oggだけでよくなった

僕のサンプルゲームは、作曲担当がいます。氷石彩亜君というのですが、彼にとってもこれは歓迎すべきことだったのではないでしょうか。そもそもMVの熟成期に、OggOnly.js という「ツクールMVでoggだけで十分」という、革命的なプラグインドワンゴ側の開発班からもたらされ、いくつかの改良を経た結果、実用性十分と言うことで、今回MZに晴れて採用の運びとなりました。今のところ、大きなトラブルの話も聞かず、まさにこれは革命的進化と言ってもいいでしょう。言うまでもなく、プロジェクトのサイズ削減にも大きく貢献する進化です。

大きく見栄えは変わらないが、細かい所に気が利く

これは実際に使ったことのある人なら、いちいち細かい所に気づくのではないでしょうか。僕が今リストアップするだけでも……

  • マップツリーで、ツリーのマップを別の層に移動する際、末尾のみならず真ん中に挟み込めるようになった。
  • メッセージウィンドウの設定。右クリックで色番号やアイコン番号を挿入可能になったので、\C[17]とか\I[360]といった外字が楽に入力可能になった。
  • 「変数の操作」の「代入→ゲームデータ」で、「アクター」の「TP」がこっそり取得可能になっています。僕はTP持ち越しではないため、この機能は未使用ですが、助かった人は多いのではないでしょうか。

マップエディタで、従来とは異なるレイヤにタイルを置けるようになった

もっと厳密にいえば、レイヤごとの編集が可能になった、ということです。前述の通り、これに影響を受けるMVプラグインもありますが、タイルの重ね合わせの自由度が劇的に高まったことは、もろ手を挙げて歓迎しました。本当に、マップの痒いところに手が届くためです。今回「ルイーゼと秘密の地下室」のマップの多くは僕自身が書きましたが、何度、助けられたか分かりません。重ね合わせ万歳。

マップエディタで、通行判定★が正常にエディタに反映されるようになった

これは、ツクールMVユーザーを一番悩ませた要素かもしれません。通行判定★のタイルの上に通常タイルを置き、エディタとゲームでの見かけが異なることがありました。MVの際は、講座などで、こういうことをしないように注意していましたが、やはり、ユーザーが気を遣わずに済むようになったのが一番でしょう。

その他、サンプルゲーム作成の役に立った点

キャラクター生成機能の向上

キャラクター生成はMVからありましたが、今回はさらに様々な点がバージョンアップしているようです。僕は今回触っていませんが、開発メンバーのふうきゅう氏が、イメージに合うキャラを作成するために使い、使い心地の良さを報告してくれています。

「コアスクリプトの更新」の自動化

以前は、コアスクリプトのバージョンアップの際には、「plugins.jsを除いてファイルを置き換え」など、若干ややこしい作業を求められていましたが、今回、コマンドひとつで可能になりました。これで、まちがってplugins.jsを上書きするなどの事故がなくなりそうですね。

  • ただ、ひとつ懸念があるのは、MVのVer1.2→1.3、1.5→1.6の時のように、エンジン部分(Nw.jsやPIXI.jsなど)が大きく変化するケース。これはコアスクリプトの書き換えだけじゃどうにもならないため、若干大きな作業が必要になる可能性もあります。

結論:ツクールMZは買いだ

ツクールMVを使っていて、プラグインに詳しい人は勿論、皆のプラグインを使う立場の人、それでゲームを作っている人は、皆、移行の価値があります。僕が一番評価しているのは、スマホ対応の強化なんですが、そこにこだわる方はもう僕と同様選択肢はひとつです。一方で未だにツクールVXAceで作っている人もいますが、彼らはWindows対応で満足しているのかもしれません。Macスマホにも進出した世界で作品を公表したい人は、例外なくMVやMZこそが選択肢であり、そして、MZは非常に高機能化、ユーザーフレンドリー化しています。買わない手はありません。

結論2:この記事で他にメインで書く予定だったこと

もっと、サンプルゲーム「ルイーゼと秘密の地下室」の隠しギミックなんかを解説しようかな、って思っていたんですが、それなしでも、ずいぶんな分量になってしまいました。そこで、まだアドベントカレンダーが埋まっていないのを見て、「そのことでもうひとつ記事を書いたら?」という気持ちになりました。その時の為に取っておきます。