Unity 2Dゲームにおけるテクスチャの設定

<img width="404" alt="スクリーンショット 2018-10-27 14.58.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/256717/a9cbeb87-8b91-583b-e393-25316b9363e1.png">

スマホゲーなど2Dゲームの場合に、どのような設定が最適か？
学んだことを下記にまとめます。

---

##TextureType

Texture Typeは、このテクスチャが何に使用されるのかで選択します。テクスチャインポーターの他のプロパティーは、この選択によって変化します。

Texture TypeをAdvance にすると、全部設定できるオプションが表示されます。Advance以外のTypeだと、そのTypeに最も関連する設定しか表示されません。

##GenerateMipMaps

[Generate Mip Maps](https://docs.unity3d.com/jp/540/Manual/class-TextureImporter.html)とは？
Unityスクリプトリファレンスによれば、
>有効の場合、色が下位のミップレベルの端ににじみ出ることがなくなります。ライト cookie に使用します 

...簡単に説明すると、カメラとの距離が離れて小さく描画する必要がある際に、ミップマップの中から適切なサイズのテクスチャを選んで描画する、といったもののようです。リストを保持しておくために**メモリ使用量は増えます**が、描画の際に小さなサイズを描画させることが出来るので**パフォーマンスが良くなる**ということ。

３Dゲームでは役立つでしょうが、2Dゲームではこの設定はオフにしましょう。ちなみに、Unity5.3.8ではデフォルトで設定がオンです。確認しましょう。

##Aniso Level
引用：[Unityスクリプトリファレンス](https://docs.unity3d.com/jp/540/Manual/class-TextureImporter.html)
>急な角度から眺めたときのテクスチャ品質を向上させます。床や地面のテクスチャに適しています。

2Dゲームの場合、カメラに対して平行にしか配置しない筈なので、これも最低設定の0でいいでしょう。

##フォーマットについて
<img width="265" alt="スクリーンショット 2018-10-27 15.23.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/256717/2853fa11-386a-97de-b9b5-2f7a920fffc9.png">

2Dゲームに使われる素材の中にTextureが占める割合は多いことでしょう。そしてメモリーサイズもそれに比例してるので、ゲーム開発には Texture Format は重要なポイントの一つと考えられます。画面に映るものの画質とメモリサイズとパーフォマンス、この3つのバランスが得られるために適切な Texture Format を選ばないといけません。

基本的には**Compressed**, **16 Bits**, **True Color**　の3種類に分けられます。

###Compressedフォーマット
Compressed Texture Formats はPlatformやハードウェアーによって異なります。画像フォーマット(JPG, PNGなど)と違って （lossy又はlossless）、ファイルサイズを小さくするため、ここの圧縮フォーマットは必ず lossyで、メモリ上でのサイズを圧縮するフォーマットです。

<ul>
<li>ETC (Ericsson Texture Compression) <br>
全てのAndroid機種が対応できるフォーマット。</li>
<li>PVRTC (PowerVR texture compression) <br>
iOS全機種が対応できるフォーマットです。Android機種の場合はPowerVR GPUを使ってる機種しかこのフォーマット使えません (Nexus S, Kindle fireなど)。</li>
<li>ATC (ATI texture compression)<br>
Qualcomm Adreno GPUを使ってるAndroid機種しかこのフォーマット使えません </li>

<li>DXTC (S3TC, S3 Texture Compression)<br>
PCはサポートしますが、モバイルだとNvidia Tegra のGPUしかサポートしません</li>
</ul>

→スマホゲーはアイフォン、アンドロイド両方向けで製作することが多いことから、採用はしづらいでしょう？


###16 Bitsフォーマット
このモードではピクセルの色が 16-bit の color spaceにmappingされます。Alphaがついてる場合 (RGBA)、それぞれのチャネルが 4-bit (RGBA4444 = 16-bits)になりますが、Alphaなしだと、RとBチャネルが5-bits、Gチャネルが 6-bits (RGB565 = 16-bits) になります。

→透明な画像を使わない場合、RGB使えばいいってことですね!?

16-Bitsモードは色数がかなり減るので、単色塗りつぶし系の画像に適していますが、グラデーションなど色が滑らかに変わる画像では **color banding**という現象が発生します。色が滑らかに変わるような画像で使う場合、事前に**ディザリング（誤差拡散）**を使って色数を落としてからUnityにインポートすることでだいぶ実用的になります。

→画像が荒くなっても誤差拡散使えば大丈夫！？

フルカラー画像(32bit RGBA8888)と、Unityと同じ方法で16bitカラーに変換した画像(16bit RGBA4444)を横並びにすると明確ですね。
<img src="https://qiita-image-store.s3.amazonaws.com/0/256717/2a3c4029-4775-accb-c1af-6498ae907f4d.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/256717/d247ee4a-08ef-00c7-3d15-fba7f8c9fa65.png">

誤差拡散を使った16bitカラー画像(16bit RGBA4444)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/256717/12ccb965-bddc-2db9-5e05-5c35103151cd.png)


###True Colorフォーマット
True Color Mode はもとの画像の画質はそのままで texture をインポートします。このModeは画質は一番良いが、**Memoryサイズは他のtexture formatより一番でかいです。 **

##参考

・　[Unityで、もっとキレイな16bitカラーテクスチャを使おう！](https://www.webtech.co.jp/blog/game-develop/unity/2562/)
・ [【Unity】Texture Format](https://techblog.kayac.com/unity_advent_calendar_2016_10)