[Unity] GooglePolyを使ってローポリ3Dオブジェクトを検索/配置する

# 開発環境
* Unity2018.2.11f1
* Poly Toolkit 1.1

# 概要
[unityroom](https://unityroom.com/) で開催されたオンラインゲームジャムイベント [Unity1週間ゲームジャム](https://unityroom.com/unity1weeks) お題「あつい」にて、自分は「牛がステーキを程々の焼き加減で焼く」ゲームを作りました。 [こちら](https://unityroom.com/games/steak_house_volcano) からプレイできます。

![steak5.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/2a31b402-f21a-195f-2ab4-49660efaf5d3.gif)

背景の火山のモデルや牛のモデルに関して、Polyというサービスを利用しました。
今回はその使い方について記載します。

# Polyとは
<img width="1439" alt="poly1.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/440ea1ba-b890-c419-af44-17af0f5b5736.png">

[Poly](https://poly.google.com/) は2017年にGoogleが公開開始した3Dオブジェクトのライブラリです。
試しに [French fries](https://poly.google.com/view/4hpYt9IW-1k) のオブジェクトを見てみましょう。

![poly1.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/74a6732e-c56f-fd35-84f2-fdcdc149121e.gif)

このページからはオブジェクトのダウンロードを行うことが出来ます。
(このオブジェクトに関しては `obj` 形式か `glTF` 形式を選択することが出来ます)

<img width="729" alt="poly2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/de7a939d-032e-93f0-35fe-b93f3d20b80a.png">

権利表記に注目すると `CC-BY 3.0` で提供されていることが確認できます。
このモデルは制作者のクレジット（氏名、作品タイトルなど）を表示することを条件に自由に使用できます。

# UnityでPolyのオブジェクトを扱う
では Poly のオブジェクトを Unity で呼び出してみましょう。
先ほどの詳細ページの動線からは `OBJ` 形式か `glTF` 形式でダウンロードすることが出来ました。
しかし `obj` 形式は同梱の `mtl` ファイルをUnity標準で解釈することが出来ないためマテリアルを付与出来ません。
また `glTF` 形式に関しても [インポート用のアセット](https://assetstore.unity.com/packages/tools/input-management/sketchfab-for-unity-14302) を使用する必要があります。

今回はもっと簡単/直感的にインポートを行うため「Poly Toolkit」というアセットを使用します。

# Poly Toolkitを使用する
<img width="1148" alt="poly3.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/c32cfd92-3d76-1fda-7029-7f814fdcc24d.png">

[Poly Toolkit](https://assetstore.unity.com/packages/templates/systems/poly-toolkit-104464) はモデルの検索 / `glTF`形式のモデルのインポーターがセットになったアセットです。

## 導入
(公式のドキュメントはこちら)
https://developers.google.com/poly/develop/unity

AssetStoreにてDL/インポート直後に以下の例外が出ます。

![poly4.png](https://qiita-image-store.s3.amazonaws.com/0/102664/0a1335c4-6939-8a63-9391-ed225468bc1c.png)

これは `ImportGltf.cs` にて `unsafe` コードが含まれているためです。
Unityでは初期設定では `unsafe` の使用は認められていないため、 `PlayerSettings` にて設定を変更します。
以下の項目にチェックを付けることで、コンパイルが走り、例外が消えます。

![poly5.png](https://qiita-image-store.s3.amazonaws.com/0/102664/0c23ce29-b56c-bc61-fece-72cd24cfb12f.png)

## モデルの検索
上部メニューより `Poly > Browse Asstes...` を選択します。 
`Search ... ` よりモデルを検索します。

![poly2.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/e31e48ab-05d4-39c0-36f1-14664cc6935e.gif)

## モデルのインポート
モデルを選択すると詳細画面が表示されます。

<img width="474" alt="poly6.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/471e20f7-b1d8-4f09-bb62-e8b8f1ea0693.png">

`Recenter` が有効の場合、ピボットはオブジェクトの重心に設定されます。
無効の場合は元のファイルにて指定してあるピボットが利用されます。
ファイル側に意味のあるピボットが設定されていない限り、有効で問題ありません。

`Also Instantiate` は生成したオブジェクトのPrefabをSceneにも配置するかどうのか設定です。
(無効にした場合でも自分でScene上に配置すれば何も問題はありません)

`Rescale Mode` はオブジェクトのScaleを決定する方法です。
`CONVERT` は Poly Toolkit の設定に基づいて、大きさを指定します。
(Poly Toolkit の設定は `PolyToolkit/Resources/PtSettings` という ScriptableObject を参照)
ここで指定した単位 × `Scale factor` で指定した数値によって大きさが決定します。

![poly7.png](https://qiita-image-store.s3.amazonaws.com/0/102664/9b9fcad2-7db8-fd4b-a488-3a9c7ce55af9.png)

`FIX` は Unity の Scene の Scale に合わせた大きさとなります。
例えば `Desired size` に 10 を指定した場合 `x:10` / `y:10` / `z:10` のキューブに収まる大きさとなります。
(個人的には `FIX` の方が扱いやすく感じます)

![poly3.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/f6b175a8-6f74-479d-1e62-0da31a79d083.gif)

設定したら `Import into Project` を選択してインポートします。
(設定項目を調整したくなった場合、項目を変更して再度 `Import into Project` すると `Prefabが` 上書きされます)
こうして任意のオブジェクトをインポートし、Sceneに配置することができました。

![poly8.png](https://qiita-image-store.s3.amazonaws.com/0/102664/362796aa-8978-d309-0bdc-23c64d5e8705.png)

## WebGLのビルド
今回はWebGLでビルドしてみます。

![poly9.png](https://qiita-image-store.s3.amazonaws.com/0/102664/910f192b-ff9c-d05f-dae4-43b73248680e.png)

https://developers.google.com/poly/develop/unity#mobile_build_issues
に記載してある通り `.NET 2.0 Subset` を使用すると実行時に例外が走る可能性があります。
`Scripting Runtime Version` を `.NET 4.X` に引き上げるか
`API Compability Level` を `.NET 2.0` に設定します。
OKを押すとビルドが続行します。

![poly10.png](https://qiita-image-store.s3.amazonaws.com/0/102664/e60c2d5c-3e8c-b285-991b-f6ad2831d4ae.png)

ビルド中に例外が発生しました。
`Newtonsoft` のnamespaceが見つからないとのこと。
(`Newtonsoft.Json` は PloyToolkit に含まれるサードパーティのライブラリ)
`Newtonsoft.Json` 自体は存在するはずなので `dll` の設定を確認します。
すると `WebGL` のチェックが外れているので、チェックを入れます。

![poly11.png](https://qiita-image-store.s3.amazonaws.com/0/102664/c7e213f2-c184-4b68-df16-ea4850060975.png)

これによりビルドが通り、WebGLのプレイヤーが再生されることが確認できました。

<img width="877" alt="poly12.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/5bb82baa-fdae-ef37-65e6-701e55074ff3.png">

# まとめ
* 著作権表記(制作者/URL)を行う
* 適切なScaleを選択する
* ビルド時の設定を確認する

上記3点に気を付ければ、無料でローポリ3Dモデルを使えます。
アイデアのベースにしたり、装飾を増やしたりする目的で試してみるのはいかがでしょうか。

===

木のモデルは以下をお借りしました
「Pine Tree」
https://poly.google.com/view/2Qo-fmVKuSG
created by Danny Bittman