←RPGツクールMVでオブジェクト指向しよう!その1.プロパティ編
#オブジェクト指向とプレハブ
オブジェクト指向はプレハブという途中で出したり消したりするマップイベントと相性がとてもよいです。
あ、プレハブという名はUnityから借りて名付けちゃっただけですので忘れてもいいです(死)
#コピー可能なマップイベント
と言われてもピンと来ないと思いますので、
まずは前回「オブジェクト指向的なもの」として登場した
セルフスイッチの例でご説明したいと思います。
(EV001 トリガー:決定ボタン)
◆条件分岐:セルフスイッチAがOFF
◆アイテムの増減:ロングソード +1
◆セルフスイッチの操作:A = ON
◆
:分岐終了
◆
お馴染みのシンプルな宝箱開閉イベントですが、
実はこれ、何度コピーしても破綻しないという特徴があります。
(ロングソードがやたら多くなるのは問題ですが)
これこそが「オブジェクト指向的な操作」の大きな特徴なのです。
もう一つ、同じような特徴を持つイベントをご紹介します。
以下は「話しかけるとその場で跳びはねるだけの人」イベントです。
(EV002 トリガー:決定ボタン)
◆移動ルートの設定:このイベント(ウェイト)
: :◇ジャンプ:+0, +0
◆
単純なようですが、対象指定のこのイベントというフレーズが大事です。
ここで対象をEV002と直接指定してしまうと、コピーしてこのイベントを増やした場合、
どの人物に話しかけても最初の人物(=EV002)が跳ねるようになってしまいます。
この例でも何度コピーしても破綻しないのは、
このイベントというフレーズが「移動ルートの設定という動作」と「マップイベント」をひも付ける役割を果たしているからです。
前回、「このイベントはオブジェクト指向的」と言ったのはこのためです。
セルフスイッチとこのイベントという2種類の「オブジェクト指向的」な機能を使いこなせば、
コピー自由なイベントが作れるようになるのです。
…4つのセルフスイッチでは機能が足りない時は?
もうおわかりですね。ここでプロパティを使うのです!
それではプロパティを用いた「自らの寿命が尽きると消えるイベント」を作ってみます。
(EV003 自律移動:ランダム トリガー:並列処理)
◆スクリプト:this.character(0).jumyou = 80;
◆ループ
◆スクリプト:this.character(0).jumyou--;
◆条件分岐:this.character(0).jumyou < 0
◆イベントの一時消去
◆
:分岐終了
◆ウェイト:1フレーム
◆
:以上繰り返し
◆
#プレハブ
さてさて、ここまででオブジェクト指向を用いてコピー可能なマップイベントを作れるというお話をしました。
確かに宝箱の例のようにエディタでいくつコピーしても破綻しない、というのは便利です。
しかしここで落ち着いて考えてみてください。
「変数がマップイベント毎に独立しているからコピーしても安全」なら…
エディタ内だけでなくゲーム中にコピーしても安全とはいえないでしょうか?
…そうです!これこそがゲーム作りを格段に楽にする秘中の秘、プレハブなのです!
#プレハブ実践
プレハブをもう一度述べますと、「途中で出したり消したりできるマップイベント」です。(my定義)
マップイベントを途中で消去するのはイベントの一時消去という便利なイベントコマンドがあるのでそのまま使えます。
ただし出す方はそのままでは難しいのでOrangeCustomEventsというプラグインを使いましょう。
このプラグインは「マップイベントを加えたりコピーしたりできる」というプラグインです。
(追記:2016/10/23)他に似た用途のプラグインとして、イベント動的生成プラグインがあります。
使用感は異なりますがこちらは日本の作者さんのものでヘルプが日本語なので、こちらを使うのも良い感じです。
とりあえず以降の説明はOrangeCustomEventsで進めます。
◆プラグインコマンド:copy event 1 from map 5 to position 15 20
これだけで「MAP005のマップイベント1番を今のマップの(15,20)にコピーして置く」という意味になります!楽ちんですね!
ライセンスもCC0なのでどんな形態でも使い放題なようです。私にとっては必携の一品です!
それでは、このプラグインと先ほどの「寿命つきイベント」を組み合わせて
「寿命のあるイベントがわらわら湧いて取り巻いてくる」というイベントを作ってみましょう!
先ほどのEV003はそのままにしておいて、別のマップを新たに作ります。
そしてその草原に以下のようなイベントだけ置いておきます。すると…
(EV001 トリガー:自動実行)
◆プラグインコマンド:copy event 3 from map 1 to position 8 8
◆ウェイト:120フレーム
◆
次々にマップイベントが現れては消えていくではありませんか!!
実はこういう「生まれては消える」パターンはゲーム作りでは頻出で、
「アクションゲーム、RPGの雑魚キャラ」「自機、敵機の弾丸」など結構応用が効きます。
今までの皆さんならひょっとしたら「無限に湧くようで実は有限の敵」とか
「弾数制限」などでごまかしていたかもしれませんが、このパターンを使えばそんな妥協をせずに、
「ツクールにありがちな制約」を乗り越えた自由なゲームを作ることが出来ます!
#まとめ
ご覧のようにオブジェクト指向を少し取り入れれば柔軟でバグの少ないゲームを
より簡単な手順で作ることが可能になります!
ちょっとハードルは高く感じるかもしれませんが、
ある程度以上複雑なゲームを作る時には思い切ってこういった手法を取り入れてみてはいかがでしょうか!
#おまけ:私の使用例
ちなみにですが、私が一番最近このオブジェクト指向パターンを使ったのは
オンライン通信してアバターを表示するプラグインを作った時です!
その記事の「応用編」の部分と関係があるのですが…Qiitaに書くのはサボってますね(汗)
サンプルの「真ん中の石版」にもっと詳しく書いてありますので
オブジェクト指向の実用例の参考にしたい方はそこを見ていただけたら幸いです!
(めちゃくちゃ特殊例な気もするので見なくてもいいです)
ちなみにあの例ではプラグインコマンドをどのマップイベントから使用したかによって意味を変える、という小技を使ってます。
プラグインコマンドのthis
はやはりその1で述べたGame_Interpreterですので、
プラグインコマンドの定義中でthis.character(0)
と書けば同様にマップイベントを取得できます!