Unity-Shader - 2D Sprite 影子

本文介绍如何在Unity中使用Shader实现2D Sprite的影子效果,包括创建Shader、调整材质和使用C#脚本传递纹理数据的具体步骤。

前言

今天我们来实现一个比较简单实用的shader特效 - 2D Sprite影子效果

最终效果:

准备工作:

打开unity新建一个2D场景,导入一张2D人物图片和一张透明的图片(用来接收影子),修改图片Texture Type为 Sprite 类型,
拖入2D人物精灵图到场景,然后拖拽透明图到人物精灵图节点下,命名为shadow,用来接收影子 然后新建一个材质球,拖拽到 shadow 节点上,shader选择我们将要新建的shadow.shader。
场景如下:

实现思路:

其实很简单,就是把人物的纹理传递给shadow shader, 把alpha值大于0的像素的rgb变为黑色即可。
Shader:
    
    
// ---------------------------【2D Sprite 影子】--------------------------- Shader "lcl/shader2D/playerShadow" { // ---------------------------【子着色器】--------------------------- SubShader { // No culling or depth Cull Off ZWrite Off ZTest Always // 开启透明度 Blend SrcAlpha OneMinusSrcAlpha // 设置渲染队列 Tags { "Queue" = "Transparent" "RenderType" = "Opaque" } // ---------------------------【通道一】--------------------------- 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 ; } ; // 顶点着色获取 v2f vert ( appdata v ) { v2f o ; o . vertex = UnityObjectToClipPos ( v . vertex ) ; o . uv = v . uv ; o . uv . y = 1 - o . uv . y ; return o ; } //通过c#获取到人物纹理传递过来 sampler2D _PlayerTex ; // 片元着色获取 fixed4 frag ( v2f i ) : SV_Target { // 采样传过来的纹理 fixed4 col = tex2D ( _PlayerTex , i . uv ) ; // 这里用step代替if // 当 透明度值大于1时, 就呈现黑色(即影子) col . rgb = 1 - step ( 0 , col . a ) ; return col ; } ENDCG } } }
C#:
    
    
using UnityEngine ; public class playerShadow : MonoBehaviour { public GameObject shadow ; void Start ( ) { if ( ! shadow ) { return ; } // 获取纹理并传递到shader var shadowMat = shadow . GetComponent < SpriteRenderer > ( ) . material ; var playerTex = GetComponent < SpriteRenderer > ( ) . sprite . texture ; shadowMat . SetTexture ( "_PlayerTex" , playerTex ) ; } }
最后把c#脚本拖拽到人物节点上,把shadow拖拽到shadow变量上,点击运行即可
最终效果:

最后

最后欢迎来我的 GitHub Star,谢谢! 里面有我平时学习unity shader过程中实现的一些特效demo。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值