main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

【UE4】 UE4のカメラ揺らしの機能をもう少し掘り下げてみる

はじめに

自分がダメージを受けた際や、近くで爆発などが起きた際にカメラを揺らす演出はよく使用されます。
UE4ではカメラを揺らす機能が用意されていますが、実際に使用する際はいろいろと注意が必要そうです。

基本的な使用方法はhistoliaさんのブログで紹介されているのでこちらも参考にしてみてください。

他のカメラ揺らしの種類や再生方法、停止方法や扱う際の注意点などもありますので、
もう少し掘り下げてみたいと思います。

再生方法

カメラを揺らす方法は以下の3つがあります。

PlayerController::ClientPlayCameraShake()

自分のカメラのみを揺らす場合に使用します。
APlayerController::ClientPlayCameraShake_Implementation()の中でPlayerCameraManagerがあったらPlayerCameraManager->PlayCameraShake()を呼び出しています。

PlayerCameraManager::PlayCameraShake()

CameraManagerのリファレンスから呼び出すことができます。
自分のカメラに使用すればカメラを揺らすことができます。

UGameplayStatics::PlayWorldCameraShake()

ワールド座標で震源の座標を指定して、その範囲内入ればカメラを揺らします。

TPSでこの機能を試してみましたが、最初はカメラが振動してくれませんでした。
というかたまに振動する場合があるのでおかしいと思って調べてみたら、キャラクタの位置ではなく、カメラの位置で判定しているようです。
FPSの場合はこれで問題ないと思いますが、TPSの場合はこれでは問題が出てきます。

ソースを確認してみると、この関数内でAPlayerCameraManager::PlayWorldCameraShake()を呼び出しています。
この中でWorldのPlayerControllerのイテレータで回してPlayerCameraManagerが設定されている場合は処理されます。
その際にCalcRadialShakeScaleで揺れの強さを求めていますが、カメラの座標で揺れの強さを求めているようです。
その後にPlayerController->ClientPlayCameraShake()を呼び出しています。

マルチの場合もこの関数でクライアント側もちゃんと処理が行われるようです。

TPSで使用したい場合はキャラクタからの位置で処理してあげることで同じようにカメラを揺らすことができます。
その場合はC++やBPで別の関数を用意する必要が出てきます。

停止方法

APlayerController::ClientStopCameraShake()

引数で再生したCameraShakeClassを指定することで停止することができます。
bImmediatelyをtrueにすると即時停止、falseの場合は収束して停止します。

PlayerCameraManager::StopCameraShake()

PlayerCameraManager::PlayCameraShake()で再生した際の返却値のCameraShakeのインスタンスを引数で渡すことで指定したカメラの揺れを停止することができます。

PlayerCameraManager::StopAllInstancesOfCameraShake()

引数でclassを指定することで指定したカメラの揺れを停止することができます。

PlayerCameraManager::StopAllCameraShakes()

お構いなしに全てのカメラ揺れを停止することができます。

その他

UEの機能でカメラを揺らす場合、CameraShakeを継承したBPでパラメータを設定します。
それを引数でClassとして渡しているため、パラメータを動的に変更することができません。
というか、変更できる方法があったら教えてもらいたいです。

その為、プリセット的に複数のパラメータを用意して適宜選択して再生するといった運用になると思います。
ちょっと取り回しがしにくい感じがしますが、とりあえず揺らすだけであれば使用できると思います。

今回はキャラクタに付けたカメラでの話でしたが、カットシーンなどでカメラが独立している場合などは未検証です。