Unity3Dで画像が貼り付けられたオブジェクトを透明にする

#1.概要
Unityで3Dオブジェクトに画像を貼りつけたいと思うことは多々あると思う。
調べてみると下記のようなページが出てくる。
[【Unity】色や画像で見栄えを変えよう!materialの簡単な使い方!](https://www.sejuku.net/blog/52340)
Until/Textureのshaderを使用したmaterialを作成し、そこに画像をD&Dする。
このmaterialをオブジェクトにD&Dすることで3Dオブジェクトに画像を張り付けることができる。
しかしこのオブジェクトを透明化することはできない。

オブジェクトを透明化する方法を調べると下記のようなページが見つかる。
[【Unity C#】オブジェクトを徐々に透明にする](https://futabazemi.net/unity/alpha_change/)
これはshaderのColorの数値をスクリプトによって変化させ透明化させる。しかしUntil/TextureのshaderにはデフォルトではColorがないため透明化させることができない。

![qiita1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729518/ec524f66-0eaf-fbf4-674b-a21453914117.png)![qiita2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729518/84de6955-68ac-140e-38b3-1c5c44b32cad.png)

このことから画像を張り付けた3Dモデルを透明化させることはできない。
この課題を解決することができたので忘れないようにメモ書きをしておく。

#1.解決方法
結論からいうとshaderを自作する。
Projectタブで右クリック→Create→Shader→Unlit ShaderでShaderを新規作成

デフォルト

```php
﻿Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}
```
このデフォルトを改造していく
3行目Propertiesの_MainTex ("Texture", 2D) = "white" {}の下に
_Color("Color", Color) = (1, 1, 1, 1)

12行目
LOD100の下に
Blend SrcAlpha OneMinusSrcAlpha

38行目  float4 _MainTex_ST;の下に
fixed4 _Color;

52行目のfixed4 col = tex2D(_MainTex, i.uv)を
fixed4 col = tex2D(_MainTex, i.uv)* _Color;

改造後

```php
﻿﻿Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
          _Color("Color", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
    		Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv)* _Color;
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}
```
このshaderをオブジェクトのインスペクタの一番下にあるshaderにD&D
するとColorが増える
![qiita3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729518/a91cde6b-aedb-3778-0e35-64e6dfbf95e5.png)
このColorを変えることによって透明化が可能
![qiita4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729518/9c21cd13-15d2-4f49-8a08-80187ebb8cf9.png)

スクリプトで変えたい場合は
Gameobject.GetComponent<MeshRenderer>().material.color
などでgetcomponentして数値を変化させる。