ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

【UE4】キャラクターが崖際で浮いてしまう問題を改善する方法について(PerchRadiusThresholdはいいぞ編)

本記事は「Unreal Engine (UE) Advent Calendar 2021 その3」の3日目の記事の代理投稿です。

f:id:pafuhana1213:20211224211518p:plain

はじめに

便利なCharacterですが、デフォルト設定ですと上図のように崖際で浮いてしまいます…見え場が非常に悪いですね!

そんな時に便利なのが、Character Movement Component の PerchRadiusThreshold
デフォルトは0なのですが、この値を上げていくと…

f:id:pafuhana1213:20211224200014g:plain

崖際で落ちるようになります!やったね!

少し解説とか補足とか

このPerchRadiusThreshold が 0.15( SWEEP_EDGE_REJECT_DISTANCE )以上の値に設定されていると、崖際で留まるか否かのチェック処理が走るようになります。その計算に関しては PerchRadiusThreshold だけでなく

  • 床のチェック処理の結果 (
  • Characterの各パラメータ(カプセルの半径、MaxStepHeight、PerchAdditionalHeight)

が使われており…更にエンジンコード上で固定の値が微調整(?)で使われていて少し複雑な感じです。しかも、カプセルの半径とMaxStepHeightに関しては崖際以外の場面での挙動に影響を与えてしまいます。なので、まずは PerchRadiusThreshold の調整のみで解決できるかどうかを模索してみる所から始めるのが良いのかなと思います。

また、もしこの辺りの挙動を変えたい!場合は

  • UCharacterMovementComponent::ShouldComputePerchResult 関数
  • UCharacterMovementComponent::FindFloor関数 の Sweep floor処理の次

をまず確認することになるはずです。コード自体は比較的シンプルなのでぜひ。

個人的な所見

PerchRadiusThresholdを大きめの値にすることで崖際で浮くことはなくなるのですが…アクション性の高いゲームの場合はユーザのストレスになる場合があるかもしれません。意図しない落下が多発したり、ギリ届くと思ったジャンプが届かなかったり…。

なので、PerchRadiusThresholdの値調整は両足が浮いてしまうような明らかにおかしい挙動の回避に使いつつ、重心が崖側にあるときは専用の崖際モーションをブレンド or AnimGraphやControlRigを使ってプロシージャルアニメーション制御をするのがバランス良いのかなと思います。

f:id:pafuhana1213:20211224211456p:plain
(イメージ)

簡単な内容でしたが困ってる人を自分含めて2人知ってるので記事にしてみました!
ご参考になれば幸いです!