Unityで物理演算のTPS型キャラ移動の制作の続きです。
かなり前にジャンプの動きを作っていて、飛ぶこと自体は問題なく出来ています。でも動きにちょっと気になるところがあるので、今回の記事で改善していこうと思います。
前回の記事はこちらです!↓
もくじ
空中での方向転換
空中でのジャンプ中の動きはAddForceを使っています。
重力とか空気抵抗を自力で計算するのは無理なので空中での移動にはAddForceを使いたいですが、AddForceで気になるのが「方向転換が割と難しい」という点です。
ゲームでよくある「ジャンプしてから空中で操作可能」な感じを作りたいですが、単純に入力方向にAddForceするだけではうまくいかずほとんど向きが変わりません。
空中で方向が変わるくらい強い力でAddForceすることはできますが、それだと同じ方向にジャンプし続けた場合に勢いがつきすぎて無駄に長い距離を飛んでしまいます。


考えてみれば現実的な物理の挙動で人間くらいの重さの物体が空中で簡単に方向転換するのは不可能です。
体積に対して重さがやたら軽くてドローン並みにフワフワしていたら空中でも方向転換できそうですが、それだと落下にも影響が出てしまいます。
質量や重力はいじらずにどうにかして非現実な動きを作りたいです…。
入力の変化を反映
前回の記事で直近の数フレームの入力方向をVector3で取得できているので、これを使って「急に入力方向が変わったらAddForceの力を強くする」にしてみます。
人間が1フレームで急に入力角度を変えるのはちょっと難しいと思うので、Vector3.Angle()を使って8フレーム前と最新フレームの比較にしてみました。
また「角度が大きいほど反映する値を大きくする」というのは単純な調整が難しい気がしたので、AnimationCurveのイージングを使うことにします。
Vector3.Angleで算出した角度 / 180.0fをイージングの補間値にして水平方向のAddForceの力に補正をかけます。
イージングのカーブはいろいろ試してこんな感じにしてみました。

かかる力を上から見るとこんな感じになるようです。円状の値を縦横のグラフで作るのってちょっと難しいですね…。

実際の動きはこんな感じになりました!
ジャンプのパラメーターも全体的に調整したので、とても良い感じです。
パラメーターについて
いろいろテストしてパラメーターを決めましたが、物理演算は制作側で予測しづらいことがしばしばある気がします…。
特にAddForce等の力を加える系でジャンプの高さなどを制御するのは難しいです。質量・重力などの値も関わってくるので、動かしてみて初めて気づくことも多いです。
いろいろ悩みましたが、ある程度の割り切りは必要なのかなと思います。とりあえず僕は以下を意識することにしました。
- プレイヤーが違和感なく動かせるのならとりあえずOK
- 反転入力の動作などはサービスみたいなものなので通常の動作の高さを超えることがなければOK
ちなみに、プレイヤーキャラの身長は150cmで体重は40kgにしています。(最初の方の記事で2mくらいあったけれど直しました)
もし身長や体重・重力の値を変えることになったら物理演算周りの補正系の値は全部見直しが必要かもしれません…。
ここまでの仕上がり
これでプレイヤーキャラの基本の動きは仕上がりました!
これを元にしていろいろなゲームを作っていくことができそうです。
今はアクションっぽいものと脱出ゲームっぽいものを考えていてどちらを進めるのか悩んでいます…!