AdvancedLocomotionSystemV4をHumanoidRigに適用

f:id:nca03132:20200416102433p:plain


AdvancedLocomotionSystemとは

AdvancedLocomotionSystem(以下ALSV4と略)はBPベースのリアルなUE4移動制御システムです。もともと有料で売られていたのですが現在はなんと永久無料アセットとなっています。

基本移動、スライド移動、ジャンプ、ダッシュといった基本動作からFootIKによる接地処理、段差のよじ登り、銃や弓を構えながらの移動・エイムといった多彩な動作を行うことができます。

まだ詳細な動作解析はしてないのですが、とりあえず手持ちアセットで使えるようにしてみたい!ということで、セットアップ記事を書いてみました。

はじめに

本記事ではUE4標準のマネキンをALSV4で扱えるように一からセットアップしていきますが、他のスケルタルメッシュであってもHumanoidRig互換であれば同じ手順でALSV4で動くようになると思います(ただし後述しますがIK系のボーンはUE4マネキンと同じものがあったようがよい)。

ALSV4で使われているスケルタルメッシュはAnimManと名前がついているので、便宜上本記事ではALSV4のスケルタルメッシュをAnimMan、UE4のマネキンをMannequinと呼ぶ形で記事を進めていきます。

下準備

ALSV4プロジェクトを作成

まずはALSV4を新規プロジェクトとして作成します。

EpicLauncherのライブラリでALSV4を探して「プロジェクトを作成する」をクリックします。

f:id:nca03132:20200415170743p:plain

今回はALSV4という名称でプロジェクトを作ります。

f:id:nca03132:20200415171106p:plain

MannequinをALSV4プロジェクトに追加

次にALSV4を適用するためのMannequinをプロジェクトに追加します。

(※ ALSV4を適用したい自前のスケルタルメッシュがある場合、この工程を行う必要はありません。その代わりそのスケルタルメッシュをALSV4プロジェクトに持ってきておいてください。またその場合は以降の記事でMannequinに関する記述の部分は持ってきたスケルタルメッシュに置き換えて読んでください)

コンテンツブラウザの緑色の「新規作成」ボタンを押し「機能またはコンテンツパックを追加」を選択。

f:id:nca03132:20200415172105p:plain

サードパーソンを選んで緑色の「+プロジェクトに追加」ボタンを押します。

f:id:nca03132:20200415172011p:plain

これでコンテンツブラウザはGeometry、Mannequin、ThirdPerson、ThirdPersonBPが追加され

f:id:nca03132:20200415172336p:plain

という感じになります。

が、Mannequin以外のGeometry、ThirdPerson、ThirdPersonBPフォルダは不要なので削除しておきましょう。結果Mannequinだけが残って

f:id:nca03132:20200415173142p:plain

こんな感じになるはずです。

ケルトンの構造を合わせる

次が本記事のキモ、スケルトンの構造合わせです。

ALSV4は荷物を持ったり銃を構えたりする動きを実現するため仮想ボーンを必要とします。

f:id:nca03132:20200415174527p:plain

この赤い四角で囲ってある部分が仮想ボーンですね。

これ以外にもいくつかあるので、それらを追加していく必要があるのですが、ここで一つ問題があります。

仮想ボーンを追加するためには元のスケルトンにik_foot_root,ik_foot_l,ik_foot_r,ik_hand_root,ik_hand_gun,ik_hand_l,ik_hand_rというIKボーンが必要となるのです。

Mannequinのスケルトンにはそれらがそろっているのですが、そうでない場合は仮想ボーンの追加ができないため一部機能制限を受けることになります。

IKボーンがない場合は次の「仮想ボーンの追加」はスキップしていただき、「仮想ボーンが追加できない場合」に読み進んでください。

仮想ボーンの追加

先ほどのスクリーンショットではAnimManのスケルトンのHand_LにVB LHS_ik_hand_gun、さらにその子供にVB LHS_ik_hand_rが追加されています。まずはこれを追加してみましょう。

MannequinのスケルトンはコンテンツブラウザのMannequin>Character>Meshの中にあるUE4_Mannequin_Skeletonです。これをダブルクリックで開きます。

f:id:nca03132:20200415175743p:plain

まずhand_lを右クリックし表示されたメニューから「仮想ボーンを追加」を選択します。

f:id:nca03132:20200415180206p:plain

ここでターゲットボーンを選択というウィンドウが出てきました。

ボーンはあるボーンから他のボーンへの接続を表しており、仮想ボーンも例外ではありませのでhand_lからどこへつなぐのか聞かれます。

いったん作業を中断してAnimManのスケルトンでHand_Lに設定されていた仮想ボーンを確認してみましょう。

AnimManのスケルトンはコンテンツブラウザでAdvancedLocomotion4>CharacterAssets>MannequinSkeletonの中のALS_Mannequin_Skeletonとなってます。

これをダブルクリックすると

f:id:nca03132:20200415180655p:plain

追加すべき仮想ボーンはVB LHS_ik_hand_gunとなっています。

頭のVBというのは仮想ボーンでは勝手に追加されるため、このボーンの名称は「LHS_ik_hand_gun」ということになります。

名前を見てピンと来たでしょうか?

そうです、この仮想ボーンはhand_lからik_hand_gunにつなげるものです。

正確には仮想ボーンは好きな名前を付けられるため、名前から接続先が判明するわけではないのですが、AnimManの仮想ボーン名はなるべく分かりやすいようにつなぎ先を書いてくれています。

ですのでそれを参考にしたり、実際にAnimManの仮想ボーンがどことどこをつないでいるか目視で確認しながら、Mannequinのスケルトンで同じように対応するボーンにつないでいきます。

では作業に戻って実際にMannequinで仮想ボーンを繋げてみましょう。

先ほどの手順に戻ってMannequinのスケルトンを開きhand_l>仮想ボーンを追加を選んでターゲットボーン選択のウィンドウが開いたところでik_hand_と打ち込んでみます。

候補が絞り込まれるので、ik_hand_gunを選択します。

f:id:nca03132:20200415181709p:plain

これでhand_lからik_hand_gunを接続する仮想ボーンが作られました。

f:id:nca03132:20200415182053p:plain

仮想ボーンの名称はAnimManと合わせなくてはいけないので追加した仮想ボーンを選択した状態でF2を押し、AnimManと同じ「LHS_ik_hand_gun」に名前を変えておきます。

f:id:nca03132:20200415182220p:plain

これで最初の仮想ボーンの追加は完了です。いま追加したLHS_ik_hand_gunを選択した状態でプレビュー画面を見てください。

f:id:nca03132:20200415182546p:plain

左手から右手のハンドガン用IKに向けて黄色いボーンが伸びていれば正しく設定できています。

念のためAnimManの方も見てみましょう。

f:id:nca03132:20200415193805p:plain

はい、ちゃんと同じ位置に仮想ボーンがありますね。オッケーそうです。

さて、AnimManのスケルトンでは、この仮想ボーンの子にさらに仮想ボーンがついてました。

f:id:nca03132:20200415183412p:plain

LHS_ik_hand_rとなってます。この仮想ボーンはLHS_ik_hand_gunからik_hand_rにつながっています。

Mannequinのスケルトンで先ほどと同じ手順でLHS_ik_hand_gunを右クリックし仮想ボーンを追加>ターゲットボーンを選択でik_hand_rを選択します。

f:id:nca03132:20200415183315p:plain

これでLHS_ik_hand_gunの子供としてik_hand_rへつなぐ仮想ボーンが追加されます。

f:id:nca03132:20200415184212p:plain

AniimManと名前を合わせてLHS_ik_hand_rとしておきます。

f:id:nca03132:20200415184623p:plain

はい、これで大体の流れはつかめたでしょうか?

あとは上記の手順を繰り返してAnimManに設定されている仮想ボーンをMannequinで対応する箇所にどんどん追加してください。

以下、追加が必要な仮想ボーン一覧を書き出しておきます。

接続元 接続先 仮想ボーン名
hand_l ik_hand_gun LHS_ik_hand_gun
LHS_ik_hand_gun ik_hand_r LHS_ik_hand_r
hand_r ik_hand_gun RHS_ik_hand_gun
RHS_ik_hand_gun ik_hand_l RHS_ik_hand_l
ik_foot_l foot_l ik_foot_l_Offset
ik_foot_l calf_l ik_knee_target_l
ik_foot_r

foot_r

ik_foot_r_Offset
ik_foot_r calf_r ik_knee_target_r
ik_foot_root foot_l foot_target_l
ik_foot_root foot_r foot_target_r
root root Curves

(※1)接続元、接続先ともに通常のボーンとIK用のボーンを間違えないように

(※2)上記はMannequinのボーン名なので、他のデータではこの通りではない可能性があります。AnimManのボーン構成と適用したいスケルトンのボーン構成を比べながら対応する箇所に適切に仮想ボーンを作成していきます。HumanoidRig互換であれば欠損していない限り対応するボーンは見つかると思います。

設定が終わったらソケットの追加に進んでください。

仮想ボーンが追加できない場合

仮想ボーンの設定が終わっている方は、この項目はスキップしてください。

まずIKボーン・仮想ボーンがなかったらどうなるかですが、後述するアニメーションBPのコンパイル時に対応するボーンが足ないためワーニングが取り切れません。 

そのためIK系の機能が動かなくなるのでオーバーレイメニューで表示される(Qを押すと表示されるやつ)、男性っぽく歩く、女性っぽくあるく、銃を持つ、箱を持つ、タルを持つといったアクションができなくなります。

一方、可能な限りアニメーションBPのワーニングを取れば、通常移動、しゃがみ移動、ダッシュ、段差登り、ジャンプ、ローリングなどは問題なくできるようになります。

これら機能制限があることを理解したうえでお使いいただければと思います。

ということで、次のソケットの追加に進んでください。

ソケットの追加

ALSV4は仮想ボーンのほかに3つほどソケットを参照します。

AnimManのスケルトンを開くとheadボーンの下に3つほどソケットがあります。

f:id:nca03132:20200415194250p:plain

これもMannequin側にコピーしましょう。

AnimManのスケルトンでheadのボーン下にあるTP_CameraTrace_Lを選択しCtrl+Cでコピーします。

次にMannequinのスケルトンを開いて、headのボーンを選択しCtrl+Vでソケットをペーストします。

f:id:nca03132:20200415194501p:plain

これでペーストされました。

同様にTP_CameraTrace_R、FP_CameraもMannequin側にコピペしてください。

f:id:nca03132:20200415195644p:plain

MannequinにHumanoidRigを設定

MannequinはデフォルトではHumanoidRigが適用されてないのでついでに済ませましょう。(自前のスケルタルメッシュですでにHumanoidRig適用済みの場合はこの作業はスキップです)

Mannequinのスケルトンを開いてツールバーのリターゲットマネージャを選択します。

f:id:nca03132:20200415200942p:plain

次にリグを選択の部分をクリックし「ヒューマノイドリグを選択」をクリックします。

f:id:nca03132:20200415201108p:plain

終わったら保存をクリックしてスケルトンを保存しておきます。

f:id:nca03132:20200415201158p:plain

 リターゲットオプションの設定

アニメーションのリターゲットをする前にMannequinのスケルトンのリターゲットオプションを設定しておきます。

この項目は使用するスケルタルメッシュによってベストな設定が変わってくるのでケースバイケースで設定を変更してください(どういったリターゲットオプションが最適なのかは別途リターゲット関連のドキュメントを参照)。

Mannequinのスケルタルメッシュを開き、スケルトンツリータブのOptionsをクリックし、リターゲットオプションを表示にチェックを入れます。

f:id:nca03132:20200415210250p:plain

右側にトランスレーションのリターゲッティングという列が表示されるので

  • rootはアニメーション
  • pelvisはAnimation Scaled
  • ik系統(ik_で始まるボーン)はアニメーション
  • 上記以外はSkeleton

という設定にしておいてください(標準状態だとpelvisの設定を変えるだけかと思います)。変更したらスケルトンを保存しておきます。

アニメーションBPをリターゲットする

ケルトンの構造を合わせ終わったのでいよいよアニメーションBPのリターゲットを行います。

アニメーションBPのリターゲット処理

コンテンツブラウザでAdvancedLocomotionV4>CharacterAssets>MannequinSkeletonを開いて、中にあるALS_AnimBPを右クリック。

Animブループリントをリターゲットする>Animブループリントとリターゲットを複製を選択します。

f:id:nca03132:20200415201503p:plain

ケルトン選択ウィンドウが表示されるので

  • UE4_Mannequin_Skeletonを選択
  • 新規アセット名のSuffixに_Mannequinを指定
  • フォルダの指定でMannequin/Animationsを指定

上記設定を行った後、リターゲットボタンを押します。

f:id:nca03132:20200415202034p:plain

これでアニメーションBPが生成されたはずです。

アニメーションBPのエラー・ワーニング確認

次にアニメーションBPをコンパイルしてエラーやワーニングが出ないか確認します。

AnimManのスケルトンのボーン名と持ち込んだスケルタルメッシュのボーン名が違う場合、アニメーションBPのコンパイル時にワーニングが出ます。

 f:id:nca03132:20200416145544p:plain

これらが出ている箇所についてはALSV4のIK機能は動いていません。

従って、上記ワーニングが出ている箇所について、持ち込んだスケルタルメッシュ上で対応するボーン名に書き換える必要があります。

ワーニングが出ているボーンが持ち込んだスケルタルメッシュのどのボーンに該当するかは、リターゲットマネージャのリグの設定を参考にするとよいでしょう。

f:id:nca03132:20200416152647p:plain

キャラクターBPの作成

次にMannequin用に新しくキャラクターBPを作成します。

といってもAnimManのキャラクターBPをコピーするだけなので簡単です。

コンテンツブラウザでAdvancedLocomotionV4>Blueprints>CharacterLogicの中にあるALS_AnimMan?CharacterBPをMannequin>Characterにドラッグ&ドロップし、「ここにコピー」を選択します。

f:id:nca03132:20200415203912p:plain

コピーしたアセットはBP_Mannequinにリネームしておきます。

f:id:nca03132:20200415204154p:plain

次にこのBP_Mannequinを開いて、コンポーネントでMeshを選択し、SkeletalMeshにSK_Mannequin、AnimClassにALS_AnimBP_Mannequinを選択します。

f:id:nca03132:20200415204346p:plain

次はレベル上に作成したキャラクターBPを配置して動作確認をします。

動作確認その1

作成したBP_Mannequinをレベルに配置します。

f:id:nca03132:20200415204910p:plain

最初からレベルに配置されていたALS_AnimMan_CharacterBPはAuto Possess Playerが設定されているのでDisableにします。

f:id:nca03132:20200415205420p:plain

そして配置したBP_MannequinのAuto Possess PlayerをPlayer0に設定します。

f:id:nca03132:20200415205534p:plain

あとはプレイを押せばMannequinがプレイヤーとして動くようになるはずです。

前後左右やダッシュ、ジャンプといった基本的な移動はできるので確認してみてください。

段差のよじ登り、ローリング、ラグドールからの復帰といったアクションを伴うものはこの段階ではまだできません。IKによる足の設置なども対応されていません。

また終了時に大量にエラーが出る状態となっています。

アクション用のアニメーションをリターゲットする

次にアクション関係の対応です。

アクション用アニメーションのリターゲット

コンテンツブラウザでAdvancedLocomotion4>CharacterAssets>MannequinSkeleton>AnimationExamples>Actionsを開いて、Ctrl+Aを押して中のアニメーションアセットすべてを選択状態にし、右クリックでAnimアセットをリターゲットする>Animアセットとリターゲットを複製するを選びます。

f:id:nca03132:20200415214942p:plain

ケルトン選択ウィンドウが開くのでアニメーションBPをリターゲットしたときと同じように

  • UE4_Mannequin_Skeletonを選択
  • 新規アセット名のSuffixに_Mannequinを指定
  • フォルダの指定でMannequin/Animationsを指定

上記設定を行った後、リターゲットボタンを押します。

f:id:nca03132:20200415215149p:plain

これでアクション用にアニメーションアセットが作成されました。

BP_Mannequinへの適用

作成したアクション用のアニメーションアセットをBP_Mannequinで使用するよう設定します。BP_Mannequinを開いて変数の中の

Mantle Animations,RollAnimations,GetUpAnimations

の項目の中にあるすべてのAnimMontage指定を同名でSuffixに_Mannequinがついているのもに置き換えていきます。

f:id:nca03132:20200415215616p:plain

すべて置き換えたらコンパイル&保存します。

終了時エラーの対処

BP_Mannequinを変更しているので、終了時のエラー対応もしてしまいましょう。

ALSV4はデバッグ機能でメッシュのカラー変更を行えるようになっているのですが、自前で用意したスケルタルメッシュはこれには対応してないので、その部分を削除します。

BP_MannequinのイベントグラフでEventTickの中で呼ばれているUpdate Coloring Systemの呼び出しを削除し、Update Held Object Animationsへ実行ピンをバイパスさせます。

f:id:nca03132:20200415221755p:plain

またその下にあるメッシュをトグルするシステムも対応してないので丸っと削除します。

f:id:nca03132:20200415222100p:plain

コンストラクションスクリプトを選択し、ダイナミックマテリアルを設定している箇所も非対応なので削除します。

f:id:nca03132:20200415222343p:plain

これで終了時エラーは出なくなるはずです。

使わなくなった関数のColoringSystemのネームグループと変数のColorsもすべて削除しておきます。

f:id:nca03132:20200415222757p:plain

動作確認その2

この段階で一度動作検証をしておきましょう。

段差よじ登りやローリングなどのアクションが可能になっているはずです。足のIKによる接地処理も動作しているはずです。

唯一ラグドールからの復帰がきちんと動かないので、次で対応を行います。

物理アセットの設定を合わせる

最後に物理アセットをAnimManに合わせて調整します。

  • AnimManの物理アセット AnimMan_PhysicsAsset
    AdvancedLocomotionV4>CharacterAssets>MannequinSkeleton>PhysicsAssets>AnimMan_PhysicsAsset
  • Mannequinの物理アセット SK_Mannequin_PhysicsAsset
    Mannequin>Character>Mesh>SK_Mannequin_PhysicsAsset

の2つを比較してみます。

f:id:nca03132:20200415224732p:plain

AnimManの物理アセットにはrootのシェイプが作成されていることがわかります。(赤線で囲んだ場所)。

どういったものなのか確認するためにrootのシェイプを選択した状態で画面右側の目玉アイコンから「変更したプロパティのみを表示」にチェックを入れてみます。

f:id:nca03132:20200415225439p:plain

これで標準状態から変更を行ったプロパティのみが表示されます。

f:id:nca03132:20200415225718p:plain

見てみるとPhysicsの設定でAngular Dampingに50が設定されており、PhysicsTypeにKinematicが指定れてます。さらに、CollisionReponseのチェックが外れており、ボディセットアップで半径7.505のSphereがContribute to Massにチェックが入った状態になってます。

とりあえずこれと同じものをMannequin側にも追加する必要があります。

SK_Mannequin_PhysicsAssetを開いて、スケルトンツリーのrootを右クリックしAddShape>AddSphereを選択して球形コリジョンを追加します。

f:id:nca03132:20200415230213p:plain

追加されたシェイプを選択状態にして、右側の詳細パネルの設定をAnimManの設定に合わせて変更します。

f:id:nca03132:20200415230527p:plain

具体的には

  • Angular Damping 50
  • PhysicsType Kinematic
    f:id:nca03132:20200415231003p:plain
  • CollisionResponse チェックを外す

    f:id:nca03132:20200415231051p:plain

  • ボディセットアップのPrimitives>Spheres>0で
    半径 7.505
    Contribute to Mass チェックを入れる

    f:id:nca03132:20200415231403p:plain

といった設定を行います。

あとは、同様の方法でAnimMan_PhysicsAssetの各項目を上から1つずつ確認していき、デフォルトから変更されたプロパティがあれば、Mannequin側のパラメータも合わせて変えていく対応を行っていきます。

ざっと確認したところ、すべてのShape(丸に緑の小さい丸が3個入ってるようなアイコン)のAngular Dampingが50になっているようなので、そこも対応したほうがよさそうですが、スケルタルメッシュのデータ次第なところもあるので適時Mannequin側には調整を行っていただければと思います。

動作確認その3

これでほぼすべての実装は動くようになったかと思いますので、最終確認してみてください。

トラブルシューティング

銃の位置補正

ALSV4では右手に持つ銃は仮想ボーンのRHS_ik_hand_gunにアタッチされるようになっていますが、スケルタルメッシュによっては銃がちゃんとした位置にならないことがあるようです。

はるべえさんの動画(https://www.youtube.com/watch?v=fsP68yQHIbs)では、この回避策として別途スケルトンに銃用のソケットを用意して銃のアタッチはそちらに行うようキャラクターBPを書き換える方法を採用していました。(動画の10:00~あたり)

膝が外向きでおかしな状態になる

仮想ボーンでボーン構造の整合性を取ろうとしたときにIKがおかしくなることがあるようです。原因調査中ですが、いったんは膝関連のIKを外せば動くようになると思います。

アニメーションBPのAnimGraphでFootIKの部分をダブルクリックで開き

f:id:nca03132:20200416170750p:plain

Modify Knee Targets,Apply IK to Feetの部分をバイパスしてつなぎます。

f:id:nca03132:20200416170946p:plain

最後に

もうちょっと完結にまとめられるかと思ったんですが、もろもろ書いてるうちに結構な量になっていまいました。しかも後半かなり駆け足…。

ALSV4は素晴らしいアセットで自作ゲームに取り込みたい方もたくさんいるかと思います。この記事が少しでもそういった方々の助けになってくれたらなと思っています。