Unity 2018バージョンでテクスチャが導くアプリの強制終了

今回の主な話題：Unity 2018バージョンでテクスチャが導くアプリの強制終了、ゲーム実行中にMipmapを開くとアセットへの影響、UIでアニメーション効果を遷移する方法、サウンドの再生に多くのMonoメモリが消費されます。

---
###アセット管理
Q1: Unity 2018.1.4f1でTerrainを使って地形を作りましたが、テクスチャを使用している限り、一枚しかない場合でも、Huawei P9で実行するとCrashされます。Terrainにテクスチャを削除したらCrashしなくなりました。原因はわかりません。地形テクスチャのサイズは512x 512です。

設置は以下となります。
![1 .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4fc848f6-ff42-a278-f373-88330b49cb98.png)
以下は私のAndroidStudioクラッシュスタックです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/0698b9ad-e505-e4b6-e23b-dc33d00a079c.png)
>テストしたところ、確かにcrashが発生しました。TerrainとTexture設置を確認しても、何か特別な状況はありません。しかし、圧縮フォーマットをASTCからETC2に変更しようとすると、次の図に示すように、crashはもう発生しなくなりました。したがって、ASTCテクスチャをロードした後の解凍過程に問題があると判断します。問題主にETC2形式で圧縮することをお勧めします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/a08cb458-665d-92ff-5b42-7b5b5ac39bd3.png)

---
###アセット管理
Q2:UWA公式サイトのDemoから、プロジェクト「キワメ」はMipmapを使っていないことがわかりました。実行中にMipmapをオンにするかどうかが何か影響ありませんか？
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/95504b28-9bab-9135-4f19-498eecfd56c1.png)

①
>Lightmapテクスチャの機能は他のカラーテクスチャと同じで、サンプリングされた情報はライトとシャドウとしてシェーダーで計算されるため、Mipmapをオンにするかどうかは他のテクスチャと同じように処理できます。たとえば、2.5D視点で、視野範囲が比較的近いゲームでは、メモリ占用を減少するためにMipmapを使わなくても大丈夫ですが、視野範囲の遠い状況では、Mipmapを使わないとフラッシュ現象があり、GPUサンプリングのコストも比較的に多くなります。
ですから、オンにするかどうかは、問題主のゲームタイプ次第で決めます。テクスチャとMipmapの役割を理解していれば、問題主は具体的な情報に基づいて自分で決定できます。

②
>Mipmapに関しては、Lightmapは他のテクスチャマップと同じです。Mipmapをオンにすると、メモリが3分の1増加しますが、ビデオメモリの帯域幅を減少できます。
一般的に、Lightmapを使うのはシーンオブジェクト、基本的にはMipmapをオンにすることをお勧めします。90度（に近い）の俯角であれば、Mipmapを開く必要はありません。

---
###制作
Q3: ある一枚の黒い画像を他の画像の図案によって、この部分の透明を切り抜く方法はありませんか？つまり、この黒い背景にこの丸い部分を切り抜いて、空き部分は透明であり、丸の移動によってこの部分も移動します。これはどうやって実現できますか？
>逆にMask、二つ方法あります。

>一、Shaderを変更し、UI-Default.shaderをコピーして、次のコード:

>```ruby:
Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }
```

>を次のように

>```ruby:
Stencil
        {
            Ref [_Stencil]
            Comp NotEqual
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }
```
変更して背景のShaderを取り替えます。

>二、Imageから類別を派生させ、GetModifiedMaterialその方法をOverrideします。CompareFunction.NotEqualをCompareFunction.NotEqualに変更します。

---
###制作
Q4: UIを切り替える時に、画面全体がゆっくりと黒く（周辺から中央に）併呑され、そしてゆっくりと透明になって、切り替えられたUIを顕示するようにしたいですか、どうやって実現できますか？
>UIで実現：黒い画像を描きます中央から周辺までalphaは徐々に増加し、9つの正方形のSpriteを作成します。移動する時に、UIの最上層に画面サイズを超える画像を追加してサイズを徐々に小さくします。最初は透明部分が画面全体を覆い、最後は黒い部分が画面全体を覆います。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e74f2e8d-ddd7-5efa-9a25-44b7dd44a790.png)
>もちろん、皆さんはShaderでこの効果を実現することにお気に入りようです。実現も非常に簡単です。簡単に言うと、一つの丸を掘ることであります。UVと（0.5,0.5）の間の距離を計算します。この距離がRより大きい場合は黒、それ以外の場合はtex2dがサンプリングした色を返します。Rはパラメータとして渡さればいいです（さらに、エッジ遷移を追加することも難しくない）。ただし、そうせれば結果は楕円であり、円が必要な場合は、テクセルサイズを計算し、それに_MainTex_TexelSizeを掛ける必要があります。

---
###Monoメモリ
Q5: UWAプラグインを使って、サウンドの再生がMonoメモリはいっぱい消費していることは観察されたが、どうすればよいですか？
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7afd6b67-05ef-a9a6-d8ab-566fc93a77dd.jpeg)
>スタックから見ると、Audio Play時にたくさんのLogが作成され、Monoメモリの割り当てを増加しました。ErrorまたはWarning Logがあるかどうかを確認することを問題主にお勧めします。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com