第6回「アーマードコアVっぽい壁蹴り編」

今回はUE4でアーマドコアVの壁蹴りっぽいのができたのでその制作メモ。

と、壁蹴りBP制作前に一つ調整。

というのもデフォルトのサードパーソンBPだとジャンプボタンを押し続けてもジャンプにTickが流れるのが一回になっているため、ボタン押しっぱなしの間はジャンプボタンにTickが流れるようにします。

なんでそんなことをするかとういうと、ACVではジャンプボタンを押しっぱなしにしながらでも壁に触れたときに壁蹴りしてくれるからです。

これが意外に重要で、タイミングよくボタンを押して対応しようとすると反応がどうしても遅れてしまうんですよね。特に連続で壁蹴りする場合はボタン押しっぱなしでないと対応が難しくストレスが溜まるため、操作性向上としてボタン押しっぱなしに対応できるようにします。

というわけでまずボタン押しっぱなしで反応するようにジャンプのBPを改造します。

・ジャンプボタンを押しっぱなしで判定取れるようにする

下記のHPを参考にしてデフォルトのジャンプBPを改造。

参照:UE4マウスやキーボードを押している間の判定を取る。

「InputActionJump」からボタンを押しているかの変数を作り、押している間は「EventTick」が「Jump」のBPに流れるように作成。

※画像が「Jump」でなく「Jumping」になっていることについては下記の壁蹴りBPをカスタムイベント「Jumping」で作成しているため。その中に「Jump」が含まれます。

とりあえずこの段階ではボタンを押している間は「Jump」にTickが流れるようになったと考えておいてください。

という訳で早速壁蹴りのBP作成へ。

・壁蹴りの考え方

BPがちょっぴり長くなってしまったため、とりあえず先にどんなフローで作ったかの説明

1.ジャンプボタンを押した際に

  →地上なら普通にジャンプ

  →空中なら壁と接しているかどうかの判定

2.壁と接した場合の処理

3.入力している方向キーの向きの先に壁があるかの判定

 →壁がある時:垂直壁蹴り(上に上昇)

 →方向キーがニュートラルの時:垂直壁蹴り(上に上昇)

 →壁が無い時:方向キーの方向へジャンプ(横に飛ぶ)

とりあえずこんな感じ。

これだけだとよくわからないので備忘録としてもよろくないですね。

というわけで小分けにして解説。

0.壁に接しているかの判定の関数を作る

上記の1,3で壁と接しているかの判定があります。

これは下記のHPを参考に関数を作成しました。

参照:UE4のBluePrintだけで壁蹴りを実装する

・壁と自機が接しているかの判定関数

こちらは参考HPの組み方まんま。

ちなみに「SphereTraceForObjects」というのはカプセル状のTraceを作って当たり判定を取れるものです。

SphereTraceの位置、大きさ、何との判定を取るかを決めて使用します。

↓Traceってなんぞやっていう参考。

参照:UE4レイキャスト(ライントレース)を使う

キャラのサイズとかは参考HPとは違うので、判定するカプセルのサイズや位置は色々試して調整してます。

あ、純粋化することを忘れずに。

これしないとGetとして使用できません(これ気付くのに小一時間悩んだ)。

※「極み本」を持っている人はP320を読もう!

・方向キーの向いている方向に壁があるかの判定関数

こっちは上記のBPの位置の取得に前回作成した方向キーの変数を組み込んだもの。

これにより倒している方向にカプセルが移動し、そのカプセルが壁と接しているかどうかで方向キーの倒している先に壁があるかないかの判定を行うようにしています。

方向キーがニュートラルの時はキャラのカプセルコリジョンの中にSphereTraceが収まっており、方向キーを倒すと(押すと)その方向にSphereTraceが移動してカプセルコリジョンの外に出てくる、という感じになってます。 これで方向キーの先に障害物があるかの判定を取ってます。

1.ジャンプするか壁蹴りするかの処理

壁との接触判定の関数ができたので早速壁蹴りBP作成へ。

画像見ればすぐわかりますが、空中にいなければ普通のJump、空中にいた場合は先ほど作った関数(自機が壁に接しているかどうか)を利用して壁との接触の判定をとってます。

2.壁と接していた場合の処理

ここで記入している処理は壁蹴り自体に必須のものではなく個人的な操作感を作るために設けているBPなので、ぶっちゃけなくても問題はないです。

①リロード時間を設ける

「DoOnce」と「Delay」で壁蹴りのリロード時間を設けます。これを設けないと挙動が壁蹴りッぽくなくなってしまうためです。

②時期の速度を0にする

これは個人的な挙動処理として入れてます。

なんというか、壁に接して蹴ろうとした時に踏ん張って一旦自機の速度が0になるだろうというのを再現したいから入れただけです。あとは壁に衝突した時の自機の慣性が壁蹴り時の力に悪さしないように。

無くてもあまり挙動が変わらないような気がしたので、このノード入れるかは好みだと思います。

ちなみにこのノードで終わりにすると壁にボタンを押している間はペタッと張り付いているような挙動をします(微妙に重力の影響でずり落ちていきますが)。

これはこれで何か使い道はありそうです。

(壁に張り付いて、ボタンを放したらスティックを倒している方向へジャンプするとか?ロックマンXみたいの作れそうですね)

③壁蹴り中にハイブーストの使用制限を設ける

カスタムイベントを画像の様に設けて、壁蹴りで飛んでいる間は壁蹴り時体はハイブーストとみなしてハイブーストを使用した時間と同じリロードタイムをハイブーストに描ける処理をしています。

これをしないと壁蹴り直後でもハイブーストが使用可能になってしまい、個人的に好みの動作ではなかったためです

④方向キー入力時間を設ける

ここでの「Delay」は壁に接した後の飛びたい方向へ方向キーを倒すためのタメ時間です

これが無いと壁に接触した時に飛びたい方向へスティックを倒しておかないとならなくなり、かなり反応がシビアになるため設けています

ここで一旦Tickを止めるため、方向キーの先に壁があるか判定するまでのちょっとした間ができるので壁に接触してからスティックを倒す余裕ができます。

.壁蹴りするときにどう飛ぶかの処理

①壁がある時:垂直壁蹴り(上に上昇)

0.で作った方向キーの先に壁があるか判定する関数で判定します。

壁があれば上方へ「LaunchCharacter」ノードで自機を飛ばします。

「LaunchCharacter」ノードはキャラを与えれたベクトルへ飛ばすようなノードだそうです。

②方向キーがニュートラルの時:垂直壁蹴り(上に上昇)

③壁が無い時:方向キーの方向へジャンプ(横に飛ぶ)

ここら辺はブログの第4回を参照にBPを組んでます。③は方向キーのベクトルに少し上方へのベクトルを加えることで横に飛びつつ自機の高度を上げることができます。

以上で壁蹴りのBP備忘録メモは終了です。

ここからはオマケメモ

・グライドブースト中に一時的に加速させる

グライドブースト中にジャンプボタンを押すことでさらにハイブーストをかけているように見せて加速させる処理についてのメモ。

まずグライドブースト中は「Movement Mode」が「Flying」になっているので「浮いている」かどうかの判定式をジャンプボタンに設けます。

あとはハイブーストと全く同じ処理をもう一つ設け、ハイブーストの速度に変数をかけた関数(「GrlideHighBoostAcceleaor」)を設けてそちらで速度を上書きするようにして処理してます。

これでグライドブースト中にハイブーストをさらに重ね掛けしているような動作を作ることができます。

リロード時間のノードを無くしてしまえばボタンを押しっぱなしの際は常に加速できるような処理も可能です。ここら辺は完全に好みで、自分ももしかしたらリロード時間取っ払ってしまうかもです。

取り合えずこれでオマケも完成。

なんだか今回は長ったらしくなってしまったなぁ…という感じですが、とりあえずこの程度の情報があれば色々忘れてしまった後でも動きの再現はできそうです。

あくまで備忘録ですので。

次回は「Anthemっぽい飛行モードの実装」にチャレンジ

これができればキャラの動きに関してはやりたいことがほぼ揃うのでなんとか実装したいところ。

……できるかなぁ(;´・ω・)

第5回「グライドブーストっぽいやつ(ボタンの押し込みでハイブースト→グライドブーストへ移行)編」

今回はグライドブーストっぽいやつの作り方メモ

なんで「っぽい」とつけているかというとタイトル通りACV本家と色々違う箇所があるためです

俺は面倒が嫌いなんだ(あんな変態技術作れるかボケ)

本家と同じというのもつまらない、というかそれだったらACVやれよってなってしまうのでここら辺から本格的に仕様を変えていこうかと思ってます

ではまずは下準備から

・スティック方向の取得を変数化

前回作ったスティック方向を取得するブループリントを画像のようにして変数化

これはよく使うので変数化しておかないと面倒です

というか変数化してないと次回の内容ができないので必ず変数化しておきましょう

・ハイブーストの加速処理を関数化

こちらも前回作った画像部分のブループリントを関数化してます。

別に必須ではないのだけれど結構この処理を使いまわす羽目になったため、作業の簡略化と画面をすっきりさせるために関数にしてます(純粋化はしないこと)

※必要なBPを選択しておいて右クリックで関数化するだけ。こんな操作忘れる可能性あるの自分だけだろうけど……

簡易版グライドブーストの作成

で、さっそくグライドブーストっぽいものを作成

これだけ

ね、簡単でしょう?

グライドブーストボタンを押すことでキャラクターの「Movement Mode」を「Walking」から「Flying」に切り替えることでキャラが落下しなくなります。(ついでにジャンプも空中にいると判定されて効かなくなる)

あとはEventTickが「Flying」中に「HighBoostAcceleator」(さっき作ったハイブーストの加速関数)に流れてハイブーストと同じ速度で移動できますよ、となります。

本家と違って今のままだと空中でもグライドブーストできてしまいますが、今回作ろうとしているゲームでは空中でも使えるようにしたいのでその処理はしません。

あと、これはボタンを押すとグライドブーストにモードを切り替えるような処理になってますが今回はハイブーストボタンを一定時間押し込み続けることでハイブースト→グライドブーストへ切り替わり、ボタンを放すとグライドブースト終了としたいのでその処理に挑戦

本家で言えばブーストチャージの代わりにグライドブーストへ移行するイメージですかね?

ボタン押し込みでハイブースト→グライドブーストへの切り替え

とりあえずBP全体像

①ハイブーストと同時にグライドブーストへEventTickを流すゲートをOpen

②ボタンを放すとグライドブーストへEventTickを流すゲートをClose

 同時に「Movement Mode」を「Flying」から「Walking」へ変更

③ あとはハイブーストのボタンを一定時間以上押し込まれているいるかを判定し、グライドブーストへEventTickを流す

という処理で出来てます。ここでのポイントはどうやってキーの押している時間を取得するかです

キーを押し込んでいる時間を取得する

ハイブーストのボタンを押す

→ハイブーストを吹かす時間+α以上ボタンが押し込まれているかどうか

→上記時間以上にボタンが押し込まれていたらグライドブーストへ移行

のような処理を下記を参照につくりました

参照:UE4、Inputの長押し処理の実装

そしてできたものがこちら

「Get Input Key Down」で任意のキーが押されている時間を取得し、それがハイブーストのリロード時間+αの時間より長いかどうかを判定

押してる時間が上記の時間より長ければグライドブーストの処理へEventTickが流れる仕組みとなっています

ハイブーストのリロード時間を取得する理由は、ハイブーストを吹かしている間はグライドブーストへ移行しないようにするためです

最終的にハイブーストを吹かす時間はロボのカスタマイズ時に変更できるようにする予定の為こうした処理にしてます

とりあえずこれでグライドブーストっぽいやつの完成(仮)

次回の壁蹴り編のオマケでグライドブーストにちょっと追加するものがあるので、良ければそちらも見てくださいな

という訳で次回は「壁蹴り編」です