RPGツクールMV

RPGツクールMVでプラグインのデータを保存する方法

この記事では、プラグインコマンドでカウントを増やす・カウントを表示するだけの簡単なプラグインを作って、プラグインのデータを保存する方法を解説します。

RPGツクールMVのセーブデータに保存される内容

RPGツクールMVのセーブデータには、DataManagerオブジェクトが持っている以下のグローバル変数の内容が保存されます。

  • $gameSystem(Game_Systemオブジェクト)
  • $gameScreen(Game_Screenオブジェクト)
  • $gameTimer(Game_Timerオブジェクト)
  • $gameSwitches(Game_Switchesオブジェクト)
  • $gameVariables(Game_Variablesオブジェクト)
  • $gameSelfSwitches(Game_SelfSwitchesオブジェクト)
  • $gameActors(Game_Actorsオブジェクト)
  • $gameParty(Game_Partyオブジェクト)
  • $gameMap(Game_Mapオブジェクト)
  • $gamePlayer(Game_Playerオブジェクト)

$gameTemp、$gameMessage、$gameTroopの内容は保存されません。

プラグインのデータを保存する方法としては、次のうちどちらかになります。

  • 上記のグローバル変数に入っているオブジェクトにプロパティを追加する
  • DataManagerのメソッドをオーバーライドして、自分のプラグイン用のグローバル変数を作って保存する

ほかの人のプラグインを見てみたところ、Game_Systemオブジェクトにプロパティを追加する方法が一般的なようです。

Game_Systemオブジェクトにプロパティを追加する

JavaScriptの場合、プロパティに値をいれた時にプロパティが存在しなければ自動的に作ってくれます。

Game_Systemのinitializeメソッドでプロパティの値を初期化しておきます。

カウントを増やすaddMyCountメソッドとカウントを表示するshowMyCountメソッドもGame_Systemに定義しておきます。

サンプルコード1

(function(){
    'use strict';
    
    // 定数の定義
    const PLUGIN_NAME = "MyCount";
    
    // ---------- プラグインコマンドの定義 ここから ----------
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args){
	_Game_Interpreter_pluginCommand.call(this, command, args);

	if(command === PLUGIN_NAME){
	    switch(args[0]){
	    case 'add':
		$gameSystem.addMyCount(args[1]);
		break;
	    case 'show':
		$gameSystem.showMyCount();
		break;
	    }
	}
    };    
    // ---------- プラグインコマンドの定義 ここまで ----------

    
    // Game_System
    // プラグインのデータを保存するために
    // Game_Systemにオブジェクトを追加しておく
    // ---------- Game_System ここから ----------
    var _Game_System_initialize = Game_System.prototype.initialize;
    Game_System.prototype.initialize = function(){
	_Game_System_initialize.call(this);
	this._myCount = 0;	
    };
    
    Game_System.prototype.addMyCount = function(val){	
	val = Number(val || 0);
	if(!Number.isNaN(val)){
	    this._myCount += val;
	}
    };
    
    Game_System.prototype.showMyCount = function(){
	$gameMessage.add('現在のカウントは' + this._myCount + 'です。');
    };
    // ---------- Game_System ここまで ----------
})();

サンプルコード1の実行結果

イベントの設定です。
RPGツクールMV プラグインのデータを保存する イベントの設定

イベントが実行されるごとにカウントが増えていきます。

セーブしてからデータをロードすると、前回のカウントの値から増えていきます。
RPGツクールMV プラグインのデータを保存する サンプル実行結果

Game_System直下にプロパティを追加する問題点

Game_System直下にプロパティやメソッドを追加していくと、ほかのプラグインと名前がかぶって競合してしまう場合があります。

プロパティが多くなりそうな時は、自作オブジェクトを作ってデータをまとめておくと便利です。

自作オブジェクトを作ってデータを保存する

Game_Systemに自作オブジェクトを返すプロパティを追加します。

プロパティの名前をプラグイン名と同じにすることによって、$gameSystem.プラグイン名().メソッド名()という風に呼び出すことができます。

プロパティやメソッドの定義はGame_Systemではなく、自作オブジェクト側で定義します。

    // ---------- Game_System ここから ----------
    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;
    };
    // ---------- Game_System ここまで ----------


    // 自作クラス(オブジェクト)
    // ---------- Game_MyCount ここから ----------
    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){
	val = Number(val || 0);

	if(!Number.isNaN(val)){
	    this._count += val;
	}
    };

    Game_MyCount.prototype.show = function(){
	$gameMessage.add('現在のカウントは' + this._count + "です。");
    };
    
    // ---------- Game_MyCount ここまで ----------    

変数をローカル化するために即時関数で囲っている場合は、自作オブジェクトのコンストラクタ(※)は即時関数の外に出す必要があります。

※Newでオブジェクトを生成した時に実行される関数。
 JavaScriptではオブジェクトと同じ名前の関数を作るとコンストラクタになる。

即時関数の中でコンストラクタを定義した場合、セーブデータをロードした時に自作オブジェクトのprototypeがundefinedになってしまい、メソッドが呼び出せなくなります。

サンプルコード(全文)

// 自作オブジェクトのコンストラクタ
// 即時関数の外に出しておかないとデータをロードした時に
// prototypeがundefinedになるので注意
function Game_MyCount(){
    this.initialize.apply(this, arguments);
}

(function(){
    'use strict';
    
    // 定数の定義
    const PLUGIN_NAME = "MyCount";
    
    // ---------- プラグインコマンドの定義 ここから ----------
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args){
	_Game_Interpreter_pluginCommand.call(this, command, args);
	if(command === PLUGIN_NAME){
	    switch(args[0]){
	    case 'add':
		$gameSystem.MyCount().add(args[1]);
		break;
	    case 'show':
		$gameSystem.MyCount().show();
		break;
	    }
	}
    };    
    // ---------- プラグインコマンドの定義 ここまで ----------

    // Game_System
    // プラグインのデータを保存するために
    // Game_Systemにオブジェクトを追加しておく
    // ---------- Game_System ここから ----------
    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;
    };
    // ---------- Game_System ここまで ----------


    // 自作クラス(オブジェクト)
    // ---------- Game_MyCount ここから ----------
    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){
	val = Number(val || 0);

	if(!Number.isNaN(val)){
	    this._count += val;
	}
    };

    Game_MyCount.prototype.show = function(){
	$gameMessage.add('現在のカウントは' + this._count + "です。");
    };
    
    // ---------- Game_MyCount ここまで ----------    

})();