こんにちは!😀この記事では的あてゲームの作り方を紹介します!

サンプルデモプロジェクト
実際に触りながら確認できるデモプロジェクトはこちら
各コンポーネントについての詳細は公式ドキュメントをご確認ください
自分の好きなモデルを用意しよう!
使用するアセット

今回は、射的ゲームの土台となるワールド作りと、銃とターゲットのモデルとして「POLYGON – Starter Pack(無料)」を使用して作っていきます。

こんな感じに、銃とターゲットを用意すればOKです!
1.撃てる銃のセットアップ
掴めるアイテムをつくる
アイテム化をするときは、モデルそのものではなく、親のGameObjectを作ってアイテム化すると後でモデルの差し替えなど調整しやすくなるのでオススメです👍


こんな感じでアイテムを掴めるようになったらOKです!
Grip設定をするとアイテムのどこに触れても意図した方向に構えられるように出来るので、作りたいものに合わせて設定してあげましょう
アイテムの作り方はこちらの記事でも紹介しているので、参考にしてみてください。
「トリガーを引いたら弾が出る」ギミックをつくる

弾を出す仕組みは実に簡単で、「トリガーを引いたときに撃つ」ことを「検知して弾を出す」だけ!
では実際に組み込んでみましょう!👌
アイテムを手に持っているときのアクションを作りたいので、Gunアイテムに「Use Item Trigger」コンポーネントを追加します。

「マウスクリック(デスクトップの場合)が押された時(Down Triggers)」に、「自分自身(This)」に「発砲(fire)」した「信号(Signal)を送りたいので画像のように値を設定しました。Up Triggersは今回使用しません。

これだけではただ「fire」というメッセージを送っただけなので、トリガーによって引き起こる弾が出るギミック(仕掛け)を作っていきましょう。
弾を出す対象は同じく自分自身なので、Gunアイテムに対して「Create Item Gimmick」コンポーネントを追加します。
「 Create Item Gimmick」はアイテムを生成する仕掛けを作るコンポーネントで、「どんな対象から」「どんなメッセージのとき」「指定したアイテムを」「指定した出現ポイントに生成する」ことを設定できます。

今回はアイテムがトリガーを引いた時に送られる「fire」を受け取って弾を出したいのでKeyに「fire」を設定しましょう。
次は生成する弾を用意しましょう!💪
「弾」アイテムのPrefabを用意する

ここでは3D ObjectのCapsuleを弾に見立てて用意しました。
お好きな3Dモデルやアセットを利用してももちろんOKです!
弾は位置が同期されていれば良いので「Movable Item」を適用、さらにRigidbodyのMass(質量)を0.3、Collision Detection(衝突検知)をContinuous Dynamicに変更して衝突を検知しやすいようにしました。

弾のアイテムを作成したら、これをPrefab化して汎用的に利用できるようにします。「Project」ウィンドウにPrefabフォルダを作成し、ドラッグアンドドロップでPrefabに出来ます。

弾は常に表示されているものではなく、トリガーを引いた時に出てきて欲しいので、PrefabにしたらScene内からは削除しましょう。
最後に、弾が生成される位置となるGameObjectを作り、Create Item Gimmickに「作った弾のPrefab」と「生成位置」を設定したらプレビューで試しに撃ってみましょう!

いざ、試し打ち…?

飛ばない…!!でもそれで合ってます👌
そうなんです、「トリガーを引いて弾が出る」ようになっただけで、どんな強さで飛んでいくのかは設定していませんでしたね。
トリガーとギミックの仕組みはこんな感じに、様々な状態や挙動を分けて制御することが可能です。
弾の挙動を設定しよう!
作った弾のPrefabをダブルクリックして、Prefabの編集を行います。
弾が生成されたときに飛んでいって欲しいので「On Create Item Trigger」を使ってアイテムが生成されたときにギミックを発動させるトリガーコンポーネントを追加。
合わせて、弾を飛ばすためにある方向に力を加えることが出来る「Add Instant Force Item Gimmick」を追加します。

「On Create Item Trigger」は弾が飛ぶためのメッセージを送りたいのでKeyを「shot」に、信号を送りたいのでParameter Typeは「Signal」にしました。
「Add Instant Force Item Gimmick」は、トリガーのメッセージを受け取って発動させるのでKeyに、トリガーと同じ「shot」を設定。
「Space」は力を加える基準となる座標軸を設定する項目で、この場合は弾自体が持っている座標軸を使用したいので「Bullet」を指定しました。
「Force」は各座標に対して加える力の強さを設定する項目です。アイテム自体に設定されたRigidbodyのMass(質量)やその他設定に依存するので、とりあえずZ軸方向に10を設定しました。
Prefabの編集が済んだら、Sceneウィンドウ右上にある「Save」を押すか、Ctrl+S(MacはCmd+S)でPrefabを保存して完了!改めてプレビューで確認してみましょう!


やりました💪😆✨ついに銃で弾を発射できるようになりました!
弾が飛ばない場合:弾が生成されたときに銃本体と接触している可能性があります。 Gunアイテムに設定したCreate Item Gimmickの「Spawn Point」に指定したGameObjectの位置を本体から少し離して再度試してみましょう!
🔫 発砲したときの音を付けよう!
やっぱり銃を撃つからには「バァーン!」と効果音が出て欲しいですよね!簡単に実装できるので、サクッと紹介します!
音は、発砲(fire)した時に音を鳴らしたいので、Gunアイテムに対して「Play Audio Source Gimmick」を追加します。
音源のパラメーターを設定するための「Audio Source」が自動的に追加されるので、鳴らしたい音源ファイル(mp3など)を「AudioClip」の項目にドラッグアンドドロップします。

Gimmickの発動条件は、fireのメッセージを受け取ったとき、Gun自身が音を鳴らすようにしたいので、下記のように設定しました。

これで発砲したときに音が鳴るようになりました🎉
聴こえる音の範囲設定はこちらの記事で紹介しているので参考にどうぞ
弾が残ってる?

プレビューで楽しんでいると、撃った弾が永遠にワールド内に増え続けることに気付きました。
Create Item Gimmickで生成したアイテムはDespawn Height以下で消滅するので、床などに残ったアイテムはそのまま残ってしまいます。
Capsuleぐらいの簡単な3Dオブジェクトなら数百発くらい特に問題ないかもしれませんが、必要以上にオブジェクトを描画することは負荷になるので、撃って落ちた、壁にあたった弾などは無くなるようにしようと思います。
撃った弾が残らないようにする
Prefab化した弾(Bullet)に「On Collide Item Trigger」を追加します。これは、アイテムが指定のものと衝突したときに発動させるトリガーです。
ここでは壁や床などのコライダーに当たったときに弾が消えるようにしたいので、Collision Event Type(トリガーを発動させるタイプ)をEnter(判定に入った時)、Collision Type(判定の種類)をCollision(衝突)にします。
判定が起きたときに、消滅するためのメッセージを送る必要があるので、TriggersのKeyに「destroy」を設定しました。
アイテムを消滅させるには、「Destroy Item Gimmick」を使用します。トリガーに設定したターゲットは自分自身なのでThis、Keyに衝突したときに送信する「destroy」を設定すればOKです!

設定が完了したら、弾が床や壁などコライダーが設定されているオブジェクトに当たった時に消滅するのを確認しましょう!
銃の完成!
お疲れさまです!👍✨長い道のりでしたが、これで銃のセットアップは完了です!
作ったアイテムは汎用的に使えるようにPrefab化しておくと、ゲームワールドを作るときに複数設置するなど便利に扱えるのでオススメです!
2.ターゲットのセットアップ
さて、次は撃った弾がターゲットに当たったときのリアクションを作っていきます!要領は今までと同じで、トリガー(きっかけ)に対するギミック(仕掛け)を設定していけばOKです👌
それではやってみましょう!🎯
「ターゲットに当たった」場合の判定をつくる
Prefab化したBullet(弾)にターゲット用のトリガーを追加します。
On Collide Item TriggerのTriggersのサイズを1→2に変更します。

トリガーで送るメッセージの対象は自分自身ではなく、衝突した対象に向けて送りたいのでTargetを「CollidedItemOrPlayer(衝突相手のアイテムかプレイヤー)」に設定します。
衝突したときのメッセージなのでKeyに「hit」、Parameter Typeを「Signal」にして完了です。
ヒットしたことがわかる音を出す
衝突対象として「CollidedItemOrPlayer(衝突相手のアイテムかプレイヤー)」を設定したので、コライダーが付いているターゲットをアイテム化します。

弾以外のアイテムと衝突したときに物理的な移動を伴わないので、つけるコンポーネントは「Item」だけでOKです。
銃を発砲したときに音を出すときと同じように、音を出す条件は下記のように設定して完了です。

音が鳴るようになったのでヒットしたことはわかるようになりましたが、動きがないので少し変化をつけてみましょう!
アニメーションでターゲットを回転させる
Targetアイテムに「Set Animator Value Gimmick」を追加します。これはアニメーションを扱うギミックコンポーネントです。追加すると自動でAnimatorも追加されます。
各種項目は画像のように設定しました。Animator Parameter Nameは後ほど設定するので空欄でOKです。
アニメーションをつくる
UnityのメニューにあるWindowからAnimation -> Animationを選択して、「Animation」ウィンドウを表示させます。

Targetアイテムを選択した状態でAnimationウィンドウ内の「Create」を押して、アニメーションファイルを作成します。当たったときに回転するアニメーションにするのでファイル名は「HitRotation.anim」にしました。

作成すると、animファイルと一緒にAnimationControllerが生成されますが、あとで使用するので先にアニメーションを作っていきましょう。
回転するアニメーションをつくる
アニメーションを作成するには、REC(録画)ボタンを使うと便利です。RECが有効の状態でオブジェクトに変化を与えると、自動的にアニメーションキーフレームが追加されます。

まず最初にアニメーションの初期状態を追加し、0.30の時点で一回転するように設定しました。
アニメーションの作成が終わったら必ずRECボタンをOFFにするようにしましょう。
それではプレビューで確認してみましょう!

プレビューしてみると、アニメーションが繰り返し再生されるようになっていました。
回転のアニメーションは弾があたった時に再生して欲しいので、状態に応じたアニメーションの挙動を設定できるAnimationControllerを編集していきます。
弾が当たっていない状態をつくる
まず、AnimationControllerをダブルクリックで編集画面に移行します。

弾が当たっていない時の何も起きない状態を作りたいので、画面内の空いているスペースを右クリックして空のステータスを作成します。わかりやすいように名前をDefaultとしました。
アニメーションの初期状態を作成したDefaultにしたいので、右クリックから「Set As Layer Default State」を押して完了です。これで初期状態の設定はOKです!
弾が当たったときにアニメーションするように設定
次に、ターゲットに弾がヒットしたときのトリガーでアニメーションを発火させるためにAnimatorウィンドウ内のParametersに移動し、「HitTartget」という名前のTriggerを作成します。

任意の状態から弾が当たったときにアニメーションを再生させるために、Any Stateを右クリックして「Make Transition」で、HitRotationのStateに矢印をつなげます。

続けて、どんな状態のときに遷移させるのか指定します。矢印をクリックしてConditionsの項目にある「+」で状態を追加します。一つ前で設定した「HitTartget」というトリガーになっていればOKです。
また、今回の場合はヒットしたときに即回転して欲しいので、TransitionのSettingsを開いて「Transition Duration(s)」を0に変更してアニメーションの移行時間を無くすと、連続ヒットさせたときに気持ちよく回転するようになります。

設定が終わったらAnimationControllerをTargetアイテムのAnimatorに設定し、空欄にしておいたSet Animator Value Gimmickの「Animator Parameter Name」にTriggerとおなじ名前の「HitTarget」を設定すればOK。
最後に、アニメーションがループ再生されないように、HitRotationファイルの「Loop Time」のチェックを外して完了です!
ではプレビューでターゲットを撃ってみましょう!

ターゲットに当てたときに回転するようになりました!連続で当てると気持ち良いですね!🔫😎
これで今回の紹介は以上になります!お疲れさまでした🎉👍
最後に


今回作った銃や弾などはPrefab化することで、モデルやマテリアルの差し替えだけでも様々なバリエーションを作ることが出来ます!一度作ったアイテムや仕掛けのPrefabは他のワールド制作でも使い回すことが出来るので、ぜひトリガー・ギミックを使って面白いゲームを作ってみてください!