C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

UE4: Camera の GetActorLocation で得られる位置と1フレームの Tick の中のタイミングのメモ

状況例

「サードパーソンテンプレートのようなプロジェクトを作り、プレイヤーキャラクターとカメラのちょうど中間に何かしらアクターを移動させたい。」

実装手順

中間の位置に出したいアクターの Blueprint へ次のように実装する。

f:id:USAGI-WRP:20180905194611p:plain

おそらく遭遇する問題

カメラの GetActorLocation が1フレーム程度遅延した位置を返すため、中間に出したいアクターが少しずれた位置へ出てしまい、ブレ感が発生してしまう。

https://imgur.com/yLIq7Bh

View post on imgur.com

この問題は ACharactor が基底型 APawnAPlayerController 型の Controller メンバーを介して Rotation 等の入力を処理する場合(サードパーソンテンプレートのプレイヤーキャラクターなどでの初期設定状態)に発生する。入力をイベントが受け付けた段階での処理、またはキャラクターや中間に起きたいアクターの Tick では Controller には変化量が保持されているだけで、まだ実際の変化は適用されていない。(なぜ、あるいは詳細は APawn::AddControllerPitchInput, APlayerController::AddPitchInput, AController::SetControlRotation とその呼び出し元の実装を探索すると理解が早いかもしれません。 )

無駄な対処法

AddTickPrerequisiteActor でどうにかしようとする。

f:id:USAGI-WRP:20180905195144p:plain

どうにもなりません。

解決方法: 中間に起きたいアクターの Tick でブレずに(遅延せずに)カメラの位置を取得する方法

中間に起きたいアクターの TickGroupPostUpdateWork に変更する。

f:id:USAGI-WRP:20180905200326p:plain

UE4Editor の標準状態では TickGroup は非表示状態になっているので、 Actor Tick の「▽」的なボタンを展開して変更する。

https://imgur.com/LIGuhZH

View post on imgur.com

遅延しなくなりました😃

Reference