RPGツクール素材メモ とかティラノスクリプトの話とか

同人RPGの制作で役立ちそうなスクリプト・プラグイン素材を書き留めておく

ティラノスクリプトのspineで(指定したタイミングで)SEを鳴らす

ティラノスクリプト公式のspineプラグインと言えば
https://tyrano.jp/sample/spine

だが、このプラグインにはページには書かれてない隠し機能がある。
コードを引用するならコレである↓

event: function(track, event) {
	TYRANO.kag.log("Event on track " + track.trackIndex + ": " + JSON.stringify(event));
	let data = event.data;
	let obj = {};
	if(data.name=="tyranoevent"){
		let array1 = event.stringValue.split(",");
		for(let key in array1){
			let tmp = array1[key].split(":");
			obj[tmp[0]]= $.replaceAll(tmp[1],'"','');
		}
		obj.stop="true";
		obj.next="false";
		TYRANO.kag.ftag.startTag(obj.tag,obj);
	}
}

(私はspine.3.7.jsを参照したが、バージョンが書かれてない方、spine.jsでも同じ記述だったので、こちらでも使えると思う)

このコードの意味は、『spineにtyranoeventというeventがあると、その文字列を解釈してティラノイベントとして実行する』である。
詳しく解説する。

元々spineには「イベント」という仕組みがある。
これはspineのアニメーションの途中、例えば「20フレームめに(ゲーム側に)情報をパッシングしたい時」などに用いる。
具体的には、アクションゲームに使えば、攻撃の起点や終点を示したりも出来るし、
例えばティラノスクリプトなら「アニメーションの途中でSEを鳴らしたい時」などに使える。

ティラノでspineを扱っていて、アニメーションに合わせて音を鳴らしたい……と考えた事は無いだろうか?
それを実現できる。

さてどうすれば実現できるか……だが、別にコードに手を加える必要は無く(既に隠し機能として実装されてるのだから)
手順に従うだけだ。
まずspineのアニメーション画面を開く。

そして「イベント」を作る。その名前をtyranoeventとする。
(話が前後するが、後で書くように、アニメーションのタイムラインにセットした後で)
その中の「文字列」に、実行したいティラノのコマンド名を書く。
と言っても解釈するのは、コードによれば

TYRANO.kag.ftag.startTag(obj.tag,obj);

との事なので、それに適した形で指定しなければいけない。(結構難しそうだが、”TYRANO.kag.ftag.startTag”でググると案外出て来る…)

とりあえずSEを鳴らしたい場合は、

tag:playse,storage:se.mp3,stop:true

と文字列に書いてやると鳴る。(se.mp3が通常の効果音と同じように、soundフォルダに置いてある前提)

アニメーションのタイムライン上、鳴らしたいフレームにイベントをセットするのも忘れずに。

さてこの状態でエクスポート、まぁいつもティラノでspineのアニメを流す為にやってるのと同じ事をすると、アラ不思議、SEが鳴るようになる。
(試してみると、けっこうタイミング取り辛くもあるが……)


私も試してないが、例えばSEだけでなく、spineのアニメに合わせてティラノのUIに変化を起こす、とかも可能だろう(理論上はティラノのイベントは全て扱えるはずなので)
割と革新的な事ではないかと。
なぜ公式ページに書かれてないかは知らないが、割とやってる事が難しいからだろうか……