Unityで物理演算のTPS型キャラ移動を作っていて大体動けるようになりましたが、動きに気になる点があるので改善していこうと思います。
まずはRigidbody.verocityでの動きに疑似的な慣性をつけて自然な感じに動かせるようにしていきます。
前回の記事はこちらです!↓
もくじ
Rigidbody.verocityでの移動
今までの記事でオブジェクトの移動はAddForceでの説明が多かったですが、実は地面に接地している時の移動はAddForceではなくRigidbody.verocityを使っています。
理由はAddForceの設定で慣性を調整しきれず扱いづらかったからです。
どちらを使うのが最適ということはなく、物理演算に即した自然な動き=AddForce、プレイヤーの入力に合致した動き=Rigidbody.verocityでゲーム内容や自分の好みに合わせればいいのかなと思います。
ただしRigidbody.verocityだと全く慣性が働かずにピタッと止まるので、スクリプト側から調整しやすい形でほんの少し慣性がかかるようにしたいです。
フレーム単位での疑似慣性
カメラの回転の記事で疑似的にAddTorqueっぽい動きを作りましたが、あれほど物理演算っぽい動きではなく「ほんの少しだけ慣性がかかる」という感じにしたいので今回は別の方法を考えてみました。
慣性の「力が加わる・失われるのにラグがある」という感じを作るために、入力の値を現在のフレームの値ではなく直近の数フレームの平均値にするようにしてみます。
Vector2の配列を作ってプレイヤーの入力の値を任意のフレーム数保持し、毎フレーム更新するようにします。履歴を取っておくという感じですね。
これを指定したフレーム数分合計して平均値を出すようにすれば、フレーム数分の加減速がかかった感じになります。
この平均値をRigidbody.verocityに使えば、フレーム分の慣性っぽい動きを作ることができます。
こんな感じです。どうでしょうか?
慣性なし
慣性60フレーム分
保持するフレーム数を増やすとかなりフワッとして動きづらいです。
Unityの物理演算で「滑る床」を作るならAddForceでPhysic Materialコンポーネントを使うのが良いのかなと思いますが、Rigidbody.verocityを使いながらちょっとした歩きにくさの演出をするならこれでもよさそうです。
反転入力の検知
プレイヤーの直近の入力を履歴として保持しておくと、副産物でちょっと良いこともあります。
プレイヤーが特定の短い数フレームの間に入力を変えたかどうかをチェックすることができるようになります。
入力の強度(はじき入力)であればVector3.SqrMagnitudeで事前に設定した閾値を急に超えたかどうかを判定するとよさそうです。
反転入力であればVector3.Angleを使い、最新の入力と数フレーム前の入力の間の角度が一定より大きかったかどうかを判定すればOKです。
これで特殊なアクションがいろいろ作れるようになりそうです。(僕は入力が難しいアクションは苦手ですが…)
まとめ
当初の目的は「慣性っぽい動きのついたRigidbody.verocity」でしたが、ついでに入力の履歴が取れるようになったのでゲームらしい動きを作れそうです。
履歴はいろいろな場面で使えると思うので活用していきます!