Shader "Elfentier/ScreenTransition" { Properties { _Progress ("Progress", Range(0, 1)) = 0 _Color ("Color", Color) = (0, 0, 0, 1) // 0: Fade / 1: CircleWipe / 2: HorizontalWipe / 3: DiagonalBlinds _Mode ("Mode", Float) = 0 } SubShader { Tags { "Queue"="Overlay" "IgnoreProjector"="True" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _Progress; float4 _Color; float _Mode; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; v2f vert (appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { float alpha = 0; if (_Mode < 0.5) { // Fade alpha = _Progress; } else if (_Mode < 1.5) { // Circle wipe (中心から広がる円) float2 centered = i.uv - 0.5; centered.x *= _ScreenParams.x / _ScreenParams.y; float dist = length(centered); float radius = (1.0 - _Progress) * 0.9; alpha = smoothstep(radius, radius - 0.02, dist); } else if (_Mode < 2.5) { // Horizontal wipe (左から右へ) alpha = step(i.uv.x, _Progress) ; } else { // Diagonal blinds (斜めブラインド) float band = frac((i.uv.x + i.uv.y) * 5.0); alpha = step(band, _Progress); } return fixed4(_Color.rgb, alpha * _Color.a); } ENDCG } } }