前回の記事で書いたアイテム関係の不満について、というか注意事項です。
アイテムはこちらのデータベースエディタで制作しますね。
ここでは上記で制作した「太陽の杖」を例として扱っていきます。
宝箱(ここではクリスタルから、ですが)などからアイテムを入手する場合、このような流れになるかと思います。
ここで問題なのが、
「○○○を手に入れた!」「○○○を装備した」のアイテム名を手入力で打たなければいけない、ということです。
つまり後でアイテム名を変更した場合、これを手動で入力し直さなければいけません。
開発終盤、シナリオの関係で「太陽の杖」を「マグマの杖」に変更したとしましょう。
アイテム名はデータベースをいじるだけで変更は終わりです。
しかし、「○○○を手に入れた!」「○○○を装備した」の文章は手入力でアイテム名を書いているので、ここのイベントも手動で直さなければいけません。
「○○○を手に入れた!」「○○○を装備した」だけで済むアイテムならまだ幸運でしょう。
これが「レッドオーブ」のようにシナリオ中のセリフで何度も登場してくるアイテムだった場合、全て思い出せますか?
どこかで旧名のまま残ってしまう可能性があります。
プレイしているユーザーからしたらハテナでいっぱいです。
最低限、アイテム名を制御文字で書けるのかと思っていたのですが、まさかの取得不可です。
では変数でアイテム名を代入すればいいか、と思い「変数の操作」メニューを選ぶと…
取得できるのは所持数のみ。
アイテム名やアイテムIDを取得するには、スクリプトを書くしか手段がなかったのです。
ちょっと改善。でも…
無難なやり方としては
- スクリプトで変数にアイテム名を代入(上記の太陽の杖を取得する場合 $dataWeapons[7].name)
- 「○○○を手に入れた!」「○○○を装備した」には制御文字 \V を使いアイテム名を取り出す。
しかしまだ問題が残ります。
先程のこの例でいうと、
- 「○○○を手に入れた!」 ※手入力
- 武器の増減 ※ダイアログから選択
- 装備変更 ※ダイアログから選択
- 「○○○を装備した」 ※手入力
スクリプトで変数にアイテム名を代入することで、1と4は処理としては、ひとつにまとまります。(バグが有る無いは「1と4」は常にセットで考えることができる)
「1,4」「2」「3」
何が言いたいかというと3箇所それぞれでアイテムIDを個々に設定しているということです。
「太陽の杖」のアイテムIDは7番です。
「1,4」で7番を設定し、「2」ではダイアログから7番を選択、「3」でもダイアログから7番を選択。
たくさんイベントを作っていると、どこかのイベントで「2」だけ別のIDを設定していた、「3」だけ別のIDを…なんてウッカリは結構あるものです。
理想は、
- 変数Aにダイアログから選択する形でアイテムIDを取得
- 「○○○を手に入れた!」/「装備した」は制御文字で変数Aに入っているアイテムIDからアイテム名を出力
- 変数AのアイテムIDの武器を増減
- 変数AのアイテムIDの武器を装備
こんな感じが理想ですね。
これなら「1」で取得したアイテムIDを「2」「3」「4」でも使用するので、個々に手動でアイテムIDを設定していた時に比べて、バグが発生する箇所は1箇所だけになります。
これを実現するにはプラグインという形でまとめるしかないです。
でもまだ問題があります。
プラグインとして作成する場合、
武器を装備したりしなかったり、武器なのか防具なのか道具なのか、といった色んな状況における分岐があるため、プラグインとしても設定が多くなってしまい、呼び出す度にプラグインに渡す引数がずらずらと長くなる。
アイテムIDを渡すにはデータベースからIDを調べて、プラグインにはIDそのものを記述する。
太陽の杖なら「type=Weapons, ID=7, equip=true」この辺は最低でも渡す必要があるでしょう。
要は後からイベントファイルを見た時、プラグイン呼び出し箇所の視認性が悪くなり、これが新たなバグの温床になります。
さきほどの「1」変数Aにダイアログから選択する形でアイテムIDを取得
ダイアログからとしているのは、あとでイベントエディタを見たときの視認性と、ID番号の記述ミスをなくしたいためです。
しかしこれを実現するにはRPGツクールMVのツール本体の改造が可能でなければ実現できません。つまり出来ないのです。
ここまでのまとめ
- 今まで通り手を加えず、素直にアイテム名を手入力
- アイテム名を変更したら全イベントを思い出す必要がある
- 思い出せなかったイベントはバグとして残ってしまう
- アイテムIDを個々に設定するのでバグの発生原因が複数残る
- 視認性は良いのでイベントエディタさえ見れば間違いに気づきやすい
- 変数にアイテム名だけは代入する場合
- アイテム名の問題は片付く
- アイテムIDを個々に設定する問題は残る
- 変数にスクリプトで代入する、という手間が生まれている割にはアイテム処理全体に残るバグの発生原因が1つしか減っていないので労力にあっていない。
- 変数に代入するためのIDもデータベースから調べて記述するため、記述ミスが起こりやすい
- それでいて視認性は若干低下する。
- プラグインを作った場合
- IDを調べるためにデータベースと行ったり来たりする手間
- プラグインの引数がうっかりミスが発生しやすい項目の多さ
- それでいて見返した時に視認性が悪くイベントエディタ上で気づきづらい
結局どうするの
僕が選択したのは、なんと「1」番。
今まで通り手を加えず、素直にアイテム名を手入力
- 結局これが一番視認性がよい。
- イベント作成する上で一番楽。
じゃあアイテム名を変更した場合、どうするの?
Grepを使いあぶり出すことにしました。
これで Map005.json ファイルで「太陽の杖」が記述されていることがわかります。
アイテムの増減や装備変更の有無などはテストプレイで比較的気づきやすいバグだろうと判断して、この形で落ち着きました。
できればRPGツクールMVの「イベント検索」の機能で検索できれば嬉しいんですがね、検索機能が貧弱すぎです。
長くなったのでGrepに関してはまた別記事にまとめたいと思います。