// 魔法光球本体 Shader // 挂在小球 Sphere 上:自发光、脉动、边缘 Fresnel 光,模拟能量球 Shader "Custom/MagicOrb" { Properties { _OrbColor ("光球颜色", Color) = (1.0, 0.35, 0.1, 1.0) // 默认火球橙红 _CoreColor ("核心颜色", Color) = (1.0, 0.95, 0.7, 1.0) // 核心亮黄白 _PulseSpeed("脉动速度", Range(0.5, 5.0)) = 2.0 _RimPower ("边缘光强度", Range(0.5, 5.0)) = 2.0 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Geometry" } LOD 100 Cull Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 vertex : SV_POSITION; float3 worldNormal : TEXCOORD0; float3 worldViewDir : TEXCOORD1; }; float4 _OrbColor; float4 _CoreColor; float _PulseSpeed; float _RimPower; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.worldViewDir = normalize(WorldSpaceViewDir(v.vertex)); return o; } fixed4 frag (v2f i) : SV_Target { float3 n = normalize(i.worldNormal); float3 v = normalize(i.worldViewDir); float ndv = saturate(dot(n, v)); // 边缘光(Fresnel):球的轮廓一圈更亮 float rim = pow(1.0 - ndv, _RimPower); // 脉动:呼吸感 float pulse = 0.82 + 0.18 * sin(_Time.y * _PulseSpeed * 3.14159); // 核心(朝向镜头的部分)偏亮白 float3 col = lerp(_OrbColor.rgb, _CoreColor.rgb, ndv * 0.65); col += rim * _OrbColor.rgb * 1.5; col *= pulse; return float4(col, 1.0); } ENDCG } } }