RPGツクールMVで独自のゲームデータを定義してセーブできるようにする

ツクールMVでゲーム制作をする場合、ツクール側が用意したデータだけでなく独自のデータを作成して セーブやロードができるようにしたい場合がある。

この記事では、独自データを作成してそのデータをセーブ、ロードできる方法を紹介していく。

独自データを作る方法

ツクールMVのコアエンジンでは様々なゲームオブジェクトが定義されており、Game_Systemのように 接頭語がGame_のクラスで作成されている。

そして、$gameSystemなどのようにグローバルオブジェクトとして生成されており、 セーブ、ロード時にはこれらのオブジェクトがJSONでencode/decodeされることでデータが保存される仕組みになっている。

つまり、独自データを作成してセーブしたい場合は、Game_Systemクラスに新たなプロパティを作成し、そのプロパティに独自データを定義したクラスのインスタンスを代入してあげることで、独自データのセーブが可能になる。

実際にやってみる

1. プラグインのひな形を作成する

まずはプロジェクトのディレクトリを開いてjs/pluginsディレクトリにOreorePlugin.jsを作成しよう。

そして、コードの最初にプラグインのひな形となるコメントを作成する。(ここは適当でよい)

/*:
 * @plugindesc オレオレプラグイン
 * @author 俺
 * 
 * @help
 * 【プラグインの説明】
 * このプラグインは、RPGツクールMV用のサンプルプラグインです。
 * ここにプラグインの詳細な説明を記載してください。
 * 
 */

現時点では何もしないプラグインだが、ツクールMVはOreorePlugin.jsを正しく認識しているはず。

2. 独自データのもととなるクラスを作成する

次に今回作成する独自データを定義していく。先ほどのコメントの下に以下のコードを書いていこう。

function Game_MyCount() {
    this.initialize.apply(this, arguments);
}

Game_MyCount.prototype = Object.create(Game_MyCount.prototype);
Game_MyCount.prototype.costructor = Game_MyCount;

Game_MyCount.prototype.initialize = function () {
    this._count = 0;
};

Game_MyCount.prototype.add = function (val) {
    this._count += Number(val);
};

Game_MyCount.prototype.getCount = function () {
    return this._count;
};

ここでポイントとなるのは「class構文は使わずにprototypeでクラスを作成すること」だ。 ツクールMVでのデータのセーブ、ロードはprototypeベースで定義したクラスでしか 正しく機能しないからだ。

また、クラスのメソッドを以下のように書くのもダメ。これも正しく機能しなくなる。

Game_MyCount.prototype = {
    initialize: function() {
        // ...
    },

    add: function() {
        // ...
    },
}

3. Game_Systemのプロパティに独自データをいれる

最後にGame_Systemのプロパティに先ほど作成したクラスのインスタンスを代入すればOK。 以下のコードを書いていく。


(function () { var _Game_System_initialize = Game_System.prototype.initialize; Game_System.prototype.initialize = function () { _Game_System_initialize.call(this); this._MyCount = new Game_MyCount(); }; Game_System.prototype.MyCount = function () { return this._MyCount; }; })();

これで様々なスクリプト、プラグイン内で独自データが使えるようになる。

$gameSystem.MyCount().add(2);
var count = $gameSystem.MyCount().getCount();