第10回「飛行モード後の疑似的な慣性をつける」

前回はゲージ作ろうか、と書いてましたがそれは没にしました。というのも「アクションゲームブループリント入門」という参考書を見て実装できたのですが、ぶっちゃけると参考書の内容まんまなのでここでわざわざ書く必要はないかな、と。

備忘録的には組んだBPは何を見れば思い出せるか分かればいいのです。

……正直この参考書もうちょっと早くほしかった。

というわけで今回は 飛行モード終了後の疑似慣性についてのメモです。

現状の飛行モードだと「AddActorLocalOffset」で前方に飛ばしているため終了したとたんにビタッと停止してしまいます(毎時間キャラを指定された方向に移動させるという内容のため慣性が働いていないため)

アーマードコアのOBみたいなスピードで飛んでいても飛行モードをやめたとたんにビタっと停止します。それはどうも違和感があるなぁ……という訳で飛行モードを終了させても飛んでいた方向に慣性で飛んでいくような挙動を設けたいと思いました。

で、最初はハイブーストに使用していた「Velocity」で飛ばしてやればキャラに力を与えて飛ばしているわけだから慣性が得られるのでは?と考えやってみた結果、一応慣性は得られました。ただしハイブーストで「Velocity」を使っている関係上、飛行モードにまで「Velocity」を使用すると飛んでいる最中はハイブーストの「Velocity」が効かなくなってしまい、飛行中にハイブーストが使えなくなってしまったので没。

ではキャラクターを任意の方向に飛ばす「LaunchCharacter」では?と試してみたところ、こちらも慣性は得られたのですが、どうも飛行中の挙動がおぼつかない……。移動中も慣性が効きすぎて滑ってしまうというか、とにかく操作がしづらい。なので没。

どうも私の現状だと飛行モードは「AddActorLocalOffset」で前方に飛ばすのがベターのよう。でもそれでは慣性が……

で、行きついた発想が「飛行モード終了後にキャラクターが向いている方向にキャラクターを飛行モードのスピードで飛ばして疑似的な慣性をつける」でした。

というわけで疑似的な慣性のマクロがこちら

中身は単純でtickが流れたときにキャラのカメラの向きを取得して飛行モード時の速度でキャラクターをその向きに飛ばす、というもの。

(変数の「FallingLateralFrictionON/OFF」はこの後説明)

これを飛行モードがOFFになったときの処理にねじ込みました。

(飛行モード自体のBPは第7回および第8回参照)

注意としては飛行モードがOFFになったときにキャラクターの角度を0に戻すのですが(第7回参照)そのノードの前に配置しないと飛行モードがOFFになったときの方向ではなくて強制的に前方へ跳んでしまうからです。

飛んでからキャラの角度を戻す、という順番にする必要があるので注意。

ただこれだけだと思った通りにキャラが飛ばず、じゃあどうしようと色々いじっているうちに気づいたのが「CharacterMobement」の中にある「LateralFriction」を低くしてやるといい感じに飛んでくれることでした。

「LateralFriction」は落下中のキャラクターにかかる空気抵抗(摩擦と一緒)のようなもので、低ければ空中で滑るように動くというものです。

ただずっとこれを低いままにするわけにもいかないので、飛行モードがOFFになったときだけ「LateralFriction」が低くなるようなマクロを組みました。

さっき組んだ疑似慣性のマクロにtickが流れたときだけ瞬間的に「FallingLateralFrictionON/OFF」によって「LateralFriction」の値が0になり、そこから徐々に1へ戻るというものへ。

これで冒頭の動画のような慣性が完成しました。

しかしここで別の問題点が……

どうも慣性を利用して飛行ボタン連打で無限飛行が可能になってしまうことが判明。こらあかん。

という訳で飛行モードにクールタイムを設けました。

これで飛行モード終了時に2秒間は飛行モードにいけなくなったので無限飛行はできなくなりました。

アーマードコアのOBのチャージとかコレのためにもしかしたら設けてるのかも……

このゲームでは飛行モード終了後にクールタイム設けましたが、似たような処理を開始時に仕込むことで飛行モード移行までのチャージタイムを設けることができます。

これで本当に慣性が完成しました。やったね!

次回こそは攻撃とか作るのに移行していきたいところ。

それができれば大分ゲームッぽくなるのではないかと。

頑張ろう。あと社畜辞めたい……。

第9回「カメラの追従にラグを設ける」

AC4みたいにカメラの追従にラグを設けたい。

というわけで下記を参考にしました。

UE4ANSWERHUB:サード・パーソンゲームでのプレイヤー移動方向にカメラ向きも追従する機能の実装について

ただここの回答に記載されているSetControlRotationの意味が実はよく分かってません。

私の作っているゲームだとGetPlayerControllerをそのままつなぐと左スティックの入力をカメラが拾ってしまってまともに移動できなくなってしまいました。

なのでいっそそれを外してBPを組んだのが下記です。

SetControlRotationは私のゲームの場合は外しても問題はありませんでした。

サードパーソンベースを使用してるので前提はそう変わらないと思うんですが、色々チェック入れたりしてかみ合わなくなってるのかもしれません。

なのでこちらのゲームではSetControlRotationは外してしまいます。

(というか外さないと正常に機能しない)

よっしゃこれでOK!

そんなふうに考えていた時期が俺にもありました。

実はコンポーネントCameraBoomのLagのEnableCameraLagにチェック入れておかないとラグが生じません!!

これが分からなくてまた半日潰しました。クッッソ!!

とりあえずこれでカメラのラグを追加できました。

次回はブーストのエネルギーゲージでも作ってみようかな。

それができたら弾でも出す処理作って敵も作って徐々にゲームっぽくしていく予定です。

GWは作業が進んでいいですね。あー社畜辞めたい!!

第8回「Anthemっぽい飛行-その2」

前回組んだ飛行のBPをとりあえずそのままオリロボの方へ持ってきて移植。

その後の調整メモです。

調整内容は下記の4つ+α。

⓪飛行モードの加減速(没)

①飛行モード移行時の加速度をつける

②飛行モード中の超加速

③ハイブースト、グライドブーストとの調整

④衝突判定をつける

今回は無駄に長いです。

⓪飛行モードの加減速(没)

もともと左スティックでキャラを中心に上下左右に動くようにしていたのですが、上下の移動を廃止してスティック上下で速度の加減速を行うようにしようと思って組んだのが下記のBPです。

左スティックの上下入力を取得するところにUE4のFlyingベースにあった加減速のBPをそのまま流用してます。

これで飛行時の加減速ができるようになるのですが……。

よくよく考えてみると作ろうとしているゲームにおいて飛行モードをどのように使おうかと思案した結果、アーマード・コアのオーバーブーストのような使用になるかな?と思ったので加減速はやっぱり不要だなぁ、という結論に。

というわけでこれは没としました。

なので左スティックの上下左右でキャラも上下左右に動くBPで進めていきます。

第7回のBPの組み方で進めます)

①飛行速度の加減速をつける

飛行モードに移行した際に前回のままのBPだといきなり最高速度で飛んでいってしまうため、初速から加速して最高速度になるようなBPを追加しました。

まず関数を2種類作ります。

・FlyingSpeed

まず下記の変数を用意

・FlyingModeSpeed(飛行中の速度の変数)

・FlyingMaxSpeed(飛行中の最高速度)

・FlyingMinSpeed(飛行中の最低速度)

・FlyingMoodAcceleration(飛行速度の加速度)

それを没にした⓪番のBPを参考に画像の様に組みます。

これでFlyingModeSpeedがFlyingMaxSpeedに達するまでFlyingMoodAccelerationが足されていく関数ができました。

しかしこれだけだとFlyingMinSpeedに戻らないため、別で下記の関数を作ります。

・FlyingSpeedReset

上画像のBPこれでFlyingModeSpeedがFlyingMinSpeedにリセットするようにします。

※この処理のためにFlyingModeSpeedの値=FlyingMinSpeedの値にしておく必要あり(でないと最初の速度と次から使用した速度で違いが出てしまう)

正直もっとうまい方法あるような気がするのですが……誰か教えてください…

そうして組んだ関数を下記の場所に埋め込みます。

上記BP拡大1
上記BP拡大2

これでいきなり最高速度になることはなくなりました。

②飛行モード中の超加速

第5回目の時のように飛行モード中にジャンプボタンを押すことで加速するようにします。

まずカスタムイベントFlyingMpdeBoostを作り、画像の様にBPを設定します。

これは一気に最高速度でかっとぶイメージなのでFlyingMaxSpeedにFlyingModeSpeedmagnificationという変数をかけています。

(現状の設定ではFlyingMaxSpeedの3倍の速度で飛ぶようにしています)

次にカスタムイベントFlyingMpdeBoostにtickを流す個所を第5回の時に作ったグライドブースト中にジャンプボタンで加速の箇所に入れます。

これで飛行モード中にジャンプボタンを押している間は超加速するようになりました。

③ハイブースト、グライドブーストとの調整

・ハイブーストの調整

飛行中にハイブーストを使用すると上下左右に緊急回避するようにしたいので飛行中のスティック変数を取得し、その方向へVelocityを加えるようにします。

下記画像の様に飛行中のスティック情報を変数として取得し、第5回で関数化したハイブーストのBPに飛行中のスティック情報を加えます。

※スティック変数の取得は第4回を参照

飛行中の左スティックの変数を取得
ハイブースト関数のBPに飛行中のハイブーストを追加

なお飛行中のスティック変数のX,Z方向に0.5をかけているのはそのままだと移動しすぎてしまうため移動を弱くする目的で入れています。

とりあえずこれで飛行中は上下左右にハイブーストできるようになりました。

・グライドブーストの調整

今作っているゲームではハイブーストボタンを押しっぱなしでグライドブーストへ移行するように設定しているため、飛行中はハイブーストボタンを押しっぱなしにしてもグライドブーストが発動しないようにする必要があります。

そのため下記の箇所にBranchを入れて飛行中はグライドブーストへtickが流れないようにしました。

上記BPの拡大

グライドブーストの処理は、下記の様になっています。(第5回参照)

ハイブーストボタンを押しっぱなし

→グライドブースト(SetMovementModeがFlyingになる)

→ボタンを放すと歩行モードへ(SetMovementModeがWalkingになる)

という処理になっており、飛行中は両方のBPにtickが流れないようにしないと飛行中にハイブーストボタンを押したときにグライドブーストへ移行してしまったり、モードがWalkingになって重力が働いてしまったりしてしまいます。

※実際止めるBPを入れ忘れてハイブーストボタン押したらなんで落下すんの!?って小一時間悩みました。

④衝突判定をつける

これは第6回の時に壁衝突判定の関数を作っているのでそれをそのまま流用。

上記BPの拡大

カスタムイベントFlyingHitWallを作成し、EventTickを流す。

そして飛行中に壁に当たった場合に飛行モードOFFにtickが流れるようにしています。

ちなみに第7回に記載しているBPは飛行モードの切り替えをFlipFlop(交互に実行する)で行っていましたが、それで設定すると衝突判定で飛行モードがOFFになったときに再度飛行モードボタンを押しても一回飛行モードOFFにtickが流れて今うためBranchに変更していたりします。

とりあえず以上でオリロボにAnthemっぽい飛行を実装できました。

……これAnthemっぽさもはや皆無ですね。

ほんとは下向くと重力加速度も飛行速度に追加されるようにしたいのですが、いかんせんそこまで突っ込むと色々難しそうなのでそれはいつかの機会にして先に進めようと思います。

次回は「カメラのラグ追加」

動画見ればわかるんですがこのブログ書いてる時点で実はすでに実装できてます。

今回が長ったらしかった分、次回はさっぱり目で。