プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【SRPG Studio】「スクリプトの実行」イベントのイベントコマンド呼び出しで新規イベントを実行する方法

スクリプトの実行」イベントでイベントコマンド呼び出しを使う場合の、スクリプトの作り方を含めたやり方が公式を読んでもよく分からなかったので調べてみました。

とりあえず動かす

スクリプトの実行」イベント画面でオブジェクト名(新規イベント名)を入力します。
今回は'SAUTO_LogEventCommand'としています。
f:id:shirakamisauto:20151216192434p:plain

後のほうで手順を解説しますが、読むのがめんどい方は以下をコピペしてプラグインを作ってPluginフォルダに突っ込んでください。
で、オープニングイベントかなにかで「スクリプトの実行」イベントを上記画像のように実行してください。
コンソールにログがいっぱい出ます。
なにか押すとポップアップが出てイベントが終了します。

(function() {

var LogEventCommand = defineObject(BaseEventCommand, 
{
	//独自のイベントコマンドを実装する場合は、ここで名前を返す らしい
	//要するにイベントコマンド呼び出しのオブジェクト名をここに定義
	getEventCommmandName: function() {
		return 'SAUTO_LogEventCommand';
	},

	//多分描画系の処理
	drawEventCommandCycle: function() {
		root.log('||');
	},
	
	//これを実行してEnterResult.OKを返さないとほかのメソッドが機能しないっぽい
	//実行したくない場合はEnterResult.NOTENTERを返せばいい
	enterEventCommandCycle: function() {
		return EnterResult.OK;
	},
	
	//画面がアクティブでない場合でも、何らかのアニメーション処理を行いたい場合は、
	//これをオーバーライドする。らしい
	moveEventCommandCycle: function() {
		root.log('||||||||||');
		//なにか入力時終了
		if (InputControl.isSelectAction()) {
			root.msg('OPEN THE EYES');
			return MoveResult.END;
		}
		
		return MoveResult.CONTINUE;
	}
}
);

var alias1 = ScriptExecuteEventCommand._configureOriginalEventCommand;
ScriptExecuteEventCommand._configureOriginalEventCommand = function(groupArray) {
	alias1.call(this, groupArray);
	
	groupArray.appendObject(LogEventCommand);
};

})();

手順解説

一言で言うと、新規イベントのスクリプトを作ってイベントコマンド呼び出しのオブジェクト名に紐づけています。

①イベントオブジェクトの生成
以下のコードでは、新規イベント用のオブジェクトを生成しています。

var LogEventCommand = defineObject(BaseEventCommand, {});

{ }にはbase-objects.jsのBaseEventCommand内のメソッドをオーバーライドしたものを中心に記述します。*1

②イベント処理に必要なコードの記述

前項の{ }内に必須なのはgetEventCommmandNameメソッドです。
イベントコマンド呼び出しのオブジェクト名に設定した文字列を戻り値に設定しないと動きません。

	getEventCommmandName: function() {
		return 'SAUTO_LogEventCommand';
	},

また、enterEventCommandCycleメソッドでEnterResult.OKを返さないとmoveEventCommandCycle、drawEventCommandCycleなどが動かないようなのでこれも必須です。

	enterEventCommandCycle: function() {
		return EnterResult.OK;
	},

③イベント実行のための処理
以下のコードで、「スクリプトの実行」イベント内に①で作ったイベントオブジェクトを登録しています。
スクリプトの実行」イベントでイベントが実行されるようになります。

var alias1 = ScriptExecuteEventCommand._configureOriginalEventCommand;
ScriptExecuteEventCommand._configureOriginalEventCommand = function(groupArray) {
	alias1.call(this, groupArray);
	//イベントオブジェクトを登録
	groupArray.appendObject(LogEventCommand);
};

④引数を使いたいとき
新規イベントに引数を渡したい場合は、以下の画像のようにテキストエリアにjson形式で入力します。
f:id:shirakamisauto:20151216192450p:plain
その後、以下のコードで取得し、

var arg = root.getEventCommandObject().getEventCommandArgument();

定義した引数名を以下のように参照すればOKです。
この場合は引数に渡した文字列がコンソール出力されます。

if (typeof arg.logtext === 'string') {//引数が文字列型か判定
	root.log('引数:'+arg.logtext);
}

*1:eventcommand-scriptexecute.js(「スクリプトの実行」イベントのソース)を見る限り、getEventCommmandName、enterEventCommandCycle、moveEventCommandCycle、drawEventCommandCycle、isEventCommandSkipAllowedだけしか実行できないっぽいです。