TPSシューティング奮闘記~エイム処理~

エイム時の処理について僕がよく組んでいる処理を紹介する。

(何か以前にもエイム処理の記事書いたような気がするが気にしない気にしない)

 

エイム時の処理

f:id:Free_Gamer:20180730220829p:plain

エイムボタン押したら、「Aim」というBool値をTrueにセット。

放したら、Falseにセット。

f:id:Free_Gamer:20180730221143p:plain

この「Aim」変数は、エイムアニメーションに移行するためのトランディションルールBool値である。

f:id:Free_Gamer:20180730221446p:plain

 

エイム中(エイムボタン押した時)、平行移動させる。

OrientRotationToMovementのチェックを外し、UseControllerRotationYawにチェックを入れれば、常にカメラのほうに向く。

f:id:Free_Gamer:20180730221505p:plain

 

被写界深度処理(カメラのポストプロセスの強度)をセット。

エイム中は、被写界深度をON(1.0)。非エイム時は、被写界深度をOFF(0.0)にしている。

被写界深度処理は後程出てくる。

f:id:Free_Gamer:20180730221647p:plain

タイムラインでカメラの位置とプレイヤーとの距離を変更。

CameraBoom(SpringArm)の長さをグッと縮めて、キャラの肩越し視点になるようにする。

更に、CameraBoomのSocketOffsetの位置をプレイヤーの真横辺りにずらしている。

f:id:Free_Gamer:20180730221831p:plain

タイムラインは以下の通り。

タイムラインの長さは「0.1」

SpringLengthのタイムラインで、SpringArmの長さを300~100にしている。

SpringOffSetのタイムラインで、SpringArmのX,Zをプレイヤーの右方向にずらしている。

f:id:Free_Gamer:20180730222124p:plain

タイムライン処理の後、

Aim中(True)なら、SetTimerByFunctionNameへ。

非Aim時(False)なら、SetTimerByFunctionNameを止める処理へ。

SetTimerByFunctionNameのFunctionNameには、被写界深度処理を行うためのカスタムイベント「DepthOfField」を指定している。

「DepthOfField」イベントが呼び出されると、「DepthOfFieldSystem」という関数に処理が流れる。

f:id:Free_Gamer:20180730222339p:plain

「DepthOfFieldSystem」関数の中身。

f:id:Free_Gamer:20180730222700p:plain

プレイヤーカメラの位置から「5000」の距離までトレースを飛ばす。

f:id:Free_Gamer:20180730222756p:plain

ヒットした位置とプレイヤーカメラ位置の差を計算し、その結果を「FocalDistance」Float変数にセット。

カメラのポストプロセス変数を出し、「FocalDistance」変数をFocalDistanceピンに繋ぐ。

Apeture(F-stop)の値は「0.5」にした。

Methodは「CircleDOF」に。

この被写界深度処理については、以前も書いたのでそちらも参考に。

free-gamer.hatenablog.com

f:id:Free_Gamer:20180730222819p:plain

 

これでプレイしてみよう!

youtu.be

 

エイム中は、カメラがグッとプレイヤーに近づき、プレイヤーの肩越し辺りにカメラが来ていた!

更に、エイム中は被写界深度処理がしっかり行われていた!

その証拠に、エイム中は近くのものがくっきりしたりぼやけていたりしていた!

 

TPSシューティングを作る際は、ぜひとも参考にしてみてほしい。

もちろん不満ならいくらでも改造して構わない。

 

それではまた!^^ノシ