UE5でイカのゲームを作る_2
イカのゲームらしきものを作る続きだ。前回は弾を撃てるとこまでやった。今回はイカ変化のところを作ってみる。と言っても勿論イカのモデルなんて用意してないので、機能面でそれっぽくなってればいいことにする。
とりあえず自機の状態について記憶させておきたいので、それ用のパラメータを作っておく。遥か古の時代のようにIntegerに1が入ってたらアレで~というのでもいいのだが、UE4にもちゃんと列挙型があるのでそれを使ってみる。コンテンツブラウザの+追加か、コンテンツブラウザ内の適当なとこ右クリックしてブループリント→列挙型で列挙型を作る。名前はEnum_PlayerModeとでもしておこう。作ったEnum_PlayerModeを開いたら+列挙子を追加でエニュメレーターのとこを3行分作って、それぞれHuman, Ika_NotSenpuku, Ika_Senpuku としておこう。今回はセンプク出来るとこまでやらないが、必要になるというか無いとイカにならないしなー。説明部分は無くてもプレイ中には影響しないが、自分の記憶は当てにならないので書いておく。なんならこのブログ記事も当てにならぬ脳のための外部記憶だ。
列挙型も作ったので、それを覚える変数も作ろう。今回もブループリントは自機であるところのBP_ThirdPersonCharacterを開いてそこに突っ込んでおく。BPを開いた中のマイブループリントに変数があるのでそこの+を押して変数を作る。名前はPlayerModeにしておく。作ったPlayerModeを選択し、詳細の変数の型のところでEnum→Enum_PlayerMode(さっき作ったやつ)を選ぶ。デフォルト値はHumanにしておこう。
そしたらイベントグラフにモード切替を追加する。左クリックが攻撃なので、イカになるのは右クリックでよかろう。マウスの左ボタンイベントのノードを追加して、押したらPlayerModeがIka_NotSenpuku、離したらPlayerModeがHumanになるように、それぞれSet PlayerModeを配置して繋ぐ。
勿論これだけじゃ実際に形態変化するわけじゃないので、PlayerModeに合わせて変化させる。今度はイベントグラフにイベント→イベントTickのノードを配置する。このイベントはボタンを押したりした時じゃなく、毎フレーム自動で呼ばれる。で、このノードにスイッチノードを繋げ、PlayerModeの内容に合わせて分岐させ、形態に合わせてモデルを切り替える……のは出来なくはないが今回は自機のスケールを切り替えて表現してみる。
1フレームで切り替わると一瞬すぎるので数フレームかけて切り替わるようにしてみよう。それ用の変数を作る。名前はPlayerTargetSalceとする。変数の型はVector。で、各形態ごとにSet PlayerScaleでIkaNotSenpukuとIkaSenpukuのZを0.4にしておく。他とHumanは全部1。
その後、コンポーネントにあるCharacterMovementをドラッグ&ドロップでイベントグラフ内に配置して、それに対して各形態ごとにSet MaxWalkSpeedで最大速度を変更する。Humanは500、IkaNotSenpukuは250、IkaSenpukuは1000としておく。
さらにその後は、先ほど設定したPlayerTargetScaleに合わせて自機の実際のスケールを変更する。Get PlayerTartgetScaleで取得した数値(Vector)をXYZそれぞれ0.5倍したものと、現在のMeshのスケールを0.5倍したものを足し、Set WorldScale3D(Mesh)でMeshのスケールに設定する。Set ActorScale3Dでも見た目のスケールは変わるのだが、このActor全体のスケールが変わるので、マウス右ボタンを連打するとコンポーネントのところにあるカメラと自機の距離も高速変化してしまい、大変気持ち悪くなる。
形態変化を追加したついでに、Human形態でしか弾を撃てないようにしよう。と言っても、前回作った左クリックで弾を撃つ部分の最初のところに、先ほどと同様にPlayerModeでスイッチさせ、Humanの時しか後に繋がらないようにするだけ。
さて、プレイしてみよう。マウスの右ボタンを押していると自機がちっさく遅くなり、右ボタンを押したまま左ボタンを押しても弾は出ない。センプクはまだインクが無いので当然無理だ。前回に比べて手間は増えたが見た目はパッとしないな。果たして最後まで作ることは出来るのだろうか。