Help us understand the problem. What is going on with this article?

RPGツクールMVのプラグイン開発環境の作り方

More than 3 years have passed since last update.

海外で話題沸騰のRPGツクールMV(RPGMaker MV)ですが、
まだ、日本語版はベータテスト中とのことです。
今回は、このRPGツクールMVのプラグイン開発環境の作り方を簡単に紹介したいと思います。

このRPGツクールMVのすごい所は、なんといっても、
一回作ったら Windows, Mac, Android, iOS, Webのアプリとして
ゲームを出力する所もそうなのですが、
それよりも今回は、 Node.js で作られていることもあって、
プラグインが作りやすく、 ぶっちゃけなんでもできる!という所が本当にすごい所です。

こんなゲームをすぐ作ってWeb公開することができます。

このRPGツクールは、 Node.jsの nw.js がベースとなっており、
描画エンジンは、Pixi.js、両方のAPIをある程度調べれば
普通のデスクトップアプリから、RPG以外のジャンルのゲーム、ネトゲまでも実装可能です。

ではプラグインの開発の仕方を説明してきます。

1. プラグインを適用するゲームを作る

今まで通りのRPGツクールの作り方でゲームを作っていきます。
ある程度欲しいプラグインを動作させる下地ができたら完了です。
ここでは簡単なマップだけ作成しました。

2. WebKitのディベロッパーツールの起動

ゲームを起動して、F8ボタンを押すことで、ディベロッパーツールを起動できます。
好きな所でブレークポイントを止めたり、プロファイルをしたり、
コンソールで対話的にプログラムでゲームを動かすことすらできます。

ディベロッパーツールは基本Chromeと同じことができますので、
使い方は、Web開発でよく使う、特に使えるChromeデベロッパー・ツールの機能などが勉強になります。

3. 自分が作りたいプラグインのファイルを作る

お好みのエディタ(自分は Visual Studio Codeを利用)で、
次に自分の作りたいプラグインの雛形を作ります。ここでは、WalkCount という
名前の歩いた歩数を数えるプラグインを作成します。場所はゲームフォルダのjs\pluginsフォルダです。

js\plugins\WalkCount.js
(function() {

})();

このようにひな形を用意して、プラグインを追加します。

js\plugins.js
// Generated by RPG Maker.
// Do not edit this file directly.
var $plugins =
[
{"name":"WalkCount","status":true,"description":"","parameters":{}}
];

無論、GUIからプラグインをオンにすることもできます。
よくみたらコメントに直接編集するなと書いてありますねw

4. フックするポイントを探して実装する

何をしたいのかにもよりますが、ディベロッパーツールを起動して、
ProfileからCPUの動作を記録することで、どこが動いたのかを目星をつけることができます。

Profileタブを起動して、Startボタンを押し、フックしたい動作をした後に、
Stopで、プロファイル結果を見てみましょう。

どうやら、キャラクターが移動するときに呼ばれるのは、Game_Player.prototype.executeMoveのようです。
それをフックするように実装してみます。

js\plugins\WalkCount.js
(function() {
    var moveCount = 0;
    var _Game_Player_prototype_executeMove = Game_Player.prototype.executeMove;
    Game_Player.prototype.executeMove = function(direction) {
        _Game_Player_prototype_executeMove.call(this, direction);
        moveCount++;
        console.log("moveCount: " + moveCount);
    };
})();

これで動く度に、移動距離がカウントされ、開発ツールのConsoleにmoveCountを
コンソールに出力するようになりました。

なおこの書き方は、基本的に提供されているAPIをオーバーライドして
フックする基本的な書き方になります。
Function.prototype.call()を利用して、this というclass自体の
プロトタイプのインスタンスを渡して元の関数を実行します。

5. ゲームのオブジェクトを好きなように動かす

せっかくなので、10マス歩いたらメッセージを表示するようにしてみましょう。
このRPGツクールMVでは、シーンに紐づく全てのオブジェクトが SceneManager のプロパティから
辿れる他、$から始まるグローバル変数に様々なゲームオブジェクトが保存されています。

また$から始まるグローバル変数は特別で、ここに入っている情報を
描画するメインのループが回収して、様々な動作を行ってくれます。

ここでは、$gameMessage というグローバル変数のオブジェクトにメッセージを追加して
メッセージを表示させてみましょう。

js\plugins\WalkCount.js
(function() {
    var moveCount = 0;
    var _Game_Player_prototype_executeMove = Game_Player.prototype.executeMove;
    Game_Player.prototype.executeMove = function(direction) {
        _Game_Player_prototype_executeMove.call(this, direction);
        moveCount++;
        console.log("moveCount: " + moveCount);
        if (moveCount == 10) {
            $gameMessage.add("I'm very tired...")
        }
    };
})();

これで、 10マス歩くと「I'm very tired...」と表示されるプラグインが完成しました。
とっても簡単です!

終わりに

基本的にプロジェクトのフォルダ内に全てのJSのソースコードがあり、
読むことで何をしているのかがわかるようになっています。

ヘルプにもいろいろ情報はありますが、
ソースコードを読んだ方がいろいろハックしやすそうです。

また、Node.js で動いているので、基本なんでも作れてしまうのですが、
日本語版がリリースされたあと、面白いプラグインがたくさん出てくれば良いなと思います。

また、RPGツクールMVのAdventカレンダーもありますのでぜひぜひ参加してみましょう。

おまけ: エントリーポイントとなるグローバルオブジェクト群

なんとかManagerと$付きのグローバル変数全部。
これ覚えておくと、いろんなことがやりやすいです。

Utils
Graphics
Input
TouchInput
Html5Audio
JsonEx
DataManager
ConfigManager
StorageManager
ImageManager
AudioManager
SoundManager
TextManager
SceneManager
BattleManager
PluginManager
var $dataActors       = null;
var $dataClasses      = null;
var $dataSkills       = null;
var $dataItems        = null;
var $dataWeapons      = null;
var $dataArmors       = null;
var $dataEnemies      = null;
var $dataTroops       = null;
var $dataStates       = null;
var $dataAnimations   = null;
var $dataTilesets     = null;
var $dataCommonEvents = null;
var $dataSystem       = null;
var $dataMapInfos     = null;
var $dataMap          = null;
var $gameTemp         = null;
var $gameSystem       = null;
var $gameScreen       = null;
var $gameTimer        = null;
var $gameMessage      = null;
var $gameSwitches     = null;
var $gameVariables    = null;
var $gameSelfSwitches = null;
var $gameActors       = null;
var $gameParty        = null;
var $gameTroop        = null;
var $gameMap          = null;
var $gamePlayer       = null;
var $testEvent        = null;
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away