|
总结一些在 unity 里比较常用的特效,并给出核心代码,不定时更新。总得来说都不复杂,适合新人学习。
一、死亡溶解特效
shader 属性为:
Properties
{
_MainTex ("Texture", 2D) = "white" {}//主纹理
_NoiseTex("Noise", 2D) = "white" {}//噪声纹理
_Threshold("Threshold", Range(0.0, 1.0)) = 0.5//消融阀值
_EdgeLength("Edge Length", Range(0.0, 0.2)) = 0.1//边缘宽度
_EdgeFirstColor("First Edge Color", Color) = (1,1,1,1)//边缘颜色值1
_EdgeSecondColor("Second Edge Color", Color) = (1,1,1,1)//边缘颜色值2
}Tags 为常规设置
Tags { "Queue"="Geometry" "RenderType"="Opaque" }//标签进入Pass
Cull Off //要渲染背面保证效果正确
核心代码:
struct a2v//顶点着色器输入结构体
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uvMainTex : TEXCOORD0;
float2 uvNoiseTex : TEXCOORD1;
};
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _NoiseTex;
float4 _NoiseTex_ST;
float _Threshold;
float _EdgeLength;
fixed4 _EdgeFirstColor;
fixed4 _EdgeSecondColor;
v2f vert (a2v v)//顶点着色器
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);//将顶点坐标变化到剪裁坐标系
o.uvMainTex = TRANSFORM_TEX(v.uv, _MainTex);//进行主纹理坐标变换
o.uvNoiseTex = TRANSFORM_TEX(v.uv, _NoiseTex);//进行噪声纹理坐标变换
return o;
}
fixed4 frag (v2f i) : SV_Target//片元着色器
{
fixed cutout = tex2D(_NoiseTex, i.uvNoiseTex).r;//获取灰度图的R通道
clip(cutout - _Threshold);//根据消融阀值裁剪片元
float degree = saturate((cutout - _Threshold) / _EdgeLength);//规范化
fixed4 edgeColor = lerp(_EdgeFirstColor, _EdgeSecondColor, degree);//对颜色值进行插值
fixed4 col = tex2D(_MainTex, i.uvMainTex);//对主纹理进行采样
fixed4 finalColor = lerp(edgeColor, col, degree);//对边缘颜色与片元颜色进行插值
return fixed4(finalColor.rgb, 1);
}
二、常用于新手引导界面里的:
这种效果看起来是在 image 里扣个洞,允许一部分区域能被点击到。这种其实有两种比较常见的方法。一是继承 Graphics 类,重写 OnPopulateMesh( ) 这个函数,自己组件 mesh 网格,但是我不太喜欢这种方法,麻烦不说,要是遇到圆形区域可点击怎么办?这里介绍第二种,直接用 shader 来实现。同时介绍下如何实现一个新人引导系统,这个很常用而且并不复杂。
首先来看矩形可点区域,这部分代码非常简单,就不给出具体的代码了,核心代码如下:
color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);其中 UnityGet2DClipping 函数位于 UnityUI.cginc 里,用之前记得 include 进来。在这个文件里对 UnityGet2DClipping 的定义如下:
inline float UnityGet2DClipping (in float2 position, in float4 clipRect)
{
float2 inside = step(clipRect.xy, position.xy) * step(position.xy, clipRect.zw);
return inside.x * inside.y;
}非常浅显易懂,即当输入点 position 在一个矩形框 Rect 内,返回 1,否则为 0。由于使用了透明效果,记得加上
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha我只需要在 C# 脚本里传入矩形坐标即可。
接下来来看圆形可点区域:
color.a *= (distance(IN.worldPosition.xy,_Center.xy) > _Radius);只需要设置好圆心 _Center 的坐标和 半径 _Radius 即可。
这里说下如何做一个常见的新手引导功能。先做好一个 UI 面板,背景为一个铺满全屏的 image, 透明黑色,使用上面所述的矩形可点 shader 或圆形可点 shader,再加一个手指的图片,如果有对话框的还要加上对话框UI,然后写一个控制器来控制它的创建、销毁和行为,就叫 TeacherMgr 吧。
然后在 excel 表里进行配置。给每个触发新手引导的地方编号,在 C# 脚本里对应的用个枚举值代替。
新手引导配置表里设置好如下基础数据配置:
手势位置(如果是滑动引导,则可能有两个位置)、可点击区域的大小、对话框位置、对话框里的内容。
然后在每个触发点调用新手引导功能方法
睡觉了,未完待续... |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|