본문 바로가기
개발/Unity) Shader

Unity Shader) 2D 이미지를 역동적으로 표현하기( Hovering / Pulsing)

by 테샤르 2025. 5. 12.

2D 이미지를 역동적으로 표현하기( Hovering / Pulsing)

 

 

호버링(부유) 효과와 펄싱(크기 변화)의 효과를 적절히 결합해서 

정적인 이미지를 약간의 역동적인 느낌을 추가하는 형식의 셰이더 코드이다.

 

반응형
반응형

 

호버링은 특정 축을 기준으로 이동을 하고 펄싱은 버텍스 스케일을 조절해서 약간의 움직임을 줄수 있다.

 

 

< Material 속성 >


< Shader Code >

Shader "Custom/PulsingAndHovering"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _PulseSpeed ("Pulse Speed", Float) = 2.0
        _PulseAmountX ("Pulse Amount X", Float) = 0.05
        _PulseAmountY ("Pulse Amount Y", Float) = 0.05
        _Pivot ("Pulse Center (Pivot UV)", Vector) = (0.5, 0.5, 0, 0)
        _YOffset ("Y Position Offset", Float) = 0.0
        _TimeOffset ("Time Offset", Float) = 0.0
        _HoverSpeed ("Hover Speed", Float) = 1.5
        _HoverAmount ("Hover Amount", Float) = 0.03
    }

    SubShader
    {
        Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
        LOD 100

        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        Cull Off

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            sampler2D _MainTex;
            float4 _MainTex_ST;

            float _PulseSpeed;
            float _PulseAmountX;
            float _PulseAmountY;
            float4 _Pivot;
            float _YOffset;
            float _TimeOffset;

            float _HoverSpeed;
            float _HoverAmount;

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert(appdata v)
            {
                v2f o;

                float time = _Time.y + _TimeOffset;

                // Pulsing scale
                float scaleX = 1.0 + sin(time * _PulseSpeed) * _PulseAmountX;
                float scaleY = 1.0 + sin(time * _PulseSpeed) * _PulseAmountY;

                // Hovering offset
                float hoverOffset = sin(time * _HoverSpeed) * _HoverAmount;

                float3 pos = v.vertex.xyz;

                // Pivot scaling
                pos.x -= _Pivot.x;
                pos.y -= _Pivot.y;
                pos.x *= scaleX;
                pos.y *= scaleY;
                pos.x += _Pivot.x;
                pos.y += _Pivot.y + _YOffset + hoverOffset;

                o.vertex = UnityObjectToClipPos(float4(pos, 1.0));

                o.uv = v.uv * _MainTex_ST.xy + _MainTex_ST.zw;
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }
            ENDCG
        }
    }
}

 

 

★★★☆☆

 

반응형

댓글