UE4 SlotAnimationについて

# 概要
UnrealEngine のスロットアニメ―ションについてのメモ書きです。
アニメ―ションモンタージュは使っていません。

## 環境
Windows10
Visual Studio 2017
UnrealEngine 4.22

## 修正履歴
|日付|内容|
|:---------|:-------|
|2020/01/11| ボーン毎のレイヤーブレンドのLOD設定について追記|

## 参考
以下を参考にさせて頂きました、ありがとうございます。

[UE4 Saitama 初心者向けハンズオン #5 『アニメーションモンタージュ(Slotアニメーション)でコンボを作る』](https://www.slideshare.net/YuukiOgino/ue4-saitama-5-slot)
[UE4勉強会 in 大阪 - アニメーション基礎](https://www.slideshare.net/com044/ue4-in-91056422)
[[CEDEC2018] UE4アニメーションシステム総おさらい](https://www.slideshare.net/EpicGamesJapan/cedec2018-ue4-111104578)


# スロットアニメ―ション基本
スロットアニメ―ションで指定できるアセットは[アニメ―ションシーケンス]か[アニメ―ションモンタージュ]です。ブレンドスペースなどは使えません。

通常は元のアニメ―ションポーズが再生され、スロットアニメ―ションに再生命令が入ったときのみスロットアニメ―ションのアニメ―ションが優先して再生されます。（元のアニメ―ションは維持されています）

![SlotAnimBase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/3e8c97a3-cc93-667c-898f-b586aef91d1d.png)


スロットアニメ―ションのブレンドには必ずポーズをキャッシュして繋ぐ必要があります。
![SlotAnimBlend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/5fab165c-f189-4d54-23d8-6203c16726de.png)



## アニメ―ションBPでの再生
アニメーションの再生/停止命令はアニメ―ションBPで行います。

### 再生
[Play Slot Animation]と[Play Slot Animation as Dynamic Montage]の２つがありますが、[～ as Dynamic Montage]のほうが推奨されているようです。
![PlaySlotAnimBP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/dfcf789b-2c6d-757b-22fb-3b7198608ab6.png)


```cpp:AnimInstance.h
// 動的にモンタージュを作成し、スロットノードで通常のアニメーションアセットを再生する。
UFUNCTION(BlueprintCallable, Category="Animation")
UAnimMontage* PlaySlotAnimationAsDynamicMontage(UAnimSequenceBase* Asset, FName SlotNodeName, float BlendInTime = 0.25f, float BlendOutTime = 0.25f, float InPlayRate = 1.f, int32 LoopCount = 1, float BlendOutTriggerTime = -1.f, float InTimeToStartMontageAt = 0.f);
```

### 停止
停止です、スロット名の指定が必要です。
![StopSlotAnimBP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/79535680-9235-167b-c987-1f4d4e570477.png)

```cpp:AnimInstance.h
// 現在再生中のスロットアニメーションを停止する
UFUNCTION(BlueprintCallable, Category="Animation")
void StopSlotAnimation(float InBlendOutTime = 0.25f, FName SlotNodeName = NAME_None);

```

### 再生中の確認
スロット名の指定とアセット名の指定が必要なようです。
![IsPlaySlotAnimBP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/6ce94dac-2017-4c20-6442-6c7d45f9a681.png)

```cpp:AnimInstance.h
// スロットアニメーションを再生している場合はtrueと再生中のモンタージュを返す
bool IsPlayingSlotAnimation(const UAnimSequenceBase* Asset, FName SlotNodeName, UAnimMontage*& OutMontage) const;

```

## C++での再生例
アニメ―ションシーケンスをコンストラクタで取得し、スケルタルメッシュコンポーネントからアニムインスタンス経由でスロットアニメ―ションを再生できます。

```cpp:.h
UPROPERTY()
UAnimSequenceBase* AnumSeq;
```

```cpp:.cpp
// コンストラクタ
static ConstructorHelpers::FObjectFinder< UAnimSequenceBase > find_data(TEXT("AnimSequence'/Game/TestAnim.TestAnim'"));
if (find_data.Succeeded()) {
	AnumSeq = find_data.Object;
}

...

// 「DefalutSlot」でスロットアニメ―ションを再生する
SkeletalMeshComponent->GetAnimInstance()->PlaySlotAnimationAsDynamicMontage(AnumSeq, TEXT("DefaultSlot"), 0.0f);

```


# 複数スロット時の再生について
アニメ―ションスロットは複数作成可能です。
複数スロットにてアニメーション再生を行った場合の挙動の確認のため、[DefaultSlot]と[ExtraSlot]に対し、別のアニメ―ション再生命令を行います。

## 1グループ2スロットの場合
- (グループ)DefaultGroup
 - (スロット)DefaultSlot
 - (スロット)ExtraSlot

グループはどちらも`[DefaultGroup]`です。
![MultiSlotAnim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/36f20dd7-6ca9-2e93-b7e1-a2748094e861.png)

`[ExtraSlot]`で再生しても`[DefaultSlot]`で再生しても後から処理した方が優先になり、前に再生していたスロットアニメ―ションは停止するようです。


## 2グループ各1スロットの場合
- (グループ)DefaultGroup
 - (スロット)DefaultSlot
- (グループ)ExtraGroup
 - (スロット)ExtraSlot

グループはそれぞれ`[DefaultGroup]`と`[ExtraGroup]`です。
![MultiSlotAnim2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/8d9dc890-f54f-589f-22bf-259a458fd635.png)

後ろにつなげた`[ExtraSlot]`が優先になるため、`[ExtraSlot]`で再生中に`[DefaultSlot]`で再生処理を行っても表示されませんが、再生処理は行われているため、`[ExtraSlot]`でのスロットアニメ―ションが終了した後に`[DefaultSlot]`で再生したスロットアニメーション時間が残っていればその残り分が再生されます。


# 部分アニメーション

ポーズをキャッシュした上で元のポーズとスロットアニメ―ションのポーズを[ボーン毎のレイヤードブレンド]で繋ぎます。
![SlotAnimBlend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/c80606a6-f463-cdf7-5c95-d6ca8434948a.png)


フィルタリングするボーン名（適用するボーン名）[BoneName]とブレンド階層数[BlendDepth]を指定します。複数指定も可能です。
![LayeredBlend_Setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/10eb2002-331d-4820-e122-7ebdf82d2b16.png)

これで元のポーズからスロットアニメ―ションで再生したアニメーションの一部だけブレンドしたアニメーションが最終アニメ―ションポーズとして再生されます。

## LOD設定
[Performance] の[LOD Threshold]でLOD設定ができます。
0 = LODを行わない、1以上=指定レベル以上でのLOD処理を行わない
となっているようです。


# まとめ
スロットアニメ―ションを使うとアニムステートの整理などにも使えますが、アニムグラフの構成がカオスになりそうなので注意が必要かと思われます。