【第6回】ACV風壁蹴りを実装したけど使わないかも知れない話

久々の更新になってしまいました。
記事内容分はとっくに作成し終わっていたんですが、メカデザイン・3DCGに心を折られて無気力になっておりました。
とりあえずシステム面を強化していこうと気分を切り替えたので、今回は『ARMORED CORE V』系っぽい壁蹴りによる垂直移動を実装します。

「壁蹴り」ってなーに?

アーマードコアシリーズでは『4』系統まではブースターを使った自由な垂直上昇、空中制動が可能でしたが、『V』系統ではシステム・世界観の刷新により上昇移動に大きく制限が付くようになりました。基本的に自機はジャンプしかできません。ただしオブジェクトに足を引っ掛ける形で多段ジャンプ(=壁蹴り)することで立体戦を実現しています。

今回作成中のプロジェクトはオープンワールドを想定しています。すると『V』系統のように高さに制限があった方が都合が良いので、このシステムの再現を試みました。


取り敢えず動作から

まず実装した動作をご覧頂きましょう。まず上方向への壁蹴り。

画像1

さらに壁を使って横方向へ飛び出す動作も。

画像2

最後操作に失敗しているのはご愛敬。

とにかく、壁蹴り移動のだいたいの形はできました。やったね☆
なお赤や緑のあみあみはデバッグ用表示です。


参考記事のご紹介

かなり参考にさせて頂きました。いつもお世話になっております。

ただ、ぼくのプロジェクトだと上手く噛み合わない・動作しない点が多々あったので独自に変更した部分が多いです。その辺を重点的に紹介していきます。


壁との接触判定をとる

壁と触れているか否か、その判定を取る関数を作ります。名前は「Detect Wall」としておきます。
主要なノードは〔Sphere Trace For Objects〕。見えない球体を生成し、それに物が衝突(Hit)しているかの判定を取るノードです。

画像3

参考サイトほぼそのままですが、変更点が三つほど。
プレイヤーのコリジョン「Capsule Compornent」から値を二つゲットします。一つは「Capsule Herf Height」。こいつを更に半分にして〔Get Actor Up Vector〕で取得した値に掛けてやるとちょうど腰から頭頂部くらいになります。何故かは知りません。もう一つは「Calsule Radius」。コリジョンの半径ですね。これに 1.5 足した値を辺り判定の半径に入れます。コリジョンより大きな値にしないと当たり判定が発生しないので。

もう一つ、当たり判定を取るオブジェクトに「Pawn」つまり別キャラクターを追加しました。『V』系統では敵キャラも蹴られたので、一応です。


次いで、更に似たような関数をもう一つ作りました。こちらは「Detect Wall On Stick」としました。

画像4

こちらは移動入力(スティック操作)で当たり判定を取る関数になります。二つ目の参考サイトを頼りにしました。「Radius」の値はコリジョンより小さく、スティック入力に掛ける値はやや大きくするのがミソです。値の大小はテストプレイを重ねて調整します。

参考サイトではこちらの関数一つで実装していますが、ぼくの環境だと上手く動作しなかったのでこれら二つを使い分けることにしました。


実装してみる

まずは全体のブループリントをお見せします。

画像6

うーん。ごちゃごちゃしてる。ので、少しずつ処理を見ていきましょう。

画像6

まず「Jumping」というカスタムイベントを用意。後で説明しますが、ジャンプボタンが押され続けている限り Tick が流れ続けるようになっています。

初っぱなに〔Branch〕でキャラクターが地上・空中どちらにいるか判断します。地上ならば通常のジャンプ、空中ならば先ほどの「Detect Wall」関数で壁との接触判定をとります。壁と触れている場合、次の処理へ。

画像7

〔Sequence〕で二つの処理を行いますが、まずは Then 0 方面の処理だけ見ましょう。
〔Do Once〕を挟んで、一旦キャラクターの加速度を全て 0 にしてしまいます。これを挟まないとあらゆる加速度が壁蹴りした後の速度に乗ってしまいます。例えば上昇中なら二回目三回目とどんどん早く昇り、下降中ならば全然跳び上がってくれない、という事態が起こります。
その後〔Delay〕を使って次の入力待ちと、ついでに壁を蹴るモーションを加える時間を設けます。

戻って Then 1 方面。こちらは二回目三回目と蹴り上げていくタイミングを作っています。二回目以降の壁蹴りが発生する条件にキャラクターの落下速度を用いていて、ブーストオン・オフそれぞれで別の値にする事で少しだけ「らしい動き」になるようにしました。単に時間で制御してしまうとジャンプ力が低い機体に対応できないと思います。
始めにある〔Delay〕はコメント通り、壁蹴りをしようとするとカクカクする現象があったのでそれを防止するために入れています。

画像8

いよいよ壁蹴りです。ここで「Detect Wall On Stick」を使います。
方向入力が壁の方、または入力がない場合、そのまま垂直に蹴り上がります。跳ばし方はおなじみの〔キャラクターを起動〕……もとい〔Launch Character〕ノードです。「Wall Kick Power」という変数を入れてますが、これはジャンプ力を1.5倍したもの。
入力があって壁の方ではない場合、冒頭のGIF動画二枚目のように横方向へ飛び出します。最初はラピッド・ブーストを噴かす設定にしていましたが、エネルギーを消費する前提だったので新しく処理を組みました。


ジャンプ・RB・壁蹴りの共存

壁蹴りの挙動を作るのも苦労しましたが、頭を使ったのはこっちの方。

以前の記事にも書いた通り、このプロジェクトではジャンプとラピッドブースト(クイックブースト)を同じボタンで処理しています。
更に長押ししてる間連続して壁蹴りしてほしいので、処理に一手間加える必要がありました。

苦労の跡をご覧下さい。

画像9

要点を列挙すると、
カスタムイベント「Jump And RB」にはEvent Tickが流れてくるので〔Gate〕で制御。
「Jump Max Count」を操作しているのは地上でボタンを長押しした時にヘコヘコした動きをしないように。また、もう一度ボタンを押し直さないとジャンプしないように。
途中の〔Delay〕ノードは一瞬処理を遅らせないとジャンプしてくれないため。

です。ぶっちゃけこの辺は細かく解説する必要は無いと思うのでこの辺にしておきます。需要無いから。


使わないかも

全体的に想定外の動作が多くて難産した処理ではありますが、実際には使わないかも知れません。
今回のプロジェクトを色々検証した結果、自機の全高は 15m くらいで設定するのが丁度良いという結論に至ったのですが、15mの巨大ロボが建造物蹴って跳ぶって実際どうなん? と思うからです。
とは言え、他に良い立体機動の方法が浮かばないので、取り敢えずはこれでやっていこうと思います。


おわりに

更新が遅れて本当に申し訳無い(自分に)。
Blender触っててマジでイライラ、Fusion360でもイライラ。そんなこんなイライラで無気力でしばらくゲーム制作から離れてしまいました。よろっと復帰しつつ、がんばっていきたいとおもいまっしょい。

無償でメカデザインからモデリングまでやってくれる人、いつまでも募集してます。無償で。

この記事が気に入ったらサポートをしてみませんか?