ぼっちゲーム開発

Unreal Engineを中心とした3Dツール周りのネタを備忘録を兼ねて気ままに書き連ねています

キャラクターにアニメーションを適用する

AnimInstanceクラス

前回はCharacterクラスを使ってPawn(Character)を操作する所まで作成しました。

今回はFBXでインポートしたアニメーションをキャラクターに適用して行きます。

UE4ではアニメーションをState Machineで管理しています。

State Machineとは現在の状態(State)と入力条件により、次の状態が決まる順序回路の事を言います。

Unityでも同様にステートマシンでアニメーション管理されていたかと思います。

そして、State Machineから成るアニメーションを管理するものとしてAnimInstanceクラスが存在します。

また、このAnimInstanceで作成されたBlueprintをAnimation Blueprintと言います。

では、さっそくAnimation Blueprintを作成して行きます。

Animation Blueprint作成

今回の作業も前々回、前回の続きを想定しています。

アニメーションのFBXインポートはこちらをご確認ください。

msyasuda.hatenablog.com

まずContent BrowserからAnimation > Animation Blueprintの順に選択してBlueprintを作成します。

 

f:id:msyasuda:20161112001417j:plain

 

親クラスにAnimInstanceを選択し、SkeletonにはSK_Mannequin_Skeletonを選択します。

 

f:id:msyasuda:20161112001722j:plain

 

名前はMyAnim_BPとして、作成したBlueprintsフォルダに配置します。

 

f:id:msyasuda:20161112002712p:plain

 

出来たMyAnim_BPを開くと次のようなEvent GraphとAnim Graphという二つのGraphを持った画面が表示されます。

Event Graphではアニメーションに関わるBlueprintのスクリプティングをし、Anim Graphではアニメーションのステートマシンでアニメーションの遷移を作成して行きます。

 

f:id:msyasuda:20161112003112j:plain

 

では、State Machineを新規に作成してみましょう。

Anim Graph内の空白を右クリックした後、Add New State Machineと入力し、新しいState Machineを作成します。

 

f:id:msyasuda:20161112003419j:plain

 

F2で名前をTopStateと変更します。

次にTopStateをダブルクリックすると、TopState内のAnim Graphへと遷移します。

Asset Browser内にThirdPersonIdleというアニメーションがあるので、ドラッグ&ドロップすると新しいステートが作成されます。

 

f:id:msyasuda:20161112004146j:plain

 

F2でステート名をIdleに変更し、Entryにつなぎます。

 

f:id:msyasuda:20161112004634j:plain

 

一番上の階層のAnim Graphに戻ります。

下の画像にあるようにAnim Graphを選択する事で戻る事が出来ます。

 

f:id:msyasuda:20161112004829j:plain

 

戻ったら、TopStateとFinal Animation Poseを繋ぎコンパイルします。

 

f:id:msyasuda:20161112005055j:plain

 

コンパイルが終わると下の画像のようにState MachineからFinal Animation Poseへと遷移し、プレビューのモデル(グレイマンと呼ばれているらしいので、以後グレイマンと呼びます)が待機アニメーションを始めたはずです。

 

f:id:msyasuda:20161112005245j:plain

 

次に作成したAnimation BlueprintをCharacterに適用します。

MyCharacter_BPを開き、Mesh ComponentのDetailsタブ内のAnimation Classに作成したMyAnim_BPを指定します。

 

f:id:msyasuda:20161112005948j:plain

 

MyAnim_BPをコンパイルし、Level Editorもコンパイルします。

すると、レベル上でもアニメーションをしているのが確認出来ました。

 

f:id:msyasuda:20161112010401g:plain

 

よし、成功!

っと、よく見るとグレイマンの左肩が脱臼したみたいになってます。。。

これが前々回のアニメーションをインポートした際に出た警告の結果です。

これはスケルトンのボーンとアニメーションのボーンとで差異がある事に起因しています。

そこで、その差異を修正するためにアニメーションのTranslation Retargetingというものが必要になります。

 

アニメーションのTranslation Retargeting

もう一度MyAnim_BPを開き、メニュー下にあるAnimationという項目を選択します。

 

f:id:msyasuda:20161112011322j:plain

 

次のような画面になるので、画面左Skeleton Treeタブ内のShow Advanced Optionsにチェックを入れます。

Skeleton TreeにTranslation Retargetingと言うものが表示されたはずです。

Translation (Re)targetingとは何かと言うとアニメーションの平行移動を何を元に行うかという設定です。

初期状態だと全てAnimationになっています。

 

f:id:msyasuda:20161112011607j:plain

 

この設定を現在のSkeletonに合わせるため、全てをSkeletonに変更します。

Skeleton Tree内で右クリックし、Recursively Set Translation Retargeting Skeletonを選択します。

 

f:id:msyasuda:20161112012637j:plain

 

すると、Translation Retargetingが全てSkeletonに変わったのが確認出来ます。

プレビューを確認すると脱臼は治りましたが、グレイマンが床に埋まってしまっています。

どうやら、全てをSkeletonにしただけでは駄目なようです。

 

f:id:msyasuda:20161112012939j:plain

 

pelvis(骨盤)の位置まで床に埋まってしまっているので、AnimationとSkeletonでpelvisの位置が違っているようです。

pelvisの位置をAnimationでの位置になるようにスケールをかけます。

pelvisのTranslation RetargetingをAnimation Scaledに変更します。

これで、床に足がつくようになりました。

 

f:id:msyasuda:20161112013415j:plain

 

最後にrootのTranslation Retargetingですが、Skeletonだとアニメーションによっては起点からずれてしまう事にもなるので、rootのTranslation RetargetingをAnimationに変更します。

 

f:id:msyasuda:20161112014201j:plain

 

現在のアニメーションだと違いは出ませんが、これでRetargetingが終了です。

最後にレベル上で確認してみます。

腕はちゃんと繋がっていますね。

 

f:id:msyasuda:20161112015038g:plain

 

今回はAnimInstanceクラスを親としたAnimation Blueprintの作成とTranslation RetargetingによるSkeletonの調整まで行いました。

また、今回のRetargetingは平行移動についてですが、AnimationのボーンをSkeletonのボーンに変更するRetargingも存在します。

そちらについてもまた追々紹介出来ればと思います。

 

次回は少し外れて、SpriteStudioの導入について紹介しようと思います。