キャラクターにアニメーションを適用する
AnimInstanceクラス
前回はCharacterクラスを使ってPawn(Character)を操作する所まで作成しました。
今回はFBXでインポートしたアニメーションをキャラクターに適用して行きます。
UE4ではアニメーションをState Machineで管理しています。
State Machineとは現在の状態(State)と入力条件により、次の状態が決まる順序回路の事を言います。
Unityでも同様にステートマシンでアニメーション管理されていたかと思います。
そして、State Machineから成るアニメーションを管理するものとしてAnimInstanceクラスが存在します。
また、このAnimInstanceで作成されたBlueprintをAnimation Blueprintと言います。
では、さっそくAnimation Blueprintを作成して行きます。
Animation Blueprint作成
今回の作業も前々回、前回の続きを想定しています。
アニメーションのFBXインポートはこちらをご確認ください。
まずContent BrowserからAnimation > Animation Blueprintの順に選択してBlueprintを作成します。
親クラスにAnimInstanceを選択し、SkeletonにはSK_Mannequin_Skeletonを選択します。
名前はMyAnim_BPとして、作成したBlueprintsフォルダに配置します。
出来たMyAnim_BPを開くと次のようなEvent GraphとAnim Graphという二つのGraphを持った画面が表示されます。
Event Graphではアニメーションに関わるBlueprintのスクリプティングをし、Anim Graphではアニメーションのステートマシンでアニメーションの遷移を作成して行きます。
では、State Machineを新規に作成してみましょう。
Anim Graph内の空白を右クリックした後、Add New State Machineと入力し、新しいState Machineを作成します。
F2で名前をTopStateと変更します。
次にTopStateをダブルクリックすると、TopState内のAnim Graphへと遷移します。
Asset Browser内にThirdPersonIdleというアニメーションがあるので、ドラッグ&ドロップすると新しいステートが作成されます。
F2でステート名をIdleに変更し、Entryにつなぎます。
一番上の階層のAnim Graphに戻ります。
下の画像にあるようにAnim Graphを選択する事で戻る事が出来ます。
戻ったら、TopStateとFinal Animation Poseを繋ぎコンパイルします。
コンパイルが終わると下の画像のようにState MachineからFinal Animation Poseへと遷移し、プレビューのモデル(グレイマンと呼ばれているらしいので、以後グレイマンと呼びます)が待機アニメーションを始めたはずです。
次に作成したAnimation BlueprintをCharacterに適用します。
MyCharacter_BPを開き、Mesh ComponentのDetailsタブ内のAnimation Classに作成したMyAnim_BPを指定します。
MyAnim_BPをコンパイルし、Level Editorもコンパイルします。
すると、レベル上でもアニメーションをしているのが確認出来ました。
よし、成功!
っと、よく見るとグレイマンの左肩が脱臼したみたいになってます。。。
これが前々回のアニメーションをインポートした際に出た警告の結果です。
これはスケルトンのボーンとアニメーションのボーンとで差異がある事に起因しています。
そこで、その差異を修正するためにアニメーションのTranslation Retargetingというものが必要になります。
アニメーションのTranslation Retargeting
もう一度MyAnim_BPを開き、メニュー下にあるAnimationという項目を選択します。
次のような画面になるので、画面左Skeleton Treeタブ内のShow Advanced Optionsにチェックを入れます。
Skeleton TreeにTranslation Retargetingと言うものが表示されたはずです。
Translation (Re)targetingとは何かと言うとアニメーションの平行移動を何を元に行うかという設定です。
初期状態だと全てAnimationになっています。
この設定を現在のSkeletonに合わせるため、全てをSkeletonに変更します。
Skeleton Tree内で右クリックし、Recursively Set Translation Retargeting Skeletonを選択します。
すると、Translation Retargetingが全てSkeletonに変わったのが確認出来ます。
プレビューを確認すると脱臼は治りましたが、グレイマンが床に埋まってしまっています。
どうやら、全てをSkeletonにしただけでは駄目なようです。
pelvis(骨盤)の位置まで床に埋まってしまっているので、AnimationとSkeletonでpelvisの位置が違っているようです。
pelvisの位置をAnimationでの位置になるようにスケールをかけます。
pelvisのTranslation RetargetingをAnimation Scaledに変更します。
これで、床に足がつくようになりました。
最後にrootのTranslation Retargetingですが、Skeletonだとアニメーションによっては起点からずれてしまう事にもなるので、rootのTranslation RetargetingをAnimationに変更します。
現在のアニメーションだと違いは出ませんが、これでRetargetingが終了です。
最後にレベル上で確認してみます。
腕はちゃんと繋がっていますね。
今回はAnimInstanceクラスを親としたAnimation Blueprintの作成とTranslation RetargetingによるSkeletonの調整まで行いました。
また、今回のRetargetingは平行移動についてですが、AnimationのボーンをSkeletonのボーンに変更するRetargingも存在します。
そちらについてもまた追々紹介出来ればと思います。
次回は少し外れて、SpriteStudioの導入について紹介しようと思います。