LoginSignup
10
5

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-30

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

AnyConv.com__movie_001.gif

1.スプライトに使用する画像と、光らせたい部分を赤く塗った画像を用意する
 光らせたい部分を赤く塗った画像は、RGBAのRとAの部分のみを使用します。
 下の例では、光らせない部分をわかりやすくするために黒く塗ってありますが、特になくても大丈夫です。
image.pngimage.png

2.画像をスプライト化しSpriteEditorを開く
image.png

3.Secondary Texturesを選択
image.png
 Nameに _EmitTex と入力し、先ほどの光らせたい部分を赤く塗ったテクスチャを選択します。
image.png

4.シェーダーを作成する

 ビルトインのスプライトシェーダーにちょい足しした下記のシェーダーを用意します。
 先ほど指定した _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
        }

        }
}

5.マテリアルを作成
 作成したシェーダーを使用してマテリアルを作成します
image.png

6.Post Processingで光らせる
 こちらを参考に光らせます

7.(おまけ)アニメーションを付ける
 こちらを参考にアニメーションを付けることができます。

AnyConv.com__movie_001.gif

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5