第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っぽい飛行モードの実装」にチャレンジ

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

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

第6回「アーマードコアVっぽい壁蹴り編」」への2件のフィードバック

  1. acv(d)っぽいゲームがpcで遊べる未来が来るといいなぁ
    もし出なければ何時かこの記事を参考に自分で作りたいくらい
    すごく大きい情報なので有り難いです

    • 備忘録ですが少しでも誰かの参考になれればと思っていたので、そう言ってただけるととてもありがたいです!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です