UE5のエイムオフセットについて
UE5のエイムオフセットはブレンドスペースの1種であり、アニメーションを加算することで違和感なく表示する仕組みのこと。
特に銃のエイム(照準を合わせる)動作を行う際に使用される。エイムオフセットを使うことで移動モーションを阻害せずに様々な方向へ照準を行うモーションを作成できる。
詳しいやり方を紹介していく。
なお、以前の記事で、サードパーソンテンプレートでプロジェクトを作成し必要なアニメーションを用意し銃を持たせ、ブレンドスペースで銃を持ったまま様々な方向へ移動可能にしている。先にこちらを確認してほしい。
Get・SetやSequenceやBranchといった基礎的なノードがわからない場合は先に以下記事を確認してほしい。
アンリアルエンジンのノードの一覧UE5のエイムオフセットの目次
AdditiveSetttings(加算設定)の変更エイムオフセットの作成
エイムと移動のブレンド
エイムオフセットを発動させる
目次にもどる
AdditiveSetttings(加算設定)の変更
銃でエイムする時のアニメーションのAdditiveSetttings(加算設定)の変更を行っていく。
コンテンツドロワーを開き、①銃の持ち方の記事で銃アニメーションを入れたAnimationsフォルダを確認してほしい。
Animations→Game→Characters→Heroes→Mannequin→Animations→AimOffsetsのフォルダを開こう。
.jpg)
「mm pistol idle ads」のように検索する。
.jpg)
Ctrl+Aで全選択し、「アセットアクション」→「プロパティマトリクスで選択内容を編集します」のように選ぶ。
.jpg)
以下のような画面が出てくる。右にあるピン留め済み列のAdditiveSetttings(加算設定)を確認してほしい。
.jpg)
AdditiveSetttings settingの各項目を変更していく。
・AdditiveSetttings Anim Typeを「Mesh Space」に変更。
・Base Pose Type→「Selected animation frame」に変更
.jpg)
Base Pose Animationの以下のボタンを選択する。
.jpg)
「MM pistol idle ads ao」と検索。MM_Pistol_idle_ADS_AO_CCを選択する。
.jpg)
これで、選択した全てのアニメーションのAdditiveSetttingsの変更が完了した。
.jpg)
保存して閉じよう。
目次にもどるエイムオフセットの作成
コンテンツフォルダの直下にあるAnimationsフォルダを開こう。
右クリック→アニメーション→アニメーションオフセット(英訳の人はAimOffsetsと出てると思う)のように選択する。
.jpg)
スケルトン選択画面が出るので、SK_Mannequinを選択する。
.jpg)
できたエイムオフセットのファイルにAO_Pistol_idle_ADSと名前をつける(AOはエイムオフセットの略)。
AO_Pistol_idle_ADSをダブルクリックして開く。
.jpg)
AO_Pistol_idle_ADSをダブルクリックして開き、アセット詳細タブを見よう。
水平軸についてNameをYaw、Minimum Axis Valueを-180、Maximum Axis Valueを180に設定し、Snap to Gridに✓を入れよう。
.jpg)
垂直軸についてNameをPitch、Minimum Axis Valueを-90、Maximum Axis Valueを90に設定し、Snap to Gridに✓を入れよう。
.jpg)
Snap to Gridにチェックを入れたのは、この後のアニメーション設置作業を楽にするため。Gridにアニメーションが飛ぶようになり設置しやすくなる。
YawやPitchがよくわからない場合は以下の記事を確認してほしい。
回転軸についてアセットプラウザで「MM pistol idle ads ao」と打って必要なアニメーションを検索する。
.jpg)
これらのアニメーションの名前の語尾に注目。aoの後の記述が銃を向ける方向を示している。
C=center、R=right、L=Left、B=back。
例えばCCとあればYawとPitchが両方ともセンター。LDであればYawは-90度(つまり左)、Pitchは-90度(つまり下)。LBDであればYawは-180度(つまり左回りの後ろ。)、Pitchは-90度(下)となる。
以上を考慮してアセットプラウザから各アニメーションをドラッグ&ドロップして以下のようにグラフに設置する。
.jpg)
アセット詳細タブの加算セッティング(英語の人はAdditive Setttingsになってると思う)をMM_Pistol_idle_ADSに変更しよう。
.jpg)
Ctrlを押しながらグラフ内を選択すると、ビューポートへその方向へブレンドされたアニメーションが表示されるのが確認できる。
.jpg)
保存してAO_Pistol_idle_ADSを閉じよう。
目次にもどるエイムと移動のブレンド
エイムオフセットは移動しながらでも使えるようにする必要がある。
具体的にはエイムオフセットのアニメーションでキャラの上半身を動かしつつ、下半身は歩く・走るのアニメーションを行う必要がある。
①銃の持ち方の記事で作成したABP_Playerを開き、AnimGraphを開く。
.jpg)
Main StatesのワイヤーをAlt+クリックで切断する。Main Statesからワイヤーを伸ばし「Save・・・」と検索し、「New Saved cash Pose」を選択する。
.jpg)
ノードの名前はMainsaveとする。これはMain Statesのアニメーションを保存するためのもの。
.jpg)
右クリックで検索し「mainsave」と打つと「Use cashed pose "Mainsave"」が出せる。コピーして貼り付けて2つにする。
右クリックで検索し「Layered」と打つと「Layered Blend per bone」が出せる。
最初からあったノードも合わせ、以下のようにつなげよう。
.jpg)
「Layered Blend per bone」のノードを選択して、右の詳細ビューを確認する。
コンフィグのLayer Setupの項目でインデックスの左にある三角マークを押し、Branch Filtersの右にある+マークを押し、その下のインデックスの左にある三角マークを押すと以下のようになる。
.jpg)
Bone Nameに骨の名前を入れることで、骨の上下でアニメーションをブレンドすることができる。
画面右上の以下のマークを押すことで、キャラの骨の画面が出る。
.jpg)
画面左に骨が表示されている。今回はSpine_03の名前を右クリック→コピーしよう。
.jpg)
先ほどの「Layered Blend per bone」の詳細ビューに戻り、Bone NameにSpine_03と貼り付ける。その下のMesh Space Rotation Blendに✓をつける。
.jpg)
エイムオフセットを発動させる
引き続きABP_PlayerのAnimGraphで作業する。
アセットプラウザから先ほど制作したエイムオフセット「AO_Pistol_idle_ADS」をドラッグ&ドロップして配置し、Layered Blend per boneの後ろにワイヤーで接続する。
.jpg)
AO_Pistol_idle_ADSのYawとPitchの入力ピンからワイヤーを伸ばしPromote to Variableで出す。
.jpg)
AO_Pistol_idle_ADSのAlphaからワイヤーを伸ばしPromote to Variableで出す。AO_Pistol_idle_ADSの処理はAlphaに入力されたのが0だと一切行われず、1に近い値が入るほどブレンドされていく。作った変数名をAimingAlphaとする。徐々にエイム状態に切り替えるために使用していく。
.jpg)
ここでABP_PlayerのEventGraphに切り替え、先ほど作成したYawとPitchを出力するための処理を作っていく。
.jpg)
Sequenceで3つに分かれているノードがある。これは単に上の分岐から順に処理を実行していく整理に役立つノードである。
.jpg)
ピンを追加の横のボタンを押し、4つ目の出力ピンを作る。
.jpg)
マイブループリントタブから、Characterをドラッグ&ドロップして出す。
右クリックで検索し、Get Control Rotationを出す。
検索し、Get Actor Rotationを出す。
上の2つのノードのどちらからでもいいのでワイヤーを出し、検索してDeltaを出す。
以下のようにつなげる。
.jpg)
Get Control Rotationでカメラの向きを入力し、Get Actor Rotationでキャラの向きを入力し、それをDeltaで引き算して差を出すという処理。
GetでYawとPitchを出し、Make Rotatorのノードを出し以下のようにつなげる。
.jpg)
RInterp Toを出し以下のように先ほど作ったDeltaとMake Rotatorを以下のようにつなげる。

RInterp ToはTargetに向かってだんだんと値を変えていく。よくわからない場合は以下の記事を確認してほしい。
RInterp Toの使い方Event BlueprintUpdateAnimation(アニメーションを定期的に更新するために最初から設置されている)を確認してほしい。
ここからDelta Time Xを取得可能。前フレームから現在フレームまでの時間を求められる(これを使わず速度の計算を行うと ゲーム上の速さがFPSに依存するようになってしまう)。ここからワイヤーを伸ばしPromote to Variableで値をSetしよう。変数名はDelta Time XのままでOKだ。
.jpg)
変数Delta Time XをGetして、先ほど作ったRInterp Toに入力する。
.jpg)
RInterp ToのInterp Speedを今回は10に設定する(ここに設定した速度で値を変えていく)。
カメラの向きからキャラの向きを引き算しその値をRInterp Toにいれることで、キャラがカメラの向いている方向へゆっくりと向く処理が作れる。
RInterp ToとReturn Valueの出力ピンを右クリックし、構造体ピンの分割を選択する。
.jpg)
YawとPitchの出力ピンからワイヤーを伸ばし、Clamp Angleを作成し、値は以下のように指定する。
.jpg)
Clamp Angleで向きの角度制限を行っている。Yawについては-110から110までの値に設定(キャラが左右に向ける角度の制限であるため、このくらいの数値が妥当)。Pitchは-90から90までの値に設定(キャラが上下に向ける角度の制限であるため、このくらいの数値が妥当)
SetでYawとPitchを出し、先ほど作ったSequenceの4つ目の出力ピンからワイヤーを出し、以下のようにつなげる。
.jpg)
SetのYawとPitchへ先ほど作成したClamp Angleの値を出力する。
.jpg)
Branchを作り、SetしたYawとPitchの先へつなげる。BranchのConditionの入力ピンからワイヤーを出しPromote to Variableし、Boolean型の変数Aimingを作成する。
先ほど作成したAimingAlphaをGetとSetで出す。GetしたAimingAlphaからワイヤーを伸ばしFInterp Toを検索して出す。
.jpg)
FInterp Toは先ほど使ったRInterp Toに似ており、だんだんとTargetの数値へなっていくノードだ。
FInterp ToのTargetには1を入力する。Delta Timeには変数Delta Time Xを入力する。interp Speedには10を入力する。以下のようにAimingAlphaのSetにつなげる。
.jpg)
FInterp Toとその入力とAimingAlphaのセットをまとめてコピー貼り付けでもう一つ作り、Targetを0にしたものを以下のようにつなげる。
.jpg)
これで変数AimingがTrueならゆっくりと滑らかにAimingAlphaが1に変わってきて、それがAnimGraphに配置した「AO_Pistol_idle_ADS」へ入力されるため、ゆっくりとエイムオフセットが発動する。変数Aimingがfalseであれば、ゆっくりとエイムオフセットが停止する。
今回はマウス右ボタンでエイムを行うことにする。よってマウス右ボタンを押すと変数AimingがTrueとなり、離すとfalseとなるように設定を行っていく。
インプットアクションファイルを作成(コンテンツブラウザのThirdPerson→inputフォルダで右クリックするのがおすすめ。その後に入力→入力アクションを選択)し、名前をIA_Aimとする。
.jpg)
IA_Aimを開き、「Value Type」の項目をDigital(bool)にする(トリガーされているかがTrue・falseで出力される)。Triggersの+マークを押す(NoneのままでOK)。

Enhanced Inputについて、よくわからない場合は以下の記事を確認してほしい。
キー入力のイベントの作り方ThirdPerson→inputのフォルダにあるIMC_Defaultを開く。
.jpg)
先ほど作成したIA_Aimを追加し、マウスの右ボタンで作動するように設定し保存。
.jpg)
①銃の持ち方の記事で作成したBP_Playerを開き、右クリック→「IA」程度まで検索するとIA_AIMが出てくる。
.jpg)
コンポーネントからMeshをドラッグ&ドロップして持ってくる。
Meshからワイヤーを伸ばし、検索で「Get Anim Instance」を出す。
Get Anim Instanceからワイヤーを出し、「Cast To ABP_Player」を出す。
.jpg)
ブループリントでは以上のような形でアニメーションブループリントにアクセスできるようにして、アニメーションを操作可能にするのが基本となるので覚えておこう。
「Cast to」がよくわからない場合は以下の記事を確認してほしい。
Cast Toのノードの使い方「Cast To ABP_Player」をコピペして増やし、IA_AIMとつなげる。
両方の「Cast To ABP_Player」のAs ABP_Playerの出力ピンからワイヤーを伸ばし、検索してAimingのセットを出し以下のようにつなげる。IA_AIMのStarted後続のAimingセットには✓をつけてtrueになるようにする。

マウス右ボタンが押された際、Started(IA_AIMのファイルのTriggersがnoneのままの場合はキーが押された瞬間に後続処理を1回行う)の後の処理が1回行われ、Aimingがtrueになる。
マウス右ボタンから指が離された際、Completed(IA_AIMのファイルのTriggersがnoneのままの場合は押されたキーが離された瞬間に後続処理を1回行う)の後の処理が1回行われ、Aimingがfalseになる。
これでAimingのtrue・falseによってAimingAlphaの値がゆっくりと変化し、エイムオフセットが滑らかに働く処理が完成した。
再生しマウス右ボタンを押すと。エイムオフセットが発動しカメラの向いている方向にキャラが滑らかに向いているのが確認できる。
これでほぼ完成だが、エイムにして後ろに進むと変な移動になる。横に移動している時もエイムしているのなら横歩きしてほしい。
エイムしている時のみ、前を向いたまま後退&横移動ができるようにしていく。
ABP_PlayerのAnimGraphを開きLocomotion→Walk/Runと入っていく。
すると②ブレンドスペースの記事で作成したBS_MovePistolPlayerのノードがある。
入力のDirectionからワイヤーを伸ばしPromote to Variableし、Directionの変数を作成しつつGetする。
.jpg)
ABP_PlayerのEventGraphを開き検索してCalculate Directionのノードを出す。
Velocity(変数)をマイブルーポイントタブからドラッグ&ドロップして出す。
Character+Get Actor Rotationを出す(カメラとキャラの向きの差を求めたところからコピーしてくるとはやい)。
Set Directionを出す。
以下のようにつなげる。
.jpg)
Directionのセットを以前作成したSequenceの4つ目のルートで実行されるようにワイヤーでつなぐ。
.jpg)
これでキャラの向きがブレンドスペースに繁栄されるようになった。
BP_Playerを開き、コンポーネントでBP_Playerを選択して、右の詳細タブのキャラクタ移動(回転設定)のOrient Rotation to Movementを確認する(かなり下のほう)。

Orient Rotation to Movementにはデフォルトでは✓が入っている。この状態はプレイヤーが操作した移動方向にキャラが向く。
Orient Rotation to Movementのチェックを外すと左右や後ろに移動しても前方に向く。
よって、エイム時のみOrient Rotation to Movementのチェックを外してやればいい。
BP_Playerの先ほどAimingの変数をセットした場所を開き、以下のようにコンポーネントタブからCharacter Movementをドラッグ&ドロップして出し、そこからワイヤーを伸ばし検索してOrient Rotation to Movementのセットを出す。それらをコピーして2つにしてAimingセットの後ろにつなぎ、Aimingセットがfalseになるほうの後続のOrient Rotation to Movementのセットがtrueになるようにする。
.jpg)
これで完成だ。以下のような動きになる。