[UE5] UE5.2で更に便利になった 互換スケルトン (Compatible Skeletons)について

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/7172feb4-6d80-834b-7f4b-296484337193.png)
UE4では全く同じボーン構成であっても、Skeletonアセットが異なっているとアニメーションを使い回す・共通化することが少し面倒でした。
しかし、UE5からCompatible Skeletonsという機能が入り、Skeletonアセットが共通化されていない場合でもボーン構成が（だいたい）同じならアニメーションを使い回せるようになりました！

[UE5公式ドキュメント：「互換性のあるスケルトン」](https://docs.unrealengine.com/5.1/ja/skeletons-in-unreal-engine/#%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%82%B9%E3%82%B1%E3%83%AB%E3%83%88%E3%83%B3)
[講演スライド：UE5でのアニメーションの流用方法について【Compatible Skeletons, IK Retargeter】](https://www.docswell.com/s/EpicGamesJapan/KQN3EK-UE5-ShareAnimation#p16)


**そんな便利なCompatible Skeletonsですが、UE5.2で更に便利になりました！**
そこで、本記事では具体的にどう便利になったのかについて説明します。なお、「上述の資料を軽く読んだ」 または「UE5.0, 5.1版のCompatible Skeletons機能を触ったことがある」ことを前提としています。
# 互換性の設定が双方向に
1つ目から地味な内容ではありますが、Compatible Skeletonsの設定が双方向に機能するようになりました！

UE5.1以前では

- Skeleton A の Compatible Skeletonsに Skeleton Bを追加した場合
    - Skeleton Aを使う Mesh A : Skeleton Bのアニメーションが利用可能に
    - Skeleton Bを使う Mesh B : 特に変化なし

でしたが、UE5.2からは…
- Skeleton A の Compatible Skeletonsに Skeleton Bを追加した場合
    - Skeleton Aを使う Mesh A : Skeleton Bのアニメーションが利用可能に
    - **Skeleton Bを使う Mesh B : Skeleton Aのアニメーションが利用可能に**

となり、Compatible Skeletons設定が両方のSkeletonに適応されるようになりました！地味ですが便利！
# Compatible Skeletons設定をしなくても、他Skeletonのアニメーションアセットを設定・利用可能に
![ddd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/6c2addb1-5c88-3a86-bc6f-5ab0895cea56.gif)
UE4ではスケルトンを共通化しないとアニメーションアセットが選択対象になりませんでした。また、他Skeletonのアニメーションアセットを強引に設定したとしても下記のエラーが発生していまいました。
`Sequence Player 'MM_Walk_Fwd'  references Anim Sequence Base that uses an incompatible skeleton  SK_Mannequin`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/6b01caab-bf93-9950-f11a-dd630191bc6d.png)
UE5で追加されたCompatible Skeletonsは上記の問題を解決しましたが、Skeletonアセットが大量にあるプロジェクトの場合は設定していくのが少々面倒です。

そこで追加されたのが **Allow Incompatible Skeletons** 機能です。このオプションを有効にすると、Compatible Skeletons設定をしていなくても他Skeletonのアニメーションアセットを設定・使用することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/b9e9ff64-d946-df74-f55d-9eecd88135e6.png)
この**Allow Incompatible Skeletons** はアセット選択画面のオプション または エディタ設定の「Allow Incompatible Skeleton Selection」からON/OFFを切り替えることができます（設定内容は共通です）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/9ad00807-73cb-3dbc-0010-f2b7a7f80e69.png)
なお、ボーン構造が大きく異なるSkeletonのアニメーションアセットも選択可能になりますが、Compatible Skeletonsの仕様により**ボーンの階層構造や命名規則が異なる場合は正常に動作しません。** 具体的には、階層構造・名前が完全に一致しているボーンだけアニメーションが適応されます（下の動画ではrootとpelvisボーンだけ一致しています）。
![eee.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363889/a658a647-d440-8f32-45fd-ee09ae41a51f.gif)
一目で問題が発生している事がわかりますが、ログにWarningやErrorは出力されないのでご注意ください。そのため、もしヒューマンエラーを回避するために設定可能なアニメーションを制限したい場合はSkeletonを共有化させるか、Compatible Skeletons設定を適切に行う必要があります。
# Compatible Skeletons設定がEditor Onlyに
※ 内部実装の話になるため、大半の方は読み飛ばしても大丈夫です

UE5.1以前のCompatible Skeletonsはランタイムにも関わる機能でしたが、UE5.2ではEditor Onlyの機能になりました。
具体的には、UE5.1ではアニメーションのロード時にCompatible Skeleton設定に基づいてリマッピング処理が行われていましたが、**UE5.2ではその設定を行わなくても必要に応じてリマッピング処理が行わます。なお、具体的にはアニメーションの解凍時にリマッピング処理がWorker Thread上で行われるようになります。そして、その結果はスレッドセーフな箇所にキャッシュされます。** 詳細は`Skeleton.h/cpp`における変更点や`FSkeletonRemappingRegistry`の実装、そして下記の処理流れをご確認ください

```
DecompressPose
-> FAnimationRuntime::RetargetBoneTransform
-> FSkeletonRemappingRegistry::GetRemapping
-> FSkeletonRemapping::FSkeletonRemapping
-> FSkeletonRemapping::GenerateMapping
```

# おわりに
基本的な制限に対しての更新はありませんが、UE5.0, 5.1では少し手間だった部分に対して改良が入りました。その結果、**ボーンの階層構造・命名規則の共通化・ルール付けしているプロジェクトではCompatible Skeletonsの恩恵を受けやすくなった**かと思います。ただ逆に言いますと、**階層・命名が無茶苦茶になっている場合は機能しません。**

Compatible Skeletonsを使って作業効率を上げるためにも、ボーンの階層構造・命名規則はプロジェクトの序盤に決めておきましょう！
おしまい