第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が流れる仕組みとなっています

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

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

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

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

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

第4回「ACの動きを目指す―ハイブーストもどき編―」

前回に引き続きUE4でアーマードコアVのハイブーストもどきが出来たので、その作り方メモ。

ちなみに前回も触れていましたが、今回のBPは下記の注意点があります。

・ 「Third Person Template」 を使用

・下記のところにチェックを入れている

以上がされていないと同じようなBPを組んでも位置の基準の違いなどで別の挙動になる恐れがあります。

未来の、組んだBP忘れちゃってるだろう自分よ、要注意だぞ!そのための備忘録なんだから……

という訳でこんな動きになるという動画。

まずはBPの全体像

DoOnceとDelayを利用しハイブーストを吹かす時間とリロードの時間を作る。ブーストを吹かしている時間分、キャラクターをコントローラースティック方向に加速させるtickが流れる、という流れになっています。

①ハイブーストを吹かす時間(加速を与える時間)とリロード時間

まずDoOnceにtickが流れることでボタンを連打してもtickが流れないようにする。

そして最初に流れるtickでGateをOpenさせ加速処理にEventTickを流す。

Delayで指定した時間後にGateのCloseにtickが流れ、加速処理に流れているEventTickをせき止める。=これがキャラクターを加速させる時間(ハイブーストを吹かす時間)となる。

またさらにDelayで指定した時間後にDoOnceのRsetにtickを流すことによって再びボタンの受付ができるようになる。=これがハイブーストのリロードタイムとなる。

ここら辺は説明読むより画像見てもらった方が分かりやすいかもですね。

②キャラクターをコントローラーのスティック方向に加速させる

まずはコントローラーのスティック方向を取得する

これは「Third Person Template」の「MobementInput」に画像のBPを追加することで取得する。

参考:BluePrintで左スティックキャラ前方(or後方or右方or左方)なのかどうか取得する方法

あとはスティックの方向に変数を掛けて加速させるだけ。

なお、スティックがニュートラル(値が0の時)はキャラクター(のカプセルを軸とした)の前方向に変数を掛けて前方にハイブーストする仕様になってます。

ちなみにこの処理をしない場合、ニュートラルでハイブーストボタンを押すと0×変数となるためキャラクターの速度が完全に0になりその場でビタッと停止してしまいます。それはそれで面白そうではあるけれど、今回は使用予定はありません。

こっからは余談

またスティックの方向に「×」ではなく「+」を使用すると、X,Y座標軸で考えれば当たり前なんですが、下記のような結果になりキャラが斜めに吹っ飛んでいきます。

仮にスティックを左下に倒したときx=-1、y=-1とする。また変数を+300とすると

スティック方向×変数=(-1、-1)×300=(-300、-300)

→左下に300の速度が与えられる・・・〇

スティック方向+変数=(-1、-1)+300=(299、299)

→右上に299の速度が与えられる・・・×

という感じ。

考えてみれば当たり前なんですけど、最初この考えに至らず+を使ってしまいキャラが斜めに吹っ飛んでしまったのでメモ。

……こんなのに引っかかるの自分だけだろうけど、備忘録だからいいのです!

とりあえず以上でハイブーストもどき完成。

本家はハイブースト発動までに若干チャージがあってその時のボタンの押し込み具合で若干ハイブーストの強さが変わったりと変態的な仕様になってますが、少なくともそこまで作るつもりはありません。フロムは変態すぎる……。

クイックターンも作ろうかと思いましたが、考えてるゲームの仕様的に不要な気がしてきたのでとりあえず今後はブーストドライブ(壁蹴り)とグライドブースト(空中でも使用できるように考えてます)に挑戦予定。

……また高い壁になりそうだなぁ、これ。

次回「ACの動きを目指す―壁蹴りorグライドブースト編―」

来月更新は多分無理!!

第3回「ACの動きを目指す―ブーストON/OFFもどき編―」

UE4でアーマードコアVのブーストON/OFFもどきができたので作り方メモ。

<注意>

ちなみにベースはUE4の「Third Person Template」を使用。

また前回記事の箇所にチェックを入れてることを前提にしてます

ここが違っているとキャラの位置の取得とかの関係で同じBPを組んでも違う結果になってしまうので注意(特に次回のハイブーストもどきづくりでは関係してきます)

まずはブーストON/OFFのBP全体画像

ブーストモードの切り替えtickが流れるとブーストON時のパラメーターとOFF時のパラメーターを交互に上書きしていく流れになっています。といってもこれだけだと何が何だかなので以下に詳細を記載

①ブーストモードの切り替え

これはもう画像の通り。ゲーム開始時はOFFのパラメーターがキャラクターに上書きされ、ボタンを押すとONのパラメーターが上書きされる。それを繰り返す流れになってます

②ブーストON時のパラメーター

1.パラメーターの上書き

まずブーストONにtickが流れると下記のCharacterMovementを書き換える

参考:【UE4】UCharacterMovementComponentのAPIリファレンスを翻訳してみる

ここで書き換えるパラメーターは下記の3つ

「MaxWalkSpeed」

歩行時の最高速度。ここではブーストON時の移動速度になる。

「GroundFriction」

地面の摩擦の強さ。地面上でのすべりやすさ。本家の動きを見ると慣性でスティックを放しても進行方向に少し滑っているように見えたので、ここで数値を低くしてキャラクターを少し滑るようにしている。

「AirControl」

空中での移動のしやすさ。0~1の範囲で決められ、0にすると空中での制御が全く効かなくなる。1にすると地上と同じぐらい制御できるようになる。

2.空中にいるかどうかの判定

まずキャラクターが空中にいるかいないかを「Is Falling」で判定。それをしておかないと画像のBPでは坂を下っていても上向きの力がかかってしまいます

3.落下中にホバリング

次にキャラクターが落下中かどうかを判定。これはどうすればいいのか分からずUE4 answerhubで質問したら回答をいただけました

参考:UE4 answerhub 落下中のキャラクターに上向きの力を加えて落下をゆっくりにしたい

要はキャラクターの速度ベクトルが-(下に下がる)になっているかを判定することで対応しました

あとはその時にターゲットの速度に上向きの力(ホバリングの浮力の力)をくわえるようなBPにしてあります

③ブーストOFF時のパラメーター

こちらはtickが流れたときにブーストONで上書きされたパラメーターをもとの値で上書きするというBPになってます。なのでON時のパラメーターと同じ項目をいじりましょう。

以上でACVのブーストON/OFFもどきを実装できました。細かい挙動は本家と違うけど、そこらへんは調整してお好みの挙動にしましょう。今はまだグレーボクシングを作っている段階なのでそこまでの調整は不要かと思ってます。本家まんま再現する気もないですし、とりあえず一旦完成ということで。

というかもっと改善する方法あると思うのですが今はこれが精いっぱい。もっとこうした方がいいよとアドバイスありましたら、メッセージか何かいただけると感謝感謝でございます。

次回は「ACの動きを目指す―ハイブーストもどき編―」です。

第2回「ACの動きを目指す―カメラ固定編―」

前回UE4上でオリロボに装甲を着けると言ったっばっかりなのに……

スマン、ありゃウソだった

でもまあBlender上で装甲つけたってことでさ……こらえてくれ

というのも、やっぱこのロボ最終的には作り直すんだろうなと考えてUE4でアクションの方を作りこんでいくことを優先したためです。

とりあえずベースになるアクションゲームをつくってからモデルを差し替えればええやん、という発想。

では早速アクション作りこんでいくぞ!

……と思っていた時期が俺にもありました。

ACや地球防衛軍のようにキャラクターの回転がカメラの回転と同期するようにはどうしたらいいかって時点で早速つまずいたよ!FPSのブループリントと見比べてみたりとかしてみたけどいまいちよく分からなく、半日悩んでました…。

ちなみにサードパーソンのベースのままだと下記のようなカメラアングルに。

で、やっとこさ見つけた下記のブログで一発解決しました。

ResonantさんのLong distance to the dream

【UE4】移動方向に対するキャラクターとカメラの回転

つまりサードパーソンBPベースで作っていれば下記の場所をチェックするだけでOK!

ワンクリックで済みます!

……これだけのために半日潰れたのか(´;ω;`)

ちなみに「ThirdPersonCharacter」の下にある「CharacterMovement」ではキャラの移動速度やら空中での姿勢制御やらいろいろキャラの移動に関する設定が行えます。ここいじるだけでも結構動きが変わってくるので面白いです。

とはいえ、流石にそこだけではブーストの実装はできません。

というわけで 現在はAC(V系)のようなブースト実装を目指してアセットストアで購入した「Jetpack」を解析中。

さっぱりわからんけどな( ;∀;)

ぶっちゃけ全然前に進まなくてコレしか書く内容がなかった……。

体が闘争をもとめすぎて自炊し始めた人たちはいったいどうやって学習しているのだろう…?

次回「ACの動きを目指す―ブースト編―」

……できたらいいね

第1回「オリロボをUE4に降臨させよう」

体が闘争を求める。

しかしアー〇ード・コアの新作はでない……

じゃあ作るしかないじゃない!

そんなアホなことを思いついた社畜のゲーム制作備忘録。

地〇防衛軍のAC版みたいなのを作りたいのです。

目指すは「カスタムロボット地球防衛アクション」

 

C言語とか全然わからんけどブループリントというのが使える『UnrealEngine4』でゲームを作っていきます。

完成する気がしないけど、フェイレス司令の「自分を信じて『夢』を追い続けていれば、夢はいつか必ず叶う!」の言葉を胸に秘めて頑張っていきたいところ。

第一回目は「オリロボをUE4に降臨させよう」

本当は先にシステム作ってからキャラ作って降臨させた方がいいのかもだけど、やっぱりモチベ維持としてはオリロボが動いているところを見ながらやりたいのでまずはオリロボを作るところから。

で、最初はMetasequoiaを使ってモデルを作ったのですが、どうもUE4に持っていく方法がよくわからない。

調べてみるとメタセコのFBX書き出しだとUE4に対応できなさそうで、Blenderを介しないと駄目っぽい。

/(^o^)\ナンテコッタイ

もしかしたら何か方法あるのかもだけど、探してもBlenderでの方法しか見つからず…。

もしモデリングソフトの選定すら決まっていない人がいたらBlenderがおすすめです。

この後の話にも関係するし。

で、肝心のUE4へのオリロボインポート方法ですが……

これを受講すればすべてが解決!

Udemyにある、なん先生の

【超初心者向け】Blenderでキャラクターをモデリングしてアンリアルエンジンで動かす講座【ハンズオン】

いきなり通販みたくなっちゃいましたけど、ホントにタイトル通りなんです。

メッチャ分かりやすいんです。

ちなみに定価は24,000円もします。

が、実際はUdemyの講座っていつも割引されててほとんどの講座が1,600円とかで購入できます。

しかも質問とかもできるので調べる時間との対費用効果とかを考えると真面目にお得かなぁ、と。

時間が無いのでこういう講座は積極的に活用していきたいところ。

自分、素人ですので。

 

というわけで講座をこなしてBlenderでオリロボを制作しなおしました。

それがこちらとこちら。

そしてボーンの設定へ。

最初はうなうなぎさんの『妹でもわかるUnrealEngine4』で知った『UE4Tloos』というグレーマンのボーンをBlenderに持ってこれるデータがあるの知ってロボに組み込んでたものの、なんか足がくにゃっとしてしまった。

どうやってもうまくいかない……。

どうも似た体形のモデルでないとうまくいかないっぽいです。

手抜きすんなってことですね、わかります。

というわけでちゃんとオリジナルのボーンを仕込み、ウエイトペイント設定へ。

ロボットの場合だとウエイトペイントが有機的なモデルと違うので、そのやり方はこちらの動画を参照して設定。

これによってボーンの準備完了!

 

で、見事UE4へ持ってこれました。

 

小一時間ぐらい感動して遊んでました。

ちなみにこのオリロボは基本フレームに鎧を着せるように装甲を着ける設定です。

なので次回はこのすっぴんロボにUE4上でアーマーをつけてかっこよくしてあげたいところ。

次回「オリロボに装甲をつけよう」の予定。

君は生き残ることができるか……