第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のチャージとかコレのためにもしかしたら設けてるのかも……

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

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

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

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

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

コメントを残す

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