Unityシーン容量削減勉強会 第4回 ～アニメーション編～

# Unityシーン容量削減勉強会 第4回 ～アニメーション編～

スペックの高くない視聴端末でも快適に動作するように、Unityシーンの容量を削減することは重要です！
テクスチャとモデルの次に容量が大きくなりがちなのは、アニメーションです。
こちらも軽量化できるとこはしていきましょう！

本記事は、シーン容量削減勉強会の第4回の資料ですが、過去の記事を読んでいなくても問題ありません！
興味があれば、読んでいただけると嬉しいです！

##### Unityシーン容量削減勉強会シリーズ

- [Unityシーン容量削減勉強会 第1回 ～容量順でソートする編～](https://qiita.com/segur/items/c766b0512ab51b6bed4a)
- [Unityシーン容量削減勉強会 第2回 ～テクスチャ編～](https://qiita.com/segur/items/4559edc2e0d4353204d9)
- [Unityシーン容量削減勉強会 第3回 ～モデル編～](https://qiita.com/segur/items/550af881e7e8d5470b92)
- Unityシーン容量削減勉強会 第4回 ～アニメーション編～ ← 本記事


# アニメーションの設定を見直そう！

アニメーション毎の設定を見直しましょう！
FBXファイルを選択し、 `Inspector` ウィンドウの `Animation` タブをクリックすると、以下のような設定項目が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/629e14a9-f9c8-5ac4-3c52-dec449a2c0a2.png)


今回はこの中で、容量削減に効果がありそうな項目を紹介します。

## Anim. Compression

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/4cd126fa-6ff5-0006-71e3-b4bf5f00da80.png)

`Anim. Compression` は、アニメーションの圧縮レベルの設定です。

以下の選択肢があります。

| 圧縮タイプ            | 品質 | 容量 | 機能 |
| -------------------- |:---:|:---:|---|
| `Off`                | 高  | 大  | 圧縮しません。 |
| `Keyframe Reduction` | 中  | 中  | キーフレームの数を減らします。<br>何を基準に減らすかは、後述の `Rotation Error` , `Position Error` , `Scale Error` によって決まります。 |
| `Optimal`            | 中  | 小  | 具体的なアルゴリズムは公開されていませんが、 [こちらの記事](https://www.techarthub.com/animation-compression-unity/) によると、以下の２つの処理を組み合わせているそうです。<ul><li>アニメーションが短い場合やノイズが多い場合は、 `dense format` で圧縮</li><li>そうでない場合は、キーフレーム削減で圧縮</li></ul>キーフレームは、後述の `Rotation Error` , `Position Error` , `Scale Error` にしたがって減らします。<br> `dense format` が何なのかは情報が見つかりませんでしたが、おそらく数値の量子化（浮動小数点数をより少ない精度の数値に変換すること）やデータのエンコーディング（特定のパターンを利用してデータをより効率的に表現すること）を駆使して、データを圧縮した形式だと予想します。|

`Off` はかなり容量が大きくなるので、強いこだわりがなければ選ばない方がよいです。
（オリジナルのアニメーションファイルに徹底した軽量化をすでに実施しているのであれば、 `Off` を選びましょう。）

`Keyframe Reduction` よりも `Optimal` の方が新しいアルゴリズムであり、容量が小さくなりやすいらしいので、 **迷ったら `Optimal` を選択した方が良さそうです。**


## Rotation Error

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6fb46abe-adeb-8844-b52c-309b5c19ab0e.png)

`Anim. Compression` が `Keyframe Reduction` または `Optimal` のときに、 `Rotation Error` という項目が設定できます。

`Rotation Error` では、アニメーション圧縮時に許容される **回転の誤差の上限** を設定できます。
単位は度数（°）です。

つまり、デフォルトの `0.5` は、 **最大0.5°まで回転の誤差を許容する** という意味になります。

以下が圧縮結果の例です。

| `Rotation Error`| 容量 | 描画例 |
|---:|---:|---|
| オリジナル<br>（ `0°` ） | 249kB<br>100.0% | ![unity-animation-compression-off.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/5d8b7e19-81d6-091d-e511-f816c08d76f1.gif) |
| `0.5°` | 119kB<br>47.8% | ![unity-animation-compression-0.5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/6a4f373e-f774-95fa-c27e-9691aaf1c92d.gif) |
| `10°`  | 69kB<br>27.7% | ![unity-animation-compression-10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/2daa5cfd-ca9f-53f3-2418-3f08d0ee929c.gif) |
| `100°` | 14kB<br>5.6% | ![unity-animation-compression-100.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/d4444463-59bb-457e-a9ff-52f756f89585.gif) |
||| 図転載: [Animation Compression in Unity](https://www.techarthub.com/animation-compression-unity/) |

上図の `100°` を見ると、右足が地面にピタっと接地する動きが欠落し、地面にめり込んでいることがわかります。

このように `Rotation Error` が大きくなるほど、アニメーションの品質が低下しますので、 **パフォーマンスと品質のトレードオフ** があります。

デフォルトの `0.5°` は、どこが劣化したのかわからないほど高品質ですが、容量は半分ほど削減できていますので、 **迷ったら `0.5°` で良い** かと思います。



## Position Error

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/709cf0c3-d1e9-2dc7-f6a9-4164dea740ca.png)

`Anim. Compression` が `Keyframe Reduction` または `Optimal` のときに、 `Position Error` という項目が設定できます。

`Position Error` では、アニメーション圧縮時に許容される **位置の誤差の上限** を設定できます。
単位はパーセント（%）です。

つまり、デフォルトの `0.5` は、 **最大0.5%まで位置の誤差を許容する** という意味になります。

以下が圧縮結果の例です。

| `Position Error` | アニメーションカーブ例 |
|---:|---|
| オリジナル<br>（ `0%` ） | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/0f10f7f3-ec72-0c28-f121-e4ccd86da62d.png) |
| `10%` | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/568d7338-55d1-973a-7bbf-d1b993ef661a.png) |
|| 図転載: [Unity Documentation / Animation タブ](https://docs.unity3d.com/ja/2019.4/Manual/class-AnimationClip.html) |

オリジナルのアニメーションカーブだと2つの山がありますが、圧縮後のカーブだと右の山がなくなっています。
これは右の山のキーフレームが `Position Error` 10%を下回っていたので削減された結果になります。

このように、 `Position Error` を大きくすると品質が著しく下がってしまうことがあるので、注意が必要です！

## Scale Error

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/747a1069-6a0d-8088-fd93-f5258ce7913d.png)

`Anim. Compression` が `Keyframe Reduction` または `Optimal` のときに、 `Scale Error` という項目が設定できます。

`Scale Error` では、アニメーション圧縮時に許容される **スケールの誤差の上限** を設定できます。
単位はパーセント（%）です。

つまり、デフォルトの `0.5` は、 **最大0.5%までスケールの誤差を許容する** という意味になります。

# さいごに

本記事は、以下のページを参考にさせていただきました。ありがとうございました。

- [Unity Documentation / Animation タブ](https://docs.unity3d.com/ja/2019.4/Manual/class-AnimationClip.html)
- [Unity Documentation / ファイルサイズの削減](https://docs.unity3d.com/ja/2019.4/Manual/ReducingFilesize.html)
- [Unity で作ったアプリのサイズを減らす 20 の方法【Unity】【容量削減】](https://kan-kikuchi.hatenablog.com/entry/Unity_App_Size)
- [Animation Compression: Unity 5](http://nfrechette.github.io/2017/01/30/anim_compression_unity5/)
- [Animation Compression in Unity](https://www.techarthub.com/animation-compression-unity/)

これで、Unityシーン容量削減勉強会は終了です！

ここまですべて実践いただいた方！
もうUnityの容量削減、怖くありませんよね！

みなさまのお役に立てたなら幸いです！

これも何かのご縁ですので、 [Twitter](https://twitter.com/segur_vita) などフォローしていただけるととても嬉しいです！
（普段は、VR・ARに関する発信が多めですが、それでも構わなければ！）

以上、おつかれさまでした！