千家信息网

Unity中LineRenderer与TrailRenderer有什么用

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。LineRende
千家信息网最后更新 2025年02月23日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"}        LOD 200        Blend SrcAlpha OneMinusSrcAlpha

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

CGPROGRAM        #pragma surface surf NoLight vertex:vert alpha noforwardadd        //光照方程,名字为Lighting接#pragma suface后的光照方程名称         //lightDir :顶点到光源的单位向量        //viewDir  :顶点到摄像机的单位向量           //atten    :关照的衰减系数         float4 LightingNoLight(SurfaceOutput s, float3 lightDir,half3 viewDir, half atten)         {             float4 c ;             c.rgb =  s.Albedo;            c.a = s.Alpha;             return c;         }

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

        sampler2D _MainTex;        fixed4 _SelfCol;        struct Input         {            float2 uv_MainTex;            float4 vertColor;        };        void vert(inout appdata_full v, out Input o)        {            o.vertColor = v.color;            o.uv_MainTex = v.texcoord;        }

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

        void surf (Input IN, inout SurfaceOutput o)         {            half4 c = 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"}        LOD 200        Blend SrcAlpha OneMinusSrcAlpha        CGPROGRAM        #pragma surface surf NoLight vertex:vert alpha noforwardadd        //光照方程,名字为Lighting接#pragma suface后的光照方程名称         //lightDir :顶点到光源的单位向量        //viewDir  :顶点到摄像机的单位向量           //atten    :关照的衰减系数         float4 LightingNoLight(SurfaceOutput s, float3 lightDir,half3 viewDir, half atten)         {             float4 c ;             c.rgb =  s.Albedo;            c.a = s.Alpha;             return c;         }        sampler2D _MainTex;        fixed4 _SelfCol;        struct Input         {            float2 uv_MainTex;            float4 vertColor;        };        void vert(inout appdata_full v, out Input o)        {            o.vertColor = v.color;            o.uv_MainTex = v.texcoord;        }        void surf (Input IN, inout SurfaceOutput o)         {            half4 c = 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 ("Self Color Value", Color) = (1,1,1,1)    }

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

        void surf (Input IN, inout SurfaceOutput o)         {            half4 c = 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类的实现可以参见我的其它文章)

public class TrailRendererGen : BaseBehavior {    [SerializeField][Tooltip("旋转角速度")]    protected float m_angle=360;    protected override void OnInitFirst()    {    }    protected override void OnInitSecond()    {    }    protected override void OnUpdate()    {        m_transform.Rotate(Vector3.forward, m_angle*Time.deltaTime);    }}

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

颜色 顶点 控制 条带 光照 透明度 部分 就是 变化 不同 位置 方程 c.a 单位 向量 贴图 黑白 代码 参数 可以通过 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 接入服务器端口在哪里查 视频网络安全指导思想 网络服务器配置与管理小论文 软件开发方法适用场景 大型服务器开发框架 传奇服务器最低配置 数据库 学习论坛 网络安全中餐平台 windows窗体软件开发 日照移动城管软件开发 WITS数据库产品层面关税 陕西软件开发厂家 软件开发服务外包的前景 浙江服务器钣金机箱厂虚拟主机 数据库设置多个键语法 人工智能专业可以做软件开发么 南京erp软件开发收费标准 聊城游戏软件开发推荐 网上互联网科技有限公司 西北某舱网络技术有限公司 推荐网易版超好玩的服务器 大学法制主题教育基地软件开发 方球网络技术服务中心 密信服务器地址写别人安全吗 ps5国行不能用的服务器 福建多功能网络技术服务计划表 密集异构网络技术 鼎信网络技术有限公司 全国网络安全执法大检查行动 海南裕居网络技术有限公司图片
0