Anima2Dでシーンビューからメッシュが消えたときの原因とその対処法

# Anima2Dでシーンビューからメッシュが消えたときの原因とその対処法

この記事は [KMC Advent Calendar 2020](https://adventar.org/calendars/5654) の13日目の記事です。
昨日の記事は matu さんの [キーボードとマウスを乗せる台をDIYしたような、してないような](https://mattan21.hatenablog.com/entry/2020/12/12/151129) でした。

## 目次

<!-- TOC -->

- [Anima2Dでシーンビューからメッシュが消えたときの原因とその対処法](#anima2d%E3%81%A7%E3%83%A1%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8C%E6%B6%88%E3%81%88%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8%E3%81%9D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95)
    - [シーンビュー上で見たときにメッシュが消えている](#%E3%82%B7%E3%83%BC%E3%83%B3%E3%83%93%E3%83%A5%E3%83%BC%E4%B8%8A%E3%81%A7%E8%A6%8B%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%83%91%E3%83%BC%E3%83%84%E3%81%8C%E6%B6%88%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B)
        - [カメラの位置によってメッシュが消える](#%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E8%BF%91%E3%81%A5%E3%81%91%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%83%A1%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8C%E6%B6%88%E3%81%88%E3%82%8B)
            - [原因①：SkinnedMeshRendererのBoundsが小さい](#%E5%8E%9F%E5%9B%A0%E2%91%A0skinnedmeshrenderer%E3%81%AEbounds%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%84)
                - [解決策](#%E8%A7%A3%E6%B1%BA%E7%AD%96)
                - [解決後](#%E8%A7%A3%E6%B1%BA%E5%BE%8C)
                - [捕捉](#%E6%8D%95%E6%8D%89)
        - [カメラの位置に関係なく消えている。メッシュがパーツ毎ではなく中途半端に欠けたように消えている](#%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%8B%E3%82%89%E3%81%AE%E8%B7%9D%E9%9B%A2%E3%81%AB%E9%96%A2%E4%BF%82%E3%81%AA%E3%81%8F%E6%B6%88%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%83%A1%E3%83%83%E3%82%B7%E3%83%A5%E3%81%8C%E3%83%91%E3%83%BC%E3%83%84%E6%AF%8E%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E4%B8%AD%E9%80%94%E5%8D%8A%E7%AB%AF%E3%81%AB%E6%AC%A0%E3%81%91%E3%81%9F%E3%82%88%E3%81%86%E3%81%AB%E6%B6%88%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B)
            - [原因①：ウェイトがゼロ和になっている](#%E5%8E%9F%E5%9B%A0%E2%91%A0%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%88%E3%81%8C%E3%82%BC%E3%83%AD%E5%92%8C%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B)
                - [解決法](#%E8%A7%A3%E6%B1%BA%E6%B3%95)
            - [原因②：ポリゴンが歪んでいる](#%E5%8E%9F%E5%9B%A0%E2%91%A1%E3%83%9D%E3%83%AA%E3%82%B4%E3%83%B3%E3%81%8C%E6%AD%AA%E3%82%93%E3%81%A7%E3%81%84%E3%82%8B)
                - [解決法](#%E8%A7%A3%E6%B1%BA%E6%B3%95)
    - [おわり](#%E3%81%8A%E3%82%8F%E3%82%8A)

<!-- /TOC -->

## シーンビュー上で見たときにパーツが消えている
KMCid: morisawa です。
Anima2Dを利用しているとき[^1]対象のオブジェクトのパーツ、あるいは全体が消えてしまうことが何度かありました。しかもその原因は一つではなく体系化する必要がありそうだったのでまとめてみます。

[^1]: 2Dアニメーションの作成をunity上で出来る無料アセットです。https://assetstore.unity.com/packages/essentials/unity-anima2d-79840?locale=ja-JP ここでの2Dアニメーションとはボーンアニメ―ション（ポリゴンにテクスチャーを貼ってボーンを入れて動かしたり変形させたり）を指します。Anima2Dの使い方は[他のサイト](http://techblog.sega.jp/entry/2018/03/26/100000)などを見てください。


今回はこの適当なキャラに実験台になってもらいます（既にスプライトメッシュにボーンを組み込んでいる状態）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/f3316de1-a7b7-3dd9-cb82-0a56a180183b.png)

このキャラのパーツは頭、右足、左足の三つです。

### カメラの位置によってメッシュが消える

#### 原因①：SkinnedMeshRendererのBoundsが小さい
SpriteMeshにはボーンアニメションのレンダリングに関わるSkinnedMeshRendererというコンポーネントがあります。その中のプロパティであるBoundsがスプライトメッシュを描写するかどうかを決める役割を持っています。
通常メッシュの描画というのは常にされるものではなくて、リソースの節約のためにもカメラから「見えていない」時は描画する必要はありません。そこで、「見えていない」というのを判断するための手段がBoundsです。

>オブジェクトのビジビリティはメッシュの Bounds によって決定されます (言い換えると、全体のバウンディングボリュームはあらゆる有効なカメラの視界角外にある必要があります)。ただし、アニメーションしているメッシュの実際のバウンディングボリュームは、アニメーションの再生によって変化します (例えば、キャラクターが手を頭上に伸ばすと、ボリュームの高さが増えます)

（[unityのマニュアル](https://docs.unity3d.com/ja/2018.4/Manual/class-SkinnedMeshRenderer.html)より引用）

さて、シーンビュー上ではBoundsは下画像のように白い枠として見えます。
Bounds１つのスプライトメッシュにつき１つ存在していて、下の画像では(こちらから見て)左脚パーツのBoundsを示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/d34cf19e-50b7-be45-1b78-35e27e75dc50.png)

このBounds（白枠）がカメラの視野から外れるとメッシュが描画されなくなるという訳です。
ということは、Boundsが実際のメッシュよりも極端に小さいとメッシュがまだシーンビュー内にあるはずなのにカメラ外にあると判定され消えてしまいます。

下の動画ではBoundsが小さいためカメラを左に移動するとボーンだけを残して左脚パーツが消えていることが分かります。
![bounds_unusual.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/6057e1e5-aefb-5816-c534-c95a0e9ec230.gif)

##### 解決策

Boundsをメッシュよりも十分に大きくすれば大丈夫です。
Boundsの`Extent`を動かすとBoundsのサイズ調整ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/5e23cc1d-2638-1568-0319-f6d776ae009a.png)

##### 解決後

![bounds_usual.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/d8d4e71e-08d3-6e02-42ea-200bd7ce0f24.gif)



##### 補足

`Update When Offscreen`プロパティを有効にして
カメラから見えていない時は描画するという設定自体を捨てることで解決することもできますが、マニュアルにあるようにリソースの無駄になるので最善策ではないと思います。

### カメラからの距離に関係なく消えている。メッシュがパーツ毎ではなく中途半端に欠けたように消えている

#### 原因①：ウェイトがゼロ和になっている

ポリゴンごとにボーンからのウェイトを設定できますが、その総和は通常ゼロになるようにします。
![スクリーンショット (807)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/8033d90d-c01b-2701-55bd-3d1bc4eb239f.jpeg)


もしあるポリゴンの総和をゼロにしてしまうと（どのボーンからのウェイトも置かれていない状態）、そのポリゴンは**無いもの**として扱われてしまうようです。

下の画像の一枚目が一部のポリゴンのウェイトをゼロ和にした状態です。SpriteMeshEditor上では黒点で表示されています。
二枚目はその状態のメッシュをシーンビュー上で見た様子です。
ゼロ和になっているポリゴン上にあるテクスチャが消えていることが分かります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/d7fbc223-436e-c7a5-bae1-17f4e1f7be04.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/8fbe7429-c2dc-1fbd-a5f6-8139a7dcded5.png)


##### 解決法

SpriteMeshEditor上で`Auto`を押すなり手動でウェイトを設定するなりで解決できます。

#### 原因②：ポリゴンが歪んでいる

ポリゴンはテクスチャの下に敷かれているべきですが、下の画像では大きくゆがんでテクスチャの形に沿うようになっていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/1b80f405-622f-a3f0-f81e-8d8ec7e902be.png)

この場合、ポリゴンからはみ出るテクスチャが出てきてしまいますがそうしたテクスチャは描画されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652143/d31a72fb-3243-add2-1e2d-7e8d5122e87d.png)
このことはポリゴンが消失扱いにされてテクスチャが消えている原因②と似ている気がします。


##### 解決法
SpriteMeshEditor上で手動で戻すか再度`slice`ボタンを押してスライスするかになりそうです。

## おわり

自分が出会ったケースを基に書いたので全ての原因を網羅しているわけではないと思いますが取り合えず備忘録としてまとめました。
誤った点があればご指摘ください。

明日の [KMC Advent Calendar 2020](https://adventar.org/calendars/5654) は kyp さんの記事になります。