【ツクールMV】MVの内部データをしゃぶり尽くそう!
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【ツクールMV】MVの内部データをしゃぶり尽くそう!

2019-03-03 01:15
    皆さんこんにちは、青いペンギンこと荒上理紗斗(あらがみ りさと)です。

    RPGアツマールのクリエイターズキャンプ2ndでは、寝坊青年が遅刻回避のために街中を駆けまわるゲームを作ったりしました。

    -----

    今回、アドベントカレンダー的なことをするとのことで、何を書こうか色々悩みました。
    候補としてあったのが、

    ・プログラミング知識がほぼゼロだった私が、1年ちょっとの独学でツクールMVのプラグインを最低限書けるようになるまでの経緯
    ・みんなで作ろう!自作BGM入門
    ・全力でふざける!あほなゲームを作る極意
    ・MVの内部データをしゃぶりつくす(当記事)

    でした。
    考えた結果、実用性重視でこの記事になったという感じですね。
    今回は不採用でしたが、他のネタもいつか書きたいなとは思っているので、時間が取れたら挑戦してみたいです。

    では、スタート!

    -----

    今日は、私も制作時に利用しているゲーム制作用ソフト「RPGツクールMV」内部データについてお話ししていきたいと思います。

    まとめるのが下手なせいで結構長いですから、お菓子を食べたりして適宜休憩しながらのんびりと読んでみてください…。

    -----

    イベントコマンドにある「スクリプト」であったり、自作プラグインなどであったり、MVには直接コードを打ち込めるような仕組みがありますよね。

    これらの存在意義について考えてみると、
    ・イベントコマンドだと冗長になってしまう処理を簡潔に書く
    ・そもそもイベントコマンドではできないことを書く
    ・イベントコマンドでは取れない(もしくは取りにくい)ような内部の数値データを利用する

    の3パターンのいずれかに当てはまるのではないでしょうか。

    この中でも3つ目に書いた「内部データの利用」に今回はフォーカスを当てていきたいと思います。

    -----

    ではまず、「そもそも内部データがどのようになっているか」という点から確認していきましょう。
    MVユーザーなら一度は耳にしたことがあるであろうワード「コアスクリプト」のお話になっていきます。

    MVのゲームファイルを覗いてみると、このようになっていると思います。


    上記のファイルが、MVを動かしています。
    では、それぞれの役割について簡単に書いていきます。

    libs
     → ゲームを作るうえでのベースというか素材集みたいなもの
    plugins(フォルダの方)
     → 読み込ませたいプラグインを置いておくフォルダ
    main
     → ツクールゲー起動時に最初に動いてゲームを立ち上げるいわばスイッチのようなもの
    plugins(jsファイルの方)
     → 登録されているプラグインデータのまとめ
    rpg_core
     → ゲームの挙動というよりは、そもそもゲームを形作るためのもの
    rpg_managers
     → ゲームの進行やデータを管理したりするもの
    rpg_objects
     → ゲームで実際に起きている見た目上の変化や内部の数値データのやりとり
    rpg_sprites
     → ゲームのグラフィックを司る存在
    rpg_windows
     → ゲームのウィンドウを司る存在

    こんな感じです。
    その中で、今回の内容に合致するファイルは「rpg_manager」「rpg_objects」の2つです。(たまーに「rpg_core」も使うことがあったり…)
    今回は主にこいつらについて語っていきます。

    -----

    【データの保存様式】

    ではまず、RPGツクールMVではどのようにデータが保持されているかについて見ていこうと思います。

    データ情報の保存は主に以下の3パターンに分類されます。
    $data~ シリーズ (基本的にゲーム中には不変のデータ)
    $game~ シリーズ (ゲーム中に値が変わることのあるデータ)
    その他 ($pluginsなど。今回は割愛)

    例えば、アクターの設定情報について知りたい場合は$dataActorsを確認します。
    現在のアクター情報を見たい場合は$gameActorsを確認します。

    実際にどんなデータが格納されているかは、F8やF12などを押すと出る「DevTools」「Console」タブに実際に打ち込んでから「Enter」を押してみると分かりやすいです。



    次はさらにその深くまで踏み込んでみます。
    先ほど説明した3項目($data~、$game~、その他)は、住所でいうところの都道府県名くらいの大まかな区切りでしかありません。自宅に荷物を届けてもらいたければ、市区町村名や番地などの指定が要りますよね。

    ではどうするか。
    次は上の画像にあるの青い > マークの右の位置に、先ほど挙げた例の「$dataActors」を入力して、エンターしてみてください。

    すると、こんな感じに、下にデータっぽい何かが出現しませんか?
    (出現するデータの形はゲームファイルのアクター情報によって異なります)


    四角いカッコに囲まれたものが出てきましたね。
    これはデータの保存形式の「配列(Array)」と呼ばれるもので、先の住所の例で言うと「集合住宅」のようなものです。部屋番号を入力してやると、中に入れます。

    例えば、2番目の部屋は部屋番号が1なので(最初の部屋番号が0で、そこから番号順に1、2、3… と続きますので、2番目の部屋は部屋番号が1)、書き方は

    $dataActors[1]

    となります。
    5番目の部屋なら

    $dataActors[4]

    となります。

    -----

    先ほどエンターした後に出現した、行の右向きの ▲ をクリックすると、中の詳しい情報が展開されます。
    展開されたものの中にある別の右向き ▲ をクリックしてやれば、さらに詳しい情報が出ます。
    以下は、配列(集合住宅のやつ)の ▲ と、その集合住宅の中の部屋番号1の ▲ をクリックした後の画像です。

    ここに出てきている文字列は、先ほどの住所の例えでいうと市区町村くらいのレベルの情報です。

    では、どうすれば都道府県レベルから市区町村レベルの情報にアクセスできるか。
    やり方は簡単!
    都道府県名の後にドット( . )をつけてから市区町村名を書くだけ!


    では、実際にやってみましょう。

    $dataActors[1].name

    と打ってからエンターすると、自分がアクター1番に設定したキャラの名前が出てくると思います。
    上記の例では、
    赤字部分「エディタで作った情報のうち、アクター情報にアクセスしてね」という意味に、
    青字部分「部屋番号1番にいるアクターの情報にアクセスしてね」という意味に、
    オレンジ部分「その情報のうち、アクター名にアクセスしてね」

    といった具合になります。

    -----

    まとめると、
    ・情報を呼ぶ際は住所のようにひとつずつ限定していく
    四角カッコにアクセスするときは部屋番号が必要。(そうでなければ部屋名

    の2点が特に重要です。


    極端な話、ここさえ覚えてしまえば、RPGツクールMV内のほぼ全ての情報にアクセスすることが可能です。
    データ構造自体は先の「DevTools」「Console」を使えば確認できるので(上でやったように、書いてエンターすれば中身が見られます)、格納の仕様が分からなくても大丈夫!

    -----

    【もう少しだけ踏み込んだ内容】

    それぞれのデータたちには、一定の操作が予約されている「関数」というものがある場合があります。(詳しくは、JavaScriptの関数についての説明を検索すると良いでしょう。一応、以下に関数についての簡易的な説明を数行書きます)

    イメージ的には「よく使う機能のお気に入り登録」のようなものでして、こいつを使いこなせるとデータ取得の幅が広がります!

    関数は呼び出す際に、部屋名(メソッド名)の後ろにカッコをつけるルールがあります。
    例えば、キャラクターの向きを教えてくれる「direction」という関数を呼びたい場合は、

    direction()

    と書きます。

    ちなみに、カッコの中はパラメータ指定用の空間です。
    RPGツクールMVのイベントでいうと、場所移動における行先情報であったり、スイッチの操作におけるスイッチIDやオンオフ情報とかと同じように、ここにパラメータを入れるとそれに応じた動きをしてくれます。

    ただ、必ず必要なものということでもなく、例えばRPGツクールMVのイベントコマンドでいうと「タイトル画面に戻す」「イベントの一時消去」などは、追加情報を書きませんよね。つまり、パラメータがなくても処理が変わらない関数については中身が空でもOK

    -----

    では話を本題に戻します。
    先の仕様で保存されているデータたちについて、単純にデータがしまってあるだけの部屋も当然あるのですが、状況によって変わる値を、関数を使って確認できるようなものもいくつか存在します。

    例えば、数行上で例として出した direction() ですが、こいつは指定したキャラクターの現在のマップ上での向きを教えてくれます。プレイヤーの向きを確認したい場合は、

    $gamePlayer.direction()

    といった具合ですね。
    こういった関数にも目を向けられるようになると、扱えるようになる値の幅が一気に広がります!

    また、RPGツクールMVの関数には、他のクラスでも使えるメソッドもあります。
    それは一体どういうことなのか。先の都道府県の例えを用いますと、
    本来、関数は各都道府県ごとに内部に設置され、他県からはアクセスできないように設計されている場合が多いです。
    ですが、さっき書いた direction() もそうですが、同じ機能を他の都道府県でも使えた方が便利な場合がありますよね。( direction() の場合は、プレイヤー以外にもイベントの向きの確認などに流用できたら便利ですよね)

    そういう場合のために、いくつか他県からもアクセスできるようになっている関数があるということです。例えば、さっき書いた direction() はプレイヤーだけでなくイベントの向き確認にも使えるよう設計されているので、

    $gamePlayer.direction()
     → プレイヤー向き

    $gameMap.event(8).direction()
     → マップ上ID8番のイベント向き

    といった具合に、他の都道府県からも利用できます。

    -----

    仕組みの説明はこれくらいにして、ここからはデータ取得時に覚えておくと便利な関数をいくつか紹介していこうと思います。また、【】で囲んだ文字列はコードではなく、そこにどのような値を書けばいいかの説明です。

    direction()
    使える部門 … $gamePlayer、$gameMap.event(【イベントID】)
    機能の内容 … 向きを教えてくれる。下→2、左→4、右→6、上→8を返します。(PCのテンキーの5の位置を中心としたときの向き、と覚えるといいですね)
    使い方の例 … $gameMap.event(3).direction()

    mapId()
    使える部門 … $gameMap
    機能の内容 … 現在のマップのマップIDを返します。
    使い方の例 … $gameMap.mapId()

    eventIdXy(【X座標】, 【Y座標】)
    使える部門 … $gameMap
    機能の内容 … その座標にあるイベントのIDを返します。(無かったら0を返します)
    使い方の例 … $gameMap.eventIdXy(5, 8)

    setValue(【ID】, 【状態】)
    使える部門 … $gameVariables、$gameSwitches、$gameSelfSwitches
    機能の内容 … 指定したIDにあるデータの値を指定した状態に設定する。
    使い方の例 … $gameVariables.setValue(5, 120)

    reserveCommonEvent(【ID】)
    使える部門 … $gameTemp
    機能の内容 … 指定したコモンイベントを呼ぶ予約をする
    使い方の例 … $gameTemp.reserveCommonEvent(6)

    -----

    こんなにたくさん書きましたが、これでも実はまだ話したいことの2~3割くらいしか語れてないあたり、内部データは奥が深いなと思いますが、ただでさえ長いのにこれ以上話すと全校集会の時の校長先生みたいになってしまうので、今回はこの辺までにしておきます…。

    皆さんもデータ取得の仕組みを上手く使いこなして、楽しいツクールライフをお過ごしください!

    おしまい!!

    -----

    もし、当記事や私に質問意見要望などございましたら、コメント欄もしくは私のツイッターアカウントにてお気軽にお声かけください。
    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。