🗂

【cluster】乗り物で弾を撃つ

2021/11/30に公開約5,000字

Cluster Creator Kit Advent Calendar 2021の1日目の記事です。

乗り物機能登場で入力が柔軟化した!

clusterで乗り物機能ができたことにより、イスやクルマやヘリなど乗り物が作れるようになりました。

ただ、この乗り物機能、もう1つ別の側面があると思います。
それは、ゲームなどで使える入力の柔軟化です!

これまでは……

これまでclusterでゲームを作ろうとした場合「ワールドに置いてあるモノに触る」「アイテムを持ち歩いて使う」「体当たり」くらいしか入力の手段がありませんでした。
ワールドの一カ所にとどまって色々なボタンを押すようなゲームならまあいいものの、動き回りつつ入力をしたいとなると、手に持ったアイテムを使うのが限界。いちおう両手持ちはちょっと前にできるようになりましたが、両手持ち自体が結構やりづらい上に、結局2種類しか入力ができなかったわけです。

乗り物機能によって、「プレイヤーの移動についてきてくれるボタン」を実現できるようになりました!

ボタンを押すと弾を出せるヘリの例
これで、かなり複雑な入力をするゲームを作ることもできます。

ただし……


ただ、乗り物にボタンをついてこさせるには少し工夫が要ります。

工夫……

乗り物はそれ自体がItemです。
そしてItemの子にItemは作れない、というclusterの鉄則が!
(Unityの中では大丈夫でも、アップロードするときあえなくダメ! と言われちゃいます!)

そして、ボタンもまたInteractItemTrigger(押したときに何かを起こす)を必要としているのでItem。
つまり、フツーに作ろうとすると「乗り物Itemの子にボタンItem」となってダメなのです!


なんてことだ

Constraintを使おう!


しかし、Unity標準のConstraintという機能を使うことでこの制限をクリアできます!
Constraintというのは、別のオブジェクトの移動についていったり、別のオブジェクトの方を向き続けたりする機能。
つまり、クルマItemとボタンItemを別に作り、ボタンItemをクルマItemについていくようにすればいいわけです!

親についてくる

このConstraint、乗り物で特に重要ですが、他にもclusterで複雑なものを作るときに重要なので覚えていきましょう。

さて、Constraintですが、基本的にはParentConstraintを使うのが吉です。位置も回転もぴったり別のオブジェクトについていってくれます。

ちなみにConstraintというのは制限・制約するって意味ですね。位置を別のオブジェクトと同じとこに制限したりするわけです。

PositionConstraintなんかは乗り物が横転したときの復帰とか色々使い勝手あるんですが、それは「乗り物勉強会」のPDF資料や動画を見て頂くとして……


多数ご来場頂きありがとうございました

乗り物についてくるボタン


こういう風に弾を撃ちつつ移動できるのを作ります

まず、ベースは公式記事にある「Character Itemを使ってシンプルな動く乗り物をつくってみよう」の作り方に従って作ったシンプルな動く箱です。


こんなただの箱ですが乗って移動できます

ただ、元の記事では回転ができなかったため、左右で回転、前後で進むように改造しています。
こんな感じ

まずボタンの親を作る

箱Itemの子に、EmptyObject(カラッポのオブジェクト)を作り……
そして、すぐにドラッグ&ドロップで箱Itemの子ではなくしてしまいましょう。

名前はButtonsParentとします。

ButtonsParentは箱の子ではないことがわかりますね。sitPositionはさっきの公式記事の中に説明があります

ButtonsParentにParentConstraintをつけます。Sourcesの+ボタンを押し、箱Itemを指定。
これで、ButtonsParentは箱についてくるようになりました!

こんな風になります。sourcesの指定のあと、IsActiveのチェックを忘れずに。


少しむずかしいけど頑張って! 一度最後まで読んでからもう一度読み直すのも有効です

ボタンを付けましょう

そして、ButtonsParentの子にQuadを作り、サイズや回転や位置の調整をして……
InteractItemTriggerをつけます。これがボタンです。
ThisにOnButtonというSignalを送るようにしましょう。

サイズや回転や位置は、例えばこんな感じですかね

ボタンQuadの子にEmptyObjectを作って、FirePosと命名。少し位置をボタンから前のほうにずらします。

この辺かな?

親子関係はこんな感じ

そしてCreateItemGimmickをボタンQuadにつけて、KeyにOnButtonを指定。
さらにテンプレートワールドにあるShooterから持ってきた弾Prefabを指定。
CreateItemGimmickSpawnPointに、さっきのFirePosを指定してあげます。

FirePos指定の理由

この弾は何かにぶつかると破壊されるので、FirePosを少し箱&ボタンからずらしてあげないと画面に出た瞬間ぶつかって破壊されてしまいます。


で、こうなりました

撃てるぞ!


すると……箱に乗って動きつつ、Quadをクリックすることで弾が撃てるようになりました!

下にある灰色のがボタン

ButtonsParentの子にボタンを増やせば、複数のボタンを撃たせることも可能です。これで、色々な入力をさせるゲームが作れるようになりました!

ただ、もちろんボタンが増えすぎるとclusterに元々あるボタンとかぶったり、小さくて押しづらかったりするので常識の範囲にしておきましょう。普通のゲームにあるようにメニュー(ボタン)を切り替えるボタン、なんてのがあってもいいですね!

Discussion

ログインするとコメントできます