CCKでは2021年11月から「乗り物機能」が使えるようになりました。「乗り物」と言いつつ、色々な応用が可能な機能になっています。
今回は乗り物から弾が出るワールドを作ります。好きに動き回りながら弾を撃てるので、グッと雰囲気も変わりますよ!



サンプルプロジェクト
今回の作例は「cue_05」。今までハコから飛ばしていた弾を乗り物から飛ばすようにします。今回の記事まで理解すれば、十分ゲームワールドをつくることができます! また、このサンプルプロジェクトからちょっと地形を変えるだけで、さらに遊べるワールドにすることも可能です!

乗り物は、とりあえず用意したPrafabを使ってください
乗り物の基礎部分は、こちらの記事などに書いてあります。
ですが、今回は乗り物を活用する応用部分に力を入れて説明したいので、用意してあるPrefabを使っていきます。CUE_Assets/Prefabs/RidableObjectsから、SteerableBoxWithButtonAndBulletを選択。【CCK_Items】の子として配置してください。


ただの灰色のハコのように見えますが、再生してクリックすると「乗って」移動することができます。乗ると同時にボタンも表示され、緑のボタンでHandGunBulletも出ます。

この【SteerableBoxWithButtonAndBullet】をUnpack Prefabして、【Machine】とでも名前を変えておきましょう。
乗り物の中身を見ていく
この【Machine】、子に色々なものが付いています。

ボタンBを作る改造部分まで含めると、上のような構造になっています。
とはいえ「ボタンと弾発射部分」までは、ちょっと複雑な割に毎回同じような形になるので、多少読み飛ばしても構いませんよ!


まず乗り物としての機能のコア部分は【SteerableBoxCore】。これはCharacter ItemとセットでUnity標準のCharacter Controllerがついています。つまり「キャラクターのように」動けるのです。デコボコのある地形でも、Unityが地形に沿って動かしてくれます。
ポイント
乗り物というとクルマっぽい挙動を想像するかもしれませんが、レースゲームならともかく、普通のゲームではCharacter Itemベースのほうが操作感が良いです。
乗り物なのでRidable Itemが付いています。これによって、「乗る」ことができます。乗るプレイヤーの腰の位置を【SeatPos】で指定していますね。
さらにSteer Item Triggerはハンドル機能です。前後左右の移動入力をチェックできるようになります(*3)。
ポイント
「動かないイス」ならSteer Item Triggerは不要です。Ridable Itemだけ使えばイスになります!

そしてItem Logicによって軽く数字を加工しつつ(*4)、Set Velocity Character Item GimmickやSet Angular Velocity Character Item Gimmickによって実際に乗り物が前後に進んだり回転したりできるわけですね。
(*3) さらに「additionalVal」からSpaceキー・Shiftキー(VRでは右スティック、スマホではボタン)による上下入力まで取れるようになります。今回は使いませんが……
(*4) このItem Logicはベクトルを使っていて少し理解しづらいところもありますが、移動は前後の入力(moveVec.y)のみを使う、左右の入力(moveVec.x)は回転操作に回すため無視……というだけです。
ボタンと弾発射部分
さて、乗り物基本部分を読み飛ばした方もここからはちょっとしっかり読んで頂ければと思います。
ボタンと弾発射の部分です。


On Get On Item TriggerとOn Get Off Item Triggerを使い、「乗ったときだけ」ボタンを見せるようになっています。さらに乗っていた人がワールドを退出してしまったときもOn Receive Ownership Item Trigger(Involuntary)というトリガーでボタンを非表示に。いずれも「ShowHideButton」というKeyを使っています。


ボタンは左右にあります。ちょっと変な形をしていますが、一人称視点・VRでも、三人称視点でもできるだけ押しやすく・見やすくしたらこうなりました。


2つのボタンについているトリガー・ギミックはこんな感じです。「ShowHideButton」のメッセージはここで受けとっているわけですね。
弾を撃つ部分


弾を撃つ仕組みは、これまでハコから弾を撃っていたときとさほど変わりません。
ただ、Interact Item Triggerのメッセージを直接Create Item Gimmickにつなげず、Item Logicを噛ませている点が違います。
これは、今後「弾を撃つ条件が整っている時だけ撃てる(残エネルギーなど)」ようにしたいからですね。
とはいえ現時点では、「CreateBullet」というメッセージが「無条件で」送られるようになっています。

「無条件で」という時、画像のように「=」「Constant Bool ON」は良く使うので覚えておきましょう(*5)。
音を出す部分は、これまでとほぼ同じ内容なので省略します。
(*5)C#でいうなら
if(true) {
CreateBullet();
}
という感じかもしれませんね。trueの部分を書き換えることで、特定の条件がOKの時だけ撃つようにすることもできるわけです。
さて、このままでも「乗り物で弾を撃つ」はできていますし、中身の勉強もできました。
しかしPrefabを配置しただけではちょっと物足りないですね
余裕がある人は、ぜひこの後の「右ボタンで違う弾が出るようにする」もやってみてください!
最終回である第6回は、ここからさらに発展させるためにはどうすればいいか、色々なアイデアを提示します。今回までの内容がベースになるので、しっかりサンプルプロジェクトで確認しておいてください!

第6回:発展させるためのアイデア!
ここまでお疲れ様でした!
最後となる第6回では、これまで紹介してテクニックをさらに発展させる応用のアイデアをいくつか紹介します。
連載で基本が分かったという方はぜひ挑戦してみてください!

右ボタンで違う弾が出るようにする

初期状態の時点でも、左の緑色のボタンを押せば直進する弾が出るようになっています。しかし右の青いボタンは何も起きないので、これを押したときは違う弾が出るようにしてみましょう。
青い弾を撃つようにする


【Machine】の子に【FirePosB】というEmptyObjectを作ります。Transformは画像のような感じで、Xの回転を変更し「ちょっとナナメ上を向いている」感じにしています。
さらにParent ConstraintというコンポーネントをFirePosBに付けましょう。Sourcesには【SteerableBoxCore】を指定、そしてIsActiveをONにしてください。これを付けておくと、何かが動いても(今回は乗り物)勝手にピッタリとついてきてくれるのです(*6)。

【ButtonB】にItem LogicとCreate Item Gimmickを1つずつ画像のように追加。CUE_Assets/Prefabs/BulletsのBlueBulletをItem Templateに指定し、【FirePosB】から飛ばすようにしています。
そして【SoundA】を複製して【SoundB】という名前にし、Itemを【ButtonB】に変更。音も何か別のものに変えておきましょう。

プレイしてみると……青のボタンで青い弾が出るようになりましたね!
(*6) 実は今回の場合は、FirePosBをSteerableBoxCoreの子に配置するだけでも問題ありません。ただ、CCKにはItemの子はItemにできないという鉄則があるのです。しかしConstraintを使えば、Itemを別のItemにピッタリついていかせることができます!
弾の中身を見てみる
【BlueBullet】の中身も見てみましょう。これまで使ってきたHandGunBulletと良く似ています。違うのはRigidbodyでUse Gravity(重力を使う)をONにしていること、時間経過では消えないことくらいです。

Add Instant Force Gimmick、On Collide Item Trigger、Destroy Item Gimmickがついています。生成されたら前に飛ばし、何かにぶつかったらぶつかった相手に「damage」が10のIntegerメッセージ、「Hit」のSignalメッセージを送り、自分をDestroy Item Gimmickで破壊しています。