🔫

clusterイージースクリプト 04銃と的編

2024/07/20に公開

まだ「clusterイージースクリプト」のインストールが済んでいない人は先に済ませてくださいね。
こちらの記事からどうぞ。

銃と的のサンプル

今回はイージースクリプトの中でも中級者向けと言えるかもしれません。
アイテムとアイテムの間の通信要素があります。

「イージースクリプト」フォルダの「銃サンプル」と「撃たれるサンプル」プレハブをシーンにドラッグアンドドロップしましょう。

こんな感じに調整
このとき「撃たれるサンプル」は床に埋もれがちなので、シーン上か「インスペクター」から位置を調整してあげてください。


銃を持って「使う」と弾が出ます。
的に当たると「ダメージ」の数値が増えていきます。

銃スクリプトの内容は?

まず「銃スクリプト.js」。

ee.use = (isOn) => {
	if(isOn){
		signal("make");
	}
}

非常にシンプルですね。
「使う」をしたときにsignal("make")というのを呼び出しているだけです。

signalは、アイテムにつけたCCKのコンポーネントを呼び出したいときに使います。

このアイテムの場合、Create Item Gimmickがついているんですね。posの位置と角度で弾を生成します。
そのKeyが「make」なので、signal("make")と書いているのです。

弾スクリプトの内容は?


ところで、このとき作られる弾アイテムにもスクリプトはついています。
なので、「弾Aスクリプト.js」も見てみましょう。まあまあフクザツな構造ですね。

ee.start = () => {
	val0 = 2;
}

ee.main = () => {
	if(tick >= 1.5) {
		destroy();
	} else {
		moveForward(10);
		val0 = val0 - currentDelta*10;
		move(0,val0,0);
		let target = findItemFirst(0.5,0.1);
		if(target) {
			target.send("damage",10);
			signal("make");
			destroy(0.15);
		}
	}
}

val0の利用

まずee.start、弾ができた瞬間に呼ばれるところですが、val0 = 2とあります。
val0、val1、val2、val3は特に何を考えなくてもデータが残る(普通は$.stateというのをつけないといけない)ので、扱いやすいです。

mainのほうでは、まずtickが1.5を超えていたら破壊(destroy)しろとなっています。
tickというのはこのアイテムができてからの秒数を自動で記録している便利な変数です。

で、elseは「さもなくば」でしたね。
まだ1.5秒経っていないなら、まずmoveForwardで前に秒間10mのスピードで飛びます。

val0 = val0 - currentDelta*10;
ここからはややこしい。
先に結論を言うと、「段々落とす」ための処理をここからの2行で表現します。

弾は落ちていく

currentDeltaには、前にmainに来てから何秒経ったか入っています。普通は0.03秒とか0.015秒とか非常に小さい数です。

要するにここは、「val0を、時間が過ぎるごとに減らせ」という命令なんです。

そしてmove(0,val0,0);です。moveの2番目は「上下」です。
まとめると、val0の値に応じてアイテムを上下させろってことです。

val0は、ee.startで設定したとおり最初は「2」です。つまり上に飛びます。
ところが段々それが減ってくる。あまり上に飛ばなくなって、ついには落ち始めるという表現です。

近くのアイテムを探す

さらにスクリプトは続きます。

let target = findItemFirst(0.5,0.1);
これは0.5m以内にあるアイテムを探す命令です。少し重めの命令なので0.1秒に1回だけ実行します。

さて、if(target)とあります。これは前の行でアイテムを探した結果が入っているtargetに、何か入っているかをチェックしているんですね。
もし何かアイテムが見つかっていたら、

target.send("damage",10);
signal("make");
destroy(0.15);

この3行が実行されます。

まずぶつかったアイテムに 「10」の「damage」というメッセージを送信(send) します。
そして弾を作ったときと同じsignal("make")、これはぶつかったときのエフェクトを出します。
最後にdestroy(0.15)。この弾を破壊するのですが、いきなり破壊するとなぜかsendが相手先に送られません。なので0.15秒だけ待ってから破壊しています。

的スクリプトの内容は?

そして最後に的の「撃たれるスクリプト.js」。
やっぱりフクザツですが、撃たれたときに震える部分がかなり長いです。


今回はもうだいぶ長くなっていますから、ちょっとシンプルにして、ダメージが増えるとこだけ見てみましょう。

ee.receive = (message, val, sender) => {
	if(message =="damage") {
		setFlag(0, val0+val);
		setText("ダメージ:" + val0);
	}
}

元のスクリプトより随分シンプルになりました。

ee.receiveは、さきほどの弾Aから送られてきたsendのメッセージを受信します。
if(message =="damage")は、「もしdamageというメッセージだったら」ですね。

setFlag(0, val0+val);は、val0にvalを足して、それをval0の中に保存しています。
valには弾Aから10が送られてきている。要するに、毎回値が10増えます。

そしてsetTextで、「ダメージ: 10」「ダメージ: 20」のようなテキストが表示されます。

Discussion