Unity3D中人物角色被攻击变色,死亡渐隐消失,墙后显示的Shader

本文介绍如何在Unity中使用Shader实现半透明效果。通过调整Alpha值和颜色值,可以实现在游戏角色受到攻击时颜色变化,以及角色死亡时渐隐消失的效果。此外,还提供了一种针对移动端优化的Shader解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段代码是在Unity蛮牛给人解答的时候写的,第一次写Shader,Unity官方的语法还没来得及完全过一遍,比较仓促,还好效果实现了!

笔记:Alpha Blending则是一种中庸的方式,它使用当前fragment的alpha作为混合因子,来混合之前写入到缓存中颜色值。但Alpha Blending麻烦的一点就是它需要关闭ZWrite,并且要十分小心物体的渲染顺序。如果不关闭ZWrite,那么在进行深度检测的时候,它背后的物体本来是可以透过它被我们看到的,但由于深度检测时大于它的深度就被剔除了,从而我们就看不到它后面的物体了。因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite。


Shader "Custom/Test" {
Properties {
        _Color ("Main Color", Color) = (1,1,1,1)
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    _Alpha("Alpha", Range (0.01,1.0)) = 0.5
}
SubShader {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    LOD 200
     Pass {
    ZWrite Off
    ColorMask 0
}

    CGPROGRAM
    #pragma surface surf Lambert alpha

    sampler2D _MainTex;
    float _Alpha;
    fixed4 _Color;

    struct Input {
        float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutput o) {
        half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
        o.Emission = c.rgb;
        o.Alpha = _Alpha;
    }
    ENDCG
} 
FallBack "Diffuse"}

将上面的这段Shader放到Unity3D中,放到模型上。就可以自己调试Alpha值和模型的颜色了,只要在角色被攻击的时候改下颜色值,然后攻击完改回来就可以了,角色死亡的时候调整Alpha值减少,就可以看起来是渐隐消失的效果了!

由于透明度在不同的移动端优化和ColorMask这玩意在移动端消耗比较大,所以有了下面的这个shader:

Shader "Transparent/DiffuseS" {
            Properties {
            _Color ("Main Color", Color) = (1,1,1,1)
            _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
            }

            SubShader {
                Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
                LOD 200

                CGPROGRAM
                #pragma surface surf Lambert alpha

                sampler2D _MainTex;
                fixed4 _Color;

                struct Input {
                float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
        o.Emission = c.rgb;
        o.Alpha = c.a;
        }
    ENDCG
    }

    Fallback "Transparent/VertexLit"}

这个shader可以在移动端使用没有问题,修改的时候只要修改_Color属性和颜色值即可!
### 人物皮肤动态变色Unity Shader 实现 在 Unity 中,实现人物皮肤动态变色可以通过编写自定义 Shader 来完成。以下是一个基本的实现思路和代码示例。 #### 1. 基本原理 动态变色的核心是通过修改材质的颜色属性来实现视觉上的变化。这可以通过两种方式完成: - **使用颜色插值**:将法线数据映射到颜色范围,调整颜色的 RGB 值[^3]。 - **使用纹理混合**:通过结合基础颜色和渐变纹理,创建更复杂的变色效果。 #### 2. 示例代码 以下是一个简单的 Shader 示例,展示如何通过修改颜色属性实现动态变色: ```csharp Shader "Custom/SkinColorChanger" { Properties { _MainTex ("Texture", 2D) = "white" {} _BaseColor ("Base Color", Color) = (1,1,1,1) _TintColor ("Tint Color", Color) = (1,0,0,1) _TintStrength ("Tint Strength", Range(0,1)) = 0.5 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _BaseColor; float4 _TintColor; float _TintStrength; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _BaseColor; col.rgb = lerp(col.rgb, col.rgb * _TintColor.rgb, _TintStrength); return col; } ENDCG } } FallBack "Diffuse" } ``` #### 3. 代码解析 - `_BaseColor` 是基础颜色,用于设置默认的皮肤颜色。 - `_TintColor` 是变色颜色,用于控制皮肤变色的效果。 - `_TintStrength` 是变色强度,取值范围为 [0, 1],用于调节变色的程度。 - `lerp` 函数用于在基础颜色变色之间进行插值,从而实现平滑过渡[^1]。 #### 4. 使用方法 1. 将上述 Shader 添加到 Unity 项目中。 2. 创建一个材质球并应用该 Shader。 3. 在材质面板中调整 `_BaseColor`、`_TintColor` 和 `_TintStrength` 参数,观察皮肤颜色的变化。 #### 5. 注意事项 - 如果需要更复杂的效果(如基于光照或时间的动态变色),可以引入更多的输入变量(如时间变量 ` UNITY_TIME` 或光照方向)[^2]。 - 确保模型的 UV 贴图正确无误,否则可能会导致颜色显示异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值