UE5でゲーム作ろう!モーションマッチで華麗に障害物を乗り越えるアクロバティックな敵キャラと対戦できるシューティングゲームを開発しながらサンプル公開しています。
公開中 yossi40-100/GASP-ALS: Game Animation Sample with ALS Layering
本記事はGASP-ALSのUE5.5でのカメラモード切替の解説です。
前回記事で紹介したGamePlay Camera削除の続きです。
UE5.4時代の後方・斜め・寄りの3段階(xGASP-ALSでの右肩・左肩越し切り替え)の組み合わせを再現しつつ、リアルな1人称視点(FPS)モードを追加しましょう。
UE5.4時のカメラモードの移植
UE5.4時のおさらい
※長いのでシーケンスで折り返してスクショをとりました
S_SimpleCameraParams構造体でカメラとスプリングアームの設定値を3種類変数に保存していて、プレイヤーからのキー操作(拡張入力)でwants to aimなどのフラグが変更されると、
セレクターでこのうちどのパラメタを使うか切り替わるという内容をTickで毎フレーム監視しているつくりでした。
Possed時(ゲーム開始直後など、プレイヤーキャラが操作可能になったとき)には、カメラのトランジションラグ(カメラとカメラを滑らかにつなぐ処理)が不要なので、-1とする分岐用フラグが関数の引数になっています。
移植
S_SimpleCameraParams構造体はそのまま移行します。
UpdateCamera関数は、ほぼ同じです。
主な違いはフラグがCharacter Input State構造体にまとめられているので、それの出力ピンを分解して参照しています。
細かくいうとInterpolate変数以外は関数以外から触る必要がなさそうなので、プライベート変数にしています。
後半は同じなので割愛します
新規関数を作成して、コピペして、変数を作成してからいったん削除して、もう一回貼り付けたら楽かなと。
Input State変数は置きなおすしかないかと思います。
不要な処理削除
GASP-ALSではCameraGraphにある切り替え処理を廃止します。
入力部分だけ消しましたが、全消しで問題ありません。
GASPではEventGraphの下のほうにあるマウスホイールの処理です。
GASP-ALSの左右肩越し視点再現
左Altキー押すと IsCameraRightShoulder変数が反転しますね。この変数をそのまま参照しましょう。
UpdateCamera関数に戻ります。
CameraStyle**は右用の設定値になっているため、IsCameraRightShoulderがTrueのときに1、Falseのときに-1を返すように「Select Float」ノードを設定し、それをSocket Offsetに掛ければ、
フラグに応じてカメラが左右反対側に移動しますね。
XとZ軸は変更したくないので1を設定して掛けても変化しない設定にします。
右クリックして分解してY軸に繋ぎましょう。
また、もとはCamera Distance Multiplierが掛けられていましたが、特に必要なさそうなので掛けるのを止めました。
FPSモード追加
切り替えの仕組み
まず、(別管理でも構いませんが)Character Input Stateにwants to FPSフラグを追加します
CameraGraphで、1キーと十字キー左でFPSモードに切り替えられるようにします
押されたらフラグを反転しているだけです
NOTはNotBoolean、Set member in**やBreak**は構造体変数から線を引っ張って探すと見つかります。
三度、UpdateCamera関数へ
Character Input State変数の一番下にWantsToFPSフラグが増えているので、これをSelectは隣のコピペしてIndex端子に接続して間に挟みます。
このフラグがTrueの場合のピンをプライベート変数(CamStyleFPS)に昇格します。
位置調整
値はお好みですが、アーム長を0、ソケットも0とする想定です。
眼の位置にソケットつけてそこにカメラを移動する前提なので、そうしない場合はオフセット位置をそれらしい高さに調整しましょう
Headのボーンにeyeソケットを追加し、そこにカメラ(スプリングアーム)をとりつけます。
これで呼吸などによる頭の動きに連動して揺れるかなりリアルな1人称カメラになります。
揺れすぎる場合はラグの値を調整したりしましょう。
もとはカプセルの中心くらいが基準点だったのも上に移動しているので、FPS以外のカメラ位置を元の位置にしたい場合は、CamStyle**変数のオフセットを調整するか、もしくはFPSとそうでないときでAttachしなおすといった処理でも対応可能ですね。
毎フレームそれをやるのは微妙な気もするので、それやるならフラグ操作イベントでついでに変えるのがよいかと。
リアルFPS化
トラバーサルアクションや敵に撃たれてみるとわかりますが、キャラクターが縦回転しているのにはカメラの回転が追従していません。
これはカメラやスプリングアームの「Use Pawn Control Rotation」というフラグで、カメラの回転がポーンの回転に連動する設定になっているためです。
ポーンの回転とはつまりカプセルの回転で、マネキンさんのメッシュがくるっと回っていてもカプセルはジャンプしているだけなのでそういうふるまいになっています。
このフラグを解除すればメッシュの動きにカメラがついて回るので、ボディーカムのような揺れまくる動きにできますが、それは揺れまくりでさすがに酔います(*_*;
というわけで、リアルさと酔いのバランスを考慮して、トラバースアクション中とラグドール時だけカメラの回転を有効にしてみました。
4度目のUpdateCamera関数
末尾にWants to FPS かつ(Doing TraversalAction または IsRagdolling)のNOTをSpringArmコンポーネントのUsePawnControlRotationにセットします。
通常はオンのフラグを特定のタイミングだけオフしたいので反転です
飛び越えるときにカメラが動かないとあまりリアルに感じられないけど、走っているだけで首の振れまで再現されるとさすがに酔うので、このへんがバランスいいかなと
要らないひとはこの処理をなくしてください
リターゲットキャラ対応
またリターゲットキャラでもFPS視点にできるようにカメラを移動する処理も入れてあります。
武器を持たせるメッシュにコンポーネントタグで「AttachOverlayItem」というのが追加されているので、このタグが付いているスケルタルメッシュに付け替える処理です。
UE5.4のときに自分で武器を持たせていたときはリターゲットキャラの子クラス側のコンストラクションスクリプトでこの付け替え処理をやっていましたが、GASP-ALSで武器を持たせる処理が親のSandboxCharacterでやられていたので真似しました。
ただし、メタヒューマンの場合はOverlayItemを持つTorsoメッシュと、カメラを付けるFaceのメッシュが分かれているので、仕方がないのでFaceのメッシュに「eye」というコンポーネントタグを追加してそれを探す仕様にしています。
当然ですが、リターゲットキャラクターの該当のメッシュにFPS用のeyeソケットも必要です。
ないとFPSカメラがカプセルの中心になります。
その他調整
カプセルが小さすぎて壁に埋もれがちなので全体的に大きめにしてあります
走る前傾姿勢で壁に埋もれない程度に広げています
弊害として通行できない幅が狭まるのでほどほどに。複数タイプがいる場合などはNavMeshの設定も考慮する必要があります。
3人称から1人称に切り替えるときに少しラグが大きく遅れていますが、気になるひとはラグを調整してください
おわりに
思ったより長い記事になってしまったので敵AIのエイムの話などは記事を分けます(;^ω^)
コメント