スプライトの一部を光らせる

今どきのUnityは[URPやHDRPを使わなくてもShaderGraphが使えてしまう](https://youtu.be/Jv6GcNYYKeI?t=609)ので、この段階ですでに古いテクノロジーになってしまうのですが、一応自分の備忘録を兼ねて記事化しておきたいと思います。
ちなみにシェーダーグラフで行う場合は[こちらの動画](https://youtu.be/WiDVoj5VQ4c?t=631)がわかりやすいです。

![AnyConv.com__movie_001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/985babfd-b0e4-c0b0-d55a-0ddc59740744.gif)


１．スプライトに使用する画像と、光らせたい部分を赤く塗った画像を用意する
　光らせたい部分を赤く塗った画像は、RGBAのRとAの部分のみを使用します。
　下の例では、光らせない部分をわかりやすくするために黒く塗ってありますが、特になくても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/0f685d1c-828a-e09d-0d81-7d5cb92f341d.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/ff248586-8f87-44d2-87fc-b81f99cef85f.png)

２．画像をスプライト化しSpriteEditorを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/0c999a26-64bf-f058-2c7b-2887fa277713.png)

３．Secondary Texturesを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e33bc58f-3758-ecde-132d-4858fb364711.png)
　Nameに **_EmitTex** と入力し、先ほどの光らせたい部分を赤く塗ったテクスチャを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/46f7b02e-ad3a-a02b-f5b8-2c4e9271e945.png)

４．シェーダーを作成する

　ビルトインのスプライトシェーダーにちょい足しした下記のシェーダーを用意します。
　先ほど指定した **_EmitTex** という名前はこのシェーダーの中で使用します。

```SpritesEx.shader
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)

Shader "Sprites/DefaultEx"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        [PerRendererData] _EmitTex("Emit Texture", 2D) = "black" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [HDR] _EmitColor("Emit Color", Color) = (1,1,1,1)
        [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
        [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
        [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
        [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
        [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
    }

    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Cull Off
        Lighting Off
        ZWrite Off
        Blend One OneMinusSrcAlpha

        Pass
        {
        CGPROGRAM
            #pragma vertex SpriteVertEx
            #pragma fragment SpriteFragEx
            #pragma target 2.0
            #pragma multi_compile_instancing
            #pragma multi_compile_local _ PIXELSNAP_ON
            #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
            #include "UnitySprites.cginc"

sampler2D _EmitTex;
fixed4 _EmitColor;

v2f SpriteVertEx(appdata_t IN)
{
    v2f OUT;

    UNITY_SETUP_INSTANCE_ID(IN);
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);

    OUT.vertex = UnityFlipSprite(IN.vertex, _Flip);
    OUT.vertex = UnityObjectToClipPos(OUT.vertex);
    OUT.texcoord = IN.texcoord;
    OUT.color = IN.color * _RendererColor;

    #ifdef PIXELSNAP_ON
    OUT.vertex = UnityPixelSnap(OUT.vertex);
    #endif

    return OUT;
}

fixed4 SpriteFragEx(v2f IN) : SV_Target
{
    float2 uv = IN.texcoord;
    fixed4 texCol = tex2D(_MainTex, uv);
    clip(texCol.a-0.001);
    fixed4 emCol = tex2D(_EmitTex, uv);
    fixed4 color = (emCol.r * emCol.a > 0) ? _EmitColor * (emCol.r) : texCol * _Color;

    #if ETC1_EXTERNAL_ALPHA
    fixed4 alpha = tex2D(_AlphaTex, uv);
    color.a = lerp(color.a, alpha.r, _EnableExternalAlpha);
    #endif

    return color;
}

        ENDCG
        }

        }
}
```

５．マテリアルを作成
　作成したシェーダーを使用してマテリアルを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4eb86949-5c10-4901-94cd-c28e36164e70.png)

６．Post Processingで光らせる
　[こちら](https://qiita.com/ELIXIR/items/ff4d9a52eae201db9ba6)を参考に光らせます

７．（おまけ）アニメーションを付ける
　[こちら](https://qiita.com/ELIXIR/items/150374b29e249d8dca27)を参考にアニメーションを付けることができます。

![AnyConv.com__movie_001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/985babfd-b0e4-c0b0-d55a-0ddc59740744.gif)