Unity中LineRenderer与TrailRenderer有什么用

Unity中LineRenderer与TrailRenderer有什么用

这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

LineRender和TrailRender是两个好东西,很多Unity拖尾特效都会使用到它们。一些简单的介绍可以参见官方的API文档。
在这里探讨一下它们具体的渲染方式,而后给出一些Shader以便更好地控制它们。

最终我们可以实现类似这样的一个效果:

接下来,我们先了解LineRenderer。稍后的TailRenderer情况类似。

创建LineRender

LineRender是一个以顶点去控制渲染尺寸和位置的条带,顶点个数和具体坐标我们自己可以完全操控。
首先我们需要建立了一个GameObject,然后添加LineRenderer组件,然后填入一下参数:


其实就是一个沿着X方向延展的一组顶点。然后新建一个材质,并把它拖入Materials。
由于当前你使用的是默认材质,所以目前只能获得以下的样子:


就是一个矩形而已。

修改LineRenderer

首先,我们需要一张资源图片,大概是这样:


这个图片使用PSD制作一下,里面白色部分代表将来要在条带中显露出来的部分,黑色则是透明的部分。只有黑白两种颜色即可。注意要加入通道,即把这个黑白图片在PSD中新建一层透明通道,并且粘贴进去。最后让你的通道看起来是这样:

为什么只要黑白图,不需要颜色?解释一下:
我们用这个素材来构成条带的主要轮廓,而显示的色彩由其它参数控制,所以这里只需要黑白图就可以了。

开始写Shader

属性部分,就是一张贴图就可以了。

Properties{_MainTex("Base(RGB)",2D)="white"{}}

Tags部分,我们需要设定处于半透明渲染队列,并且设定Alpha混合的模式,就是用最常见的Alpha混合的模式即可。

Tags{"RenderType"="Transparent""IgnoreProjector"="True""Queue"="Transparent"}LOD200BlendSrcAlphaOneMinusSrcAlpha

由于我们不需要光照,也不希望受到光照的影响,所以我们写一个直接返回原色的光照方程来避免默认的光照处理。同时,为了避免产生光照部分的Pass,添加noforwardadd参数,这样我们的渲染就只需要一个Pass。

CGPROGRAM#pragmasurfacesurfNoLightvertex:vertalphanoforwardadd//光照方程,名字为Lighting接#pragmasuface后的光照方程名称//lightDir:顶点到光源的单位向量//viewDir:顶点到摄像机的单位向量//atten:关照的衰减系数float4LightingNoLight(SurfaceOutputs,float3lightDir,half3viewDir,halfatten){float4c;c.rgb=s.Albedo;c.a=s.Alpha;returnc;}

接下来是顶点着色器代码,我们只要将系统传递过来顶点颜色和UV坐标存储下来,以便于输入到表面着色器就可。

sampler2D_MainTex;fixed4_SelfCol;structInput{float2uv_MainTex;float4vertColor;};voidvert(inoutappdata_fullv,outInputo){o.vertColor=v.color;o.uv_MainTex=v.texcoord;}

最后就是最重要的部分,表面着色器代码:

voidsurf(InputIN,inoutSurfaceOutputo){half4c=tex2D(_MainTex,IN.uv_MainTex);o.Alpha=c.a*IN.vertColor.a;o.Albedo=IN.vertColor.rgb;}ENDCG

其实也很简单:
这里我们只是提取了贴图上的 【像素颜色透明度】 X 【顶点颜色透明度】 作为最终透明度。这样做的目的就是为了提取贴图上的轮廓,同时透明度也会受到顶点颜色的影响。
使用【顶点颜色】作为最终颜色。
这样我们就可以通过LineRenderer的StartColor和EndColor来设定整个条带的颜色和透明度了。

使用之前的贴图和这个Shader,修改之前的材质。最终这个条带变成这样:

完整的Shader

Shader"AndrewBox/LineRenderer"{Properties{_MainTex("Base(RGB)",2D)="white"{}}SubShader{Tags{"RenderType"="Transparent""IgnoreProjector"="True""Queue"="Transparent"}LOD200BlendSrcAlphaOneMinusSrcAlphaCGPROGRAM#pragmasurfacesurfNoLightvertex:vertalphanoforwardadd//光照方程,名字为Lighting接#pragmasuface后的光照方程名称//lightDir:顶点到光源的单位向量//viewDir:顶点到摄像机的单位向量//atten:关照的衰减系数float4LightingNoLight(SurfaceOutputs,float3lightDir,half3viewDir,halfatten){float4c;c.rgb=s.Albedo;c.a=s.Alpha;returnc;}sampler2D_MainTex;fixed4_SelfCol;structInput{float2uv_MainTex;float4vertColor;};voidvert(inoutappdata_fullv,outInputo){o.vertColor=v.color;o.uv_MainTex=v.texcoord;}voidsurf(InputIN,inoutSurfaceOutputo){half4c=tex2D(_MainTex,IN.uv_MainTex);o.Alpha=c.a*IN.vertColor.a;o.Albedo=IN.vertColor.rgb;}ENDCG}FallBack"Diffuse"}

TrailRenderer

TrailRenderer与LineRenderer很相似,又有些不同。不同之处在于:
首先,它的顶点构成是动态的,每帧你需要将产生TrailRenderer的GameObject移动到不同的位置,这样它会自动连接成一个轨迹。
其次,它由五个颜色值来进行控制整个条带的颜色变化,但是不像LineRenderer,在运行时你并不能修改这些颜色值,因为它的API中没有访问这五个颜色的方法,但是我们仍然可以通过Shader来进行改变。
记住最重要的一点就是,它和LineRenderer一样,都是把一组颜色值写入了顶点颜色,我们只要读取顶点颜色即可。
为了整体控制尾迹的颜色显示,我们增加一个主控制颜色,修改上面那个Shader。

Properties{_MainTex("Base(RGB)",2D)="white"{}_MainCol("SelfColorValue",Color)=(1,1,1,1)}

最后,在表面着色器中进行相应的修改

voidsurf(InputIN,inoutSurfaceOutputo){half4c=tex2D(_MainTex,IN.uv_MainTex);//c.a为贴图上的透明度,使用它构成条带的图形轮廓//_MainCol.a为主颜色的透明度,用于对整个条带透明度控制//IN.vertColor.a由顶点颜色获得,由Colors数组设置,用于控制条带不同位置的透明度度变化o.Alpha=c.a*_MainCol.a*IN.vertColor.a;//_MainCol.rgb为主颜色的颜色值,用于显示主颜色部分//IN.vertColor.rgb为顶点颜色的颜色值,由Colors数组设置,用于控制条带不同位置的颜色变化o.Albedo=_MainCol.rgb*IN.vertColor.rgb;}

这样,我们可以通过主控制颜色的变化来控制整体尾迹随着时间的颜色变化。而条带上颜色不同位置的变化,则由那五个颜色值进行控制。当我们只需要显示一个纯色条带时,将五个颜色都设置为白色和变化的透明度即可。
最后,TrailRender的显示效果如下:

当然你需要一个脚本来控制TrailRender所在的GameObject的旋转,代码相对简单。(BaseBehavior类的实现可以参见我的其它文章)

publicclassTrailRendererGen:BaseBehavior{[SerializeField][Tooltip("旋转角速度")]protectedfloatm_angle=360;protectedoverridevoidOnInitFirst(){}protectedoverridevoidOnInitSecond(){}protectedoverridevoidOnUpdate(){m_transform.Rotate(Vector3.forward,m_angle*Time.deltaTime);}}

关于“Unity中LineRenderer与TrailRenderer有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2022-01-05 23:10:53
收藏
分享
海报
0 条评论
45
上一篇:OSG中找到特定节点的方法是什么 下一篇:技工与普工的差距(普工是什么意思)
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码