はじめに
キャラクタの挙動や演出を制御するために、キャラクタが今乗っている床(地面)の各情報を取得するケースは多いかと思います。その時よく用いられるのがLineTraceですが、様々な資料で解説されている通り、重めの処理なので頻繁に呼び出すと問題になる可能性があります…
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
https://www.slideshare.net/EpicGamesJapan/cedec2018-ue4-111105729/115
この問題を解決するための機能・Tipsはいくつかあるのですが、今回はたぶんマイナーな Character Movement Component
のCurrentFloor
について紹介します。
CharacterMovementComponent の CurrentFloorについて
みんなだいすき(?)Character Movement Component
、キャラクタの動きを制御する過程でCapsuleやLineTraceを使った床の判定処理 (UCharacterMovementComponent::FindFloor
など) を実行しています。その結果がCharacter Movement Component
の```CurrentFloor``に格納されています。
そのため、LineTraceによる床情報の取得処理を実装しなくても、CurrentFloor
から床のActor情報や床の傾きなど様々な情報を取得することができます。
例えば床の傾きによってモーションを変えたい場合は、CurrentFloor
->Hit Result
->Normal
から必要な情報を取得できます!
床の情報を使いたいときはLineTraceを使う前に、まずはCharacter Movement Component
のCurrentFloor
で実現できないか検討するようにしましょう!
おまけ
LineTraceと異なりFCollisionQueryParams
のbReturnPhysicalMaterial
が有効になってないので、CurrentFloor
のHit Result
からPhys Mat
(物理マテリアル)情報を正常に取得することはできません。
FHitResultより
/**
* Physical material that was hit.
* @note Must set bReturnPhysicalMaterial on the swept PrimitiveComponent or in the query params for this to be returned.
*/
UPROPERTY()
TWeakObjectPtr<class UPhysicalMaterial> PhysMaterial;
そのため、Character Movement Component
のCurrentFloor
の情報を使って足音の制御をしたい場合は物理マテリアル以外の方法(Actor, Component Tagで判定したり…)を検討しましょう。
おしまい