前回はトリガー・ギミックの基本をやりました。ここから第5回までで、

- ボタンを押すと敵が出てくる
- 乗り物に乗って、弾で敵を倒す
というゲームワールドを作ることを目指します!

今回は、上の画像のように「ハコを押すと弾が飛ぶ」「弾が的に当たると音が鳴り、的が一瞬消える」ワールドを作ることで色々なトリガーやギミックの使い方を学んでいきましょう!

サンプルプロジェクト
今回の作例は「cue_02」です。
この後の説明を読んでいっても「上手くできなかった……」という場合は、サンプルプロジェクトを見て、どこが違ったのかしっかり確認しておいてくださいね!
(発展形の、ハコが左右を向くパターンも入れてあります!)

組み合わせてみる……の前に準備
では実際にトリガーとギミックを組み合わせていきます。
ベースは第1回のサンプルプロジェクトでいきます。CUE_Assets/Scenes/CUE_01を開いて、そのシーンを名前を付けて保存。シーン名は「CUE_01b」とか適当で構いません。

そして3つ置いてあるCubeは消してしまい、【CCK_Items】というEmptyObjectを作って、座標を「X0 Y0 Z0」に。この子に、色々と付けていくことにしましょう。
ポイント
フォルダのように、何かのEmptyObjectの下にモノをまとめていくことはとても重要です! こうしないと、ワールド全体が把握しづらくなります。
箱を押すと弾が出る(Interact Item Trigger+Create Item Gimmick)
まずはCUE_Assets/Prefabs/StageObjectsから【SameUVBox(green)】を、【CCK_Items】の子としてシーンに配置。その後で、Unpack Prefabしておきましょう(*1)。


ハコに、上の画像のようにコンポーネントをつけていきます。Itemは自動的につくので意識しなくても大丈夫です。
ポイント
アイテムを生成するCreate Item GimmickのItem TemplateにはPrefab(Projectに保存したもの)を指定することに注意してください(*2)。
今回はテンプレートワールドプロジェクトのShooter/Prefabs/Items/BulletsからHandGunBulletというPrefabの弾を指定しました。
この弾は作られると同時に、前回使ったAdd Instant Force Item Gimmickで前に飛んでいってくれます。詳しくは今回の記事の最後のところにもう少し説明してあります!


また、どこにアイテムが出てくるか指定するために【SpawnPos】というEmptyObjectをハコの子として作っています。これのZの値を1.5くらいに変更し、ハコの少し前に移動させましょう(そうしないと弾が出た瞬間ハコにぶつかって消滅してしまうので!)。つくったらCreate Item GimmickのSpawn Pointを【SpawnPos】に設定しましょう。
- Interact Item Triggerが発生
- →Key「OnInteract」というメッセージをこのItem自身(This)に送る
- →Key「OnInteract」を受けとる設定になっているCreate Item Gimmickが発動する

……という流れになっていることを確認してください。
さて、プレイしてみると……ハコをクリックするたび、弾が飛んでいくようになりましたね! Create Item Gimmickはこのように弾を作るほか、敵を出したり床を出したり演出用のパーティクルを出したり……など非常に多くの場面で使うギミックです。

(*1) そのままOverrideしてPrefabを上書きしちゃうと、今後別の目的でSameUVBox(green)を使いたいときに困るので……
(*2) シーンの中に最初から配置してあるItemを複製するのにも使えますが、推奨されていません。
弾を当てる的をつくる
つづけて、この弾に対する「的」を作ってみます。

まず【CCK_Items】の子にEmptyObjectを作り、【MatoObj】などの名前にします。
さらにその子にCUE_Assets/Prefabs/StageObjectsから【GridMatQuad(orange)】を配置します。Unpack Prefabもしておいたほうがいいですね。さらに【MatoObj】の子にもEmptyObjectを作り、【CollideSound】などの名前にします。

この画像のような親子関係になったでしょうか?
(的そのものに色々コンポーネントを付けるより、EmptyObjectの子に的の見た目や音を入れる構造のほうがスッキリします! 特にワールドが大きくなってきたとき重要です)。
あとは【MatoObj】を動かして、ちょうど弾が当たりそうなところに置きましょう。
的にコンポーネントをつけていく

では【MatoObj】に、画像のようにコンポーネントをつけていきます。衝突を検知するOn Collide Item TriggerのほかItem Timerも出てきて、ちょっと複雑になってきましたね!(*3)

「ShowHide」というKeyにはSignalではなくBoolが指定されていることに気をつけてください。
単に「○○のギミックを起動しろ」といったメッセージを送るときはSignalを指定しますが、「ON/OFFの値を送りたい(Bool)」「数字を送りたい(Integer、Floatなど)」といった時はSignal以外を指定する必要があります。

またこの中で、Rigidbodyは付けるのを忘れやすいのでご注意を! 当たり判定を取るときは、Rigidbodyをつけておきましょう。
ポイント
RigidBodyのUseGravityのチェックマークを外してIsKinematicをONにすれば、無意味に物理法則で動くこともなくなります。
的の表示・非表示、音の再生

続けて【GridMatQuad(orange)】にはSet Game Object Active Gimmickを付けてあげます。TargetはItem、Itemに【MatoObj】を指定します。
これで、【MatoObj】に送られた「ShowHide」というBoolのメッセージ(ONかOFF)を受けとって表示・非表示の切り替えができるようになります。


最後に【CollideSound】にはPlay Audio Source Gimmickを付けて、上の画像のように設定します。自動でAudio Sourceも付くので、CUE_Assets/Audioからcue_se_dom00辺りの音を付けてあげます。

このようにしてプレイボタンを押すと……弾が当たったとき、音が鳴って的が一瞬消えるようになりました!
(*3) ちなみにタイマーはトリガーでもギミックでもなく「オペレーション」という名前で呼ばれていますが、トリガーの一種だと思えば問題ないと思います。
Targetについて
ここまで見てきて分かる通り、トリガーやギミックの中にはTargetという項目があります。


This | そのItem自身にメッセージを送る。一番よく使う。 |
Item | 指定したItemにメッセージを送る時に使う(ただし、自分自身を指定しても構わない)。Specified Itemと表示されることも。 |
CollidedItemOrPlayer | On Collide Item Triggerでのみ使える。ぶつかったPlayerやItemにメッセージを送る。 |
Player | プレイヤーにメッセージを送る。LocalPlayerと表示されていることもある。 |
Owner | そのItemのOwner(持ち主)であるプレイヤーにメッセージを送る。Ownerはやや難しい考え方だが、基本的にItemをクリックした人、Itemを持っている人などがOwnerになる。 |
Global | 「グローバル」にデータを送る。ゲーム全体に関わるデータや処理などで使う。 |
Targetにはこういった種類がありますが、まず覚えたいのはThisとItem(Specified Item)の違いです。
Thisは本当にそのItem自身にメッセージを送るだけで、一番よく使います。ハコのInteract Item Trigger→Create Item Gimmickに「OnInteract」を送るなど色々な場所で使っていますね。
一方Item(Specified Item)は、自分以外を指定することもできるわけです(*4)。
だから【MatoObj】に来た「OnCollide」というメッセージを別の【CollideSound】が受けとって、Play Audio Source Gimmickで音を鳴らすようなこともできているんですね!
またPlayerにメッセージを送ることもできます。これは第3回以降でやっていきます!
(*4)Item TimerやItem Logicからは別のItemにメッセージを送れない……など、Targetが限られているケースもあります。個別に確認を行っていってください。)
今回の構造
今回は少し複雑になったので、どうなっているのかを図で示しておきます。

また、以下の内容は、今回ちょっと難しかったな……という人はスルーしてもいいです!
サンプルプロジェクトだけは見ておいてください!

第3回:BGMや速度変更!
第2回で「トリガー」「ギミック」の基本を覚えたら、少し応用編です。
第3回ではワールドでの体験を彩るBGMの設定方法とアバターの移動スピードの変更について解説します。
ゲームワールドだけでなく、さまざまなワールド制作に応用できるテクニックです。「ロジック」についても少し解説します。

発展形:ハコが左右を向くようにする!
このままだと、弾は必ず的に命中しますね。少しゲームっぽくするため、ハコが左右に回転するようにしましょう。
【SameUVBox(green)】にUnity標準のAnimatorを付けてあげます。このときAnimatorのApply Root Motionにチェックを入れてください。
そしてControllerには、CUE_Assets/Animations/common/Rotateから【60RotateAnim】を選んでください。
すると、ハコが左右30度ずつ回転するようになりました! 弾が飛ぶ方向も変わったので、これなら的に毎回当たるわけではないですね!
HandGunBulletもちょっと見てみる
今回使った弾、HandGunBulletの中身も見てみましょう。トリガー・ギミックに加えてロジックも付いており難しいかもしれませんが、注目したいのはDestroy Item Gimmick。

そう、CreateしたItemをそのまま放置しておくと、ワールドがItemだらけになって大変なことになります。なのでこの【HandGunBullet】は、何かにぶつかった時と1秒経過したとき自分を破壊するようにしているんですね。
このほか、前回も登場したAdd Instant Force Item Gimmickで前に飛ばす、On Collide Item Triggerで当たった相手にメッセージを送る、などの形で構成されています。
プログラミング経験があれば何をやっているのかうっすら分かると思うので、【HandGunBullet】の中身はひと通りながめておいてください。