🗯️

【clusterスクリプト】Shooterの銃を3段階に改造

2023/01/09に公開

テンプレートワールド「Shooter」にあるチャージガン、2段階で強さが変わるのですが、これを3段階に変えたいという質問を公式Discordで受けました。

Logicで対応するとかなり長くなる上、どうも私の回答したやり方だと不具合もあったみたいなのでスクリプトに書き換えてみた例です。
(ギミックを使わなければいけないので、ワールドクラフトでは活用できません)


方法の説明だけで中身の解説はほとんど付いていませんが、そのうちちょっと解説も追記できればと思います。

スクリプト自体の基本はこちらからどうぞ。
https://zenn.dev/vins/articles/25eb3c8fc7d96c

準備


まずは普通にテンプレートワールドをダウンロードし、Unityで開いて「Shooter」のシーンを開いてください。

テンプレートワールド『シューター』のススメ!
https://creator.cluster.mu/2020/10/09/templateworld-shooter/

強い弾を増やす

プロジェクトのClusterCreatorKitTemplate/Shooter/Prefabs/Items/Bulletから「StrongChargeBullet」を選び、Ctrl+D(Windowsの場合)を押すなどして複製します。

この複製してできた弾を「StrongChargeBulletB」という名前に変えましょう。さらに、それを一度シーンに配置して見た目も変えていきます。

今回はBulletのマテリアルをRoadConeMatに変えてみました。

見た目を変えた後は、インスペクターからプレハブの「オーバーライド」-「すべてを適用する」をクリックするのを忘れずに。

ここまで済んだら、「StrongChargeBulletB」の修正は済んだのでシーン上から[Delete]キーなどで消してかまいません。

改造した弾をシーンから消した

チャージガンの改造準備

ではChargeGunをヒエラルキーで右クリックし、「複製」します。
複製してできたChargeGun(1)を右クリック、「プレハブ」-「展開」をクリックしましょう。

好みでChargeGun(1)の名前を「ChargeGunB」などに変え、元のチャージガンから少し離した場所に移動させてください。

要らないコンポーネントを削除していく

今回はスクリプトで処理していくので、「ChargeGunB」のLogicやTimer関係のコンポーネントは全部外していきます。

Use Item Trigger、Item Timer、Item Logic、On Grab Item Trigger、On Release Item Triggerはぜんぶ右上のボタン(点3つのボタン)から「コンポーネントを削除」してください。

Create Item Gimmickを追加

残ったCreate Item Gimmickのうち、下にあるほうの右上のボタン(3点のボタン)から「コンポーネントをコピー」します。

そのまま、同じボタンから「新しいコンポーネントとして貼り付け」。Create Item Gimmickが増えます。

新しく増えたほうはKeyを「ShootStrongBulletB」に。
Item Templateには、さっき作った「StrongChargeBulletB」をプロジェクトからドラッグ&ドロップで指定してください。

これで、3つめの弾を撃つ部分はできました。
あとはスクリプトですね。

スクリプト

「ChargeGunB」に「コンポーネントを追加」でScriptable Itemを付けます。

Source Codeに以下のコードをコピペしてください。

$.onUpdate((deltaTime) => {
	if (!$.state.usingFlag) {
		return;
	}

	$.state.chargedTick += deltaTime;
	if ($.state.chargedTick >= 2) {
		$.state.chargedVal++;
		$.state.chargedTick -= 2;

		$.sendSignalCompat("this", "CompleteCharging");
	}
});

const reset = () => {
	$.state.chargedVal = 0;
	$.state.chargedTick = 0;
	$.state.usingFlag = false;

	$.setStateCompat("this", "using", false);
	$.setStateCompat("this", "charging", false);
}

$.onGrab((flag) => {
	reset();
	if (flag) {
		$.sendSignalCompat("this", "OnGrab");
	}
});

$.onUse((flag) => {
	if (flag) {
		$.state.usingFlag = true;
		$.setStateCompat("this", "using", true);
		$.setStateCompat("this", "charging", true);
	} else {
		$.sendSignalCompat("this", "Shoot");
		if ($.state.chargedVal == 0) {
			$.sendSignalCompat("this", "ShootWeakBullet");
		} else if ($.state.chargedVal == 1) {
			$.sendSignalCompat("this", "ShootStrongBullet");
		} else {
			$.sendSignalCompat("this", "ShootStrongBulletB");
		}
		reset();
	}
});

実行結果

スクリプトはUnity上では動かないので、ワールドアップロードして確認する必要があります。


アップロード後、新しくできたチャージガンを撃つとたしかに三段階で弾が変わることがわかります。

細かい部分の修正

上記実行結果は、実はもう少し細かい部分の修正もしています。

音について

今回のやり方のままだと、一番強い弾の音がでません。
「ChargeGunB」の子にある「Audio Sources/ShootStrongBulletSound」を複製しましょう。

あとは「ShootStrongBulletSoundB」などの名前にして、Play Audio Source GimmickのKeyを「ShootStrongBulletB」に変更。
好みで音の種類も変えましょう。

撃った後の銃のアクション

また、このままだと最強の銃を撃ったときのアクションも発生しません。
ChargeGunBの子にあるChargeGunを選び……

インスペクターからSet Animator Value Gimmickをコピーして、Keyだけ「ShootStrongBulletB」に変えましょう(Animater Parameter Nameは変えないこと)。

Discussion