最終回の今回は、第5回までで作った乗り物で敵を撃つワールドをベースに、発展させるためのアイデアを示します!
できるだけ多くのアイデアを示すようにするため、これまでよりは短い説明です。サンプルプロジェクトと見比べて理解するようにしてください!
発展1:敵が前に進んでくる

【8LegEnemyPrefab】に、
On Create Item Gimmick | Item Timerを呼び出すSignalを追加 |
Item Timer | 1秒ごとにAdd Instant Force Item Gimmickを呼び出す。Item Timer自身も呼び出すことでループさせる |
Add Instant Force Gimmick | 前に進ませる |
……を付ければ段々と前に進んでくるようになります。
発展2:ゲーム開始ボタン。徐々に敵が出る

今ある【RoundButton】を消して、別のボタンを配置。
そのボタンの子にEmptyObjectを作り、【SpawnPos】などの名前に。Animatorで適当な範囲を動くようにします。
Interact Item Trigger | ボタンを押したとき、1つ目のItem LogicとItem Timerを呼び出すSignalを送る。 |
Item Logic | 初期化。「enemyNum」というInteger 0(Constant)のメッセージを自身(This)に送る |
Item Timer | 一定時間間隔でCreate Item Gimmickと2番目のItem Logicを呼び出す。 |
Create Item Gimmick | 【SpawnPos】の位置に8LegEnemyPrefabを生成 |
Item Logic | 「enemyNum」に1を足す(=Add Integer 1)。20未満なら(=LessThan Integer 20)ItemTimerを呼び出してループさせる |
これにより、ボタンを押すと20体まで順番に敵が出てくるようになります。Set Game Object Active Gimmickで、ゲーム中はボタンを消すのもいいですね。
発展3:敵を倒すと得点が入る

敵を倒したときの得点。こういうUI系は、UnityならCanvasで2D表示するのが普通ですね。CCKではPlayerLocalUIというもので実現します。

画像のようにヒエラルキー上で右クリックすると、「UI」からPlayerLocalUIの生成を選ぶことができます。自動で【SafeArea】というオブジェクトもできるので、【SafeArea】の子にTextやImageなどUI関係のオブジェクトを配置していきましょう。
さて、得点はゲーム全体に関係するものなので、Global Logicを使います。

【8LegEnemyPrefab】にGlobal Logicを付け、Key「OnDead」でTargetはItem(【8LegEnemyPrefab】自身)にします。そしてGlobalに「OnEnemyDestroyed」というSignalを送信。


別途【GlobalScoreManager】のようなEmptyObjectを作り、そこにGlobal Logicを付けて「OnEnemyDestroyed」を受けとります。「score」という変数を+1していくようにしましょう。 あとは【PlayerLocalUI】の【SafeArea】にTextオブジェクトを追加し、そこにSet Text GimmickをつけてGlobalの「score」を表示すれば得点表示もできます。
{0:D3}というのは、「数字を3桁で表示しろ」という意味です。{0:F2}(小数を第2位まで表示しろ)も覚えておくと良いでしょう。
発展4:緑の弾はSHOT POWERを消費する

SHOT POWERが溜まっていないと緑の弾を撃てないようにしてみます。連射に制限をつけ、2つの武器を使い分ける面白さとかも出すやり方です。


【PlayerEnergyManager】といったEmptyObjectを作り、Player Timerを付けます。このタイマーをOn Join Player Triggerから起動させ、そこからPlayer Logicを起動。このPlayer Logicでは一定間隔で「energyVal」という名前の変数を増加させます。
Player LogicのMinやClampを使えば、エネルギーが溜まりすぎないよう調整することもできます(ここでは最高値を100にしています)。さらに「energyRate」で、エネルギーが何%溜まっているかも計算。


【PlayerLocalUI】の【SafeArea】にImageを追加し、ImageTypeをFilledに。Set Fill Amount Image Gimmickを付け、TargetはLocalPlayerでKeyは「energyRate」にします。これはエネルギーが何%溜まっているかの数値でしたね。
あとは【ButtonA】の「OnInteractButton」で動くItem Logicで、Ownerの「energyVal」が一定以上(=GreaterThanOrEqual)の時だけ「CreateBullet」が発動するようにします。そして「CreateBullet」が発生したときは、Ownerの「energyVal」をいくらか減少(=Subtract)するようにしてください。
ポイント
Ownerというのはちょっと難しいのですが、基本はそのItemを最後にクリックした人がOwnerだと考えれば良いと思います。なので、ボタンを押した人の「energyVal」が溜まっているかどうかを見たり、それを減らしたりできるわけです。
発展5:敵がぶつかるとダメージ


タワーディフェンスゲームをイメージし、敵がぶつかるとダメージを受ける「司令部」を作るのもいいですね。と言っても、中身は敵のHP減少とほとんど同じ形で作れます。
ただ、敵が当たったときだけ反応するように、8LegEnemyPrefabにOn Collide Item Triggerを付け、CollidedItemOrPlayerに「EnemyHit」というSignalを送るようにしましょう。HP減少はこの「EnemyHit」に反応するようにします。
サンプルプロジェクトA

これらをすべて実装+αした作例が「cue_06A」になります!
乗り物から敵を撃つ、タワーディフェンス風のゲームになっています。上記の説明だけでは分からなかった方も、「cue_06A」を見ていけばわかるかと思います!

展覧会をイメージしたサンプルプロジェクトB

また、展覧会ワールドをイメージした「cue_06B」も用意しています!

場所によってBGMを切り替える

On Collide Item TriggerでCollidedItemOrPlayerに「PlayMainBGM」のメッセージを送れば、最初から同じBGMではなく、ある場所を通過したらBGMが鳴る……という形にできます。複数のBGMの切り替えも可能です!

こんな風にMeshRendererをオフにして見えないようにし、BoxColliderのIsTriggerをONにして通り抜け可能にすれば「見えないけど通過したら何かが起きる」場所を作れます。
エリアに入るとエリア名の画像が出る


同じく見えないコライダーを使い、PlayerLocalUIの子に配置したImageをSet Game Object Active GimmickやSet Animator Value Gimmickで表示させれば、「ここは○○ゾーンです」などのイメージを表示することも可能です!
(ちなみにサンプルプロジェクトAでも、ゲーム開始時に似た仕組みを入れています)


ただ、そこを通るだけで何度も同じメッセージが出るのはおかしいですね。サンプルでは、「FIRST FLOOR」と表示された後に階数を記録し、ワールド入室直後か2階に行った後にだけメッセージを表示するようにしています。
座ると画像が出るイス



イスに乗ったとき・降りたときに発動するギミックをつけ、「IsSittingA」などのKeyで座っているかどうかを保存します。


Set Game Object Active Gimmickは2DのUIにも使えるので、Imageを表示・非表示することもできるわけですね!
サンプルプロジェクトA・Bとも、好きなように改変して、clusterのワールドを作ってみてください!
最後に……
この連載を十分理解できなかった……という人も、サンプルプロジェクトの見た目を改変するだけならさほど難しくないはずです! 改変でワールドを作ってしまいましょう! CCE_Assetsの中に基本的なItemやピカピカ光るItemなども入れておいたので、Prefabsフォルダの中からワールドに色々配置して楽しんでくださいね!
それでは……clusterのワールド制作にあなたの発想を思い切りぶつけていってください!
楽しいですよ!
テンプレートワールドプロジェクトを触ってみよう!
clusterでは、ワールド制作に色々使えるアセットが詰まった「テンプレートワールドプロジェクト」を配布しています。
完成したシーンも入っているので、複雑なギミックがどうつくられているかを学ぶことができます。
連載記事を完了して、次のステップアップをしたい方におすすめです。