Unity - Simplygonでメッシュの結合をしてみる

今回はUnityにて、Simplygonというツールを使って、メッシュの結合を行ってみようと思います。

メッシュを結合すると、扱いやすくなったりライトマップを焼く際に余計な場所まで焼かなくて良くなります。
また、今回のように見えなくなる部分のポリゴンを削減することで、メッシュを表示する際の負荷軽減にも繋がります。

Unityでメッシュの結合といえば、Mesh Bakerが有名ですが、Simplygonを使用すると**メッシュ結合時に重なって見えなくなったメッシュを除去**してくれます。

:::note
環境
Unity 2020.3.18f1
Simplygon 9 SDK 9.1.34800.0
:::

:::note alert
・2021/09時点では、Unity 2021ではSimplygonは使用できません。
・SimplygonはWindowsでのみ動作します。
:::

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Simplygon使ってみました<br><br>もともと小さいパーツのメッシュを組み合わせていたので、重なって見えなくなる部分が無駄になっていました。<br><br>Simplygonでメッシュ結合を行って、この重なった部分を除去することができました～<br>わかりづらいですが、２枚目が従来のメッシュ、3枚目が最適化されたものです <a href="https://t.co/Mx5969a1St">pic.twitter.com/Mx5969a1St</a></p>&mdash; asiram / unityゲーム開発 (@asiramasiram) <a href="https://twitter.com/asiramasiram/status/1437386221550850053?ref_src=twsrc%5Etfw">September 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# Simplygonとは
https://www.simplygon.com/
3Dモデルの最適化ツールです。
できることは多岐にわたるので、詳しくは公式サイトを要チェックです！

今回取り上げるメッシュの結合（重なったメッシュの削減）の他にも、見た目をなるべく損なわない形でポリゴン数を下げるリダクションなど、様々な機能があります。

Simplygonには無料プランが有り、2021/09時点では１日200処理まで無料との事です。

# 導入について
導入方法については、詳しく解説してくれている記事があるので、そちらをご参照ください。
[SIMPLYGON ( シンプリゴン ) を使ってリダクションをしてみる](https://qiita.com/Futo_Horio/items/d947e45e5c1525c9cddd)

:::note
自分がSimplygonを導入したときは、「SIMPLYGON_9_PATHが見つかりません」みたいなエラーが出ましたが、Windowsの再起動で直りました。
:::

# Simplygonでメッシュの結合をしてみる
## モデルの下準備
今回はこの複数のメッシュを一つのメッシュに結合してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/6f5e4352-d45e-c963-95ca-16c25a2e2d6b.png)

ばらばらにすると、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/ca67ca23-bb2e-bccc-2a8c-85ead7ba7c92.png)

それぞれのゲームオブジェクトには`Mesh Renderer`と`Mesh Filter`がアタッチされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e62a4a7c-dcf9-6c42-e942-a8cdead22f7a.png)

一つの親オブジェクトを作成して子供に結合させたいメッシュが配置されるような形にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/53a95d2a-bcc8-ec02-4453-1422cc561077.png)

## Simplygonの設定
次に、メッシュ結合をするためにSimplygonの設定を行いましょう。

**設定ウィンドウを表示する前に、メッシュ結合を行いたいオブジェクトをヒエラルキー上で選択しましょう。**
(ウィンドウ表示前というか、メッシュ結合の実行前にオブジェクトを選択しましょう)

次にUnityにて、Window → Simplygonで設定ウィンドウを表示します。
`Add LOD Component`ボタンを押して、Template → Basic → Aggregation を選択します。
`Aggregation`はメッシュ結合を行うための設定です。
（Simplygonは、基本的にここに設定を集めて、その分だけ処理が走るという仕組みのようです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/5b85b570-899d-a76a-26e1-5346b6bed08f.png)

下のような設定項目が出てくるので、チェックボックスをすべてオンにします（下記と同じ設定にします）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/d936c706-013d-e235-85b9-d85aaddf1f5e.png)

:::note
ちなみに、ここのチェックをいじると処理実行時の効果を変えられます。
たとえばMergeGeometriesをオフ、他の２つをオンにした状態で実行すると、重なった部分は削減されたバラバラのメッシュが出力されます。
:::

## メッシュ結合の実行
ここまで設定できたら、Simplygonのウィンドウ下にある大きなボタンを押してメッシュ結合を実行します。
（Simplygonの黄色いロゴが付いたボタン。自分はいつの間にかロゴが消えて灰色の大きいボタンになってしまいました...）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/5a951e04-7537-07f9-4738-97b7a29a917d.png)
少し待つとこんな感じになります。
一瞬びっくりしますが、メッシュの設定用オブジェクトが同じ座標に生成されただけです。
このオブジェクトは、プレハブとして出力されているのでヒエラルキーからは消してしまって問題ありません。

メッシュ結合した結果の出力物は、Projectの「Assets/LOD/オブジェクト名と同名フォルダ」に出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/203486ae-3a1e-334a-ad51-4b571e12ed79.png)
ここで大事な出力物は、

- 結合後のメッシュ
- USDアセットがアタッチされたプレハブ（後で触れます）

の２つです。
結合されたメッシュをインスペクターで見るとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/984f91f4-3d6e-5f75-bfc4-09acb3d4c8e1.png)

## 結合されたメッシュを見てみる
結合前のメッシュを見てみましょう。
**before**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/3cc07e95-a42f-0305-849e-4694141f1cb2.png)

**after**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e4f6e1dd-e067-746e-71d5-d14aabf0ddd9.png)
実にわかりにくいですが、メッシュが重なっていた部分が削られています。

効果をまとめてみました。


| 項目 | メッシュ結合前 | メッシュ結合後 |
| --- | :---: | :---: |
| 外見 | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/173ded7d-8fa9-502d-478d-680b8fb9b81c.png)  | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/2ba6f567-b30d-1ebd-a88f-22d228b3a95c.png) |
| ポリゴン数 | 30059（各メッシュの合計） | 22787 |
| 頂点数 |  14297（各メッシュの合計）| 10918 |

見た目はそのままで、いい感じにポリゴンと頂点が削減できていますね。

# 出力後メッシュの設定について
ここまででメッシュの結合はできました。
Unityでは、FBX形式のモデルを取り込むとメッシュなどのインポート設定が行なえます。

Simplygonで吐き出されたメッシュには同じインポート設定はありません。
が、吐き出されたUSDコンポーネント付きのプレハブから同じような設定が行えるようになっています。

最後に、結合後メッシュでライトマップを焼けるように、ライトマップ用UVを生成するオプションを紹介します。

## ライトマップ用UVの生成
生成されたプレハブをインスペクターで表示しましょう。
そして、`Advanced`タブをクリックします。
![スクリーンショット 2021-09-18 164459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/12ddf32a-9984-30c5-1134-2643bd431110.png)

少しスクロールすると、`Generate Lightmap UVs`という項目があるのでチェックします。
![スクリーンショット 2021-09-18 164747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/143269f0-0daa-d4cf-5207-39edac285ea5.png)

最後に、設定をメッシュに反映させるために、インスペクター上の「USD Asset」と書かれているロゴの右側の更新ボタン（ぐるぐるマーク）をクリックしましょう。
設定を反映していいか聞かれるので、OKをクリックです。

![スクリーンショット 2021-09-18 165446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/0b67058f-44b5-cb31-1a7b-90d627d320bb.png)
その後このように、メッシュをインスペクターで表示したときに、`UV2`の表示が増えていればOKです。

# まとめ
Simplygonを使用して、メッシュの結合を行ってみました。
いい感じに表に出ない余分なポリゴンを削ってくれた上で、メッシュを結合してくれました。

更にリダクションの設定を追加すれば、なるべく外観を保ったままポリゴン数を削減したりもしてくれます。
また、自分は試せていませんが、複数マテリアルのテクスチャを結合する事もできそうなので、試してみるといいかもです！