最近学Shader有点心得,做了一个SLG画线模块。github地址:https://github.com/871041532/SLGDrawLine

性能有能再提高的地方,欢迎大佬指点。

1.介绍

  • 画线模块,可用于SLG游戏行军线。
  • 多个不同速度、颜色、长度的线在一个DrawCall中实现。
  • 材质中ShowLength控制两端显示的长度,AlphaLength控制渐隐长度,AllShowLength是一个临界值,长度小于它的线全部显示,长度大于它的线出现中间渐隐消失效果。(ShowLength、AlphaLength控制这两个效果)
  • 只有一个C#脚本文件和一个Shader,100多行代码。

2.使用demo

外部接口,只有两个:

  • 画线:int handle=LineManager.Instance.DrawLine(Vector3 start,Vector3 end,Color color,float speed);
  • 回收线:LineManager.Instance.BackLine(int handle);

多次调用画线效果:

  • 线中间不显示,两端渐隐

  • 线全部显示

3.C#代码部分

using System.Collections.Generic;
using UnityEngine;
using LineHandle = System.Int32;class LineManager
{private GameObject m_root = null; private GameObject m_origin = null;private Stack<GameObject> m_linePool = null;private Dictionary<int, GameObject> m_drawLines = null;private int m_index = 0;#region 外部接口//参数:起始点、终止点、颜色、速度public LineHandle DrawLine(Vector3 start,Vector3 end,Color color,float speed){//从池中拿出GameObject line = getFromPool();Transform lineTransform = line.transform;Transform childTransform = lineTransform.GetChild(0);Mesh mesh = childTransform.GetComponent<MeshFilter>().mesh;var vertices = mesh.vertices;//设置颜色var colors = new Color[vertices.Length];for (int i = 0; i < colors.Length; i++){colors[i] = color;}mesh.colors = colors;//设置父transform位置朝向,子transform缩放Vector3 position = new Vector3((start.x+end.x)/2,(start.y+end.y)/2,(start.z+end.z)/2);Vector3 scale =new Vector3(1,Vector3.Distance(start,end),1);Vector3 direction = (end - start).normalized;lineTransform.localPosition = position;childTransform.localScale = scale;lineTransform.localRotation = Quaternion.LookRotation(direction);//设置Y轴缩放,速度值var uv2 = new Vector2[vertices.Length];for (int i = 0; i < uv2.Length; i++){uv2[i] = new Vector2(childTransform.localScale.y / childTransform.localScale.x, speed);}mesh.uv2 = uv2;//放入字典m_drawLines.Add(++m_index, line);return m_index;}//参数:索引public void BackLine(LineHandle handle){if(m_drawLines.ContainsKey(handle)){GameObject line = m_drawLines[handle];m_drawLines.Remove(handle);backToPool(line);}}#endregion#region 内部实现private void Init(){m_origin = Resources.Load("DrawLine/Line") as GameObject;m_linePool = new Stack<GameObject>(23);m_root = new GameObject("LineRoot");m_drawLines = new Dictionary<int, GameObject>(23);m_index = 0;}private GameObject getFromPool(){if (m_linePool.Count==0){GameObject gameObject = GameObject.Instantiate(m_origin);gameObject.transform.parent = m_root.transform;return gameObject;}else{return m_linePool.Pop();}}private void backToPool(GameObject line){line.transform.localPosition = new Vector3(1000,1000,1000);m_linePool.Push(line);}#endregion#region singletonprivate static LineManager _instance = null;private LineManager() { Init(); }public static LineManager Instance{get {if (_instance==null){_instance = new LineManager();}return _instance;}private set { }}#endregion
}

4.Shader代码部分

Shader "lineShader"{Properties{_MainTex("Line Texture",2D) = "white"{}_ShowLength("Show Length",Float)=6.0 //展现的长度_AlphaLength("Alpha Length",Float)=5.0 //有透明效果的长度_AllShowLength("AllShow Length",Float)=10 //临界值,如果线比它短,那么全都显示}SubShader{Tags{ "Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }Pass{Tags{ "LightMode" = "ForwardBase" }ZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"sampler2D _MainTex;float4 _MainTex_ST;float _ShowLength;float _AlphaLength;float _AllShowLength;struct a2v{float4 vertex:POSITION;float4 texcoord:TEXCOORD0;fixed4 color:COLOR0;float2 uv2 : TEXCOORD1; //第二套UV:x分量存储y轴缩放,y分量存储滚动速度               };struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD1;fixed4 color:COLOR1;float2 uv2:TEXCOORD2; //x分量存储Y轴缩放固定值,y分量存储滚动前uv.y};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex);o.uv.y *=v.uv2.x;//Y轴缩放o.color=v.color;o.uv2=o.uv;o.uv2.x=v.uv2.x; //o.uv2.x存储Y轴缩放固定值,y轴当前uv.yo.uv.y -=v.uv2.y* _Time.z; //Y轴随时间偏移return o;}fixed4 frag(v2f i) :SV_Target{fixed4 color = tex2D(_MainTex,i.uv.xy);//后半段透明值与前半段透明值,取最大值i.color.a=max(clamp((_ShowLength-(i.uv2.x-i.uv2.y))/_AlphaLength,0,1),clamp((_ShowLength-i.uv2.y)/_AlphaLength,0,1)); //i.uv2.y存储此片元的UV.y//当比_AllShowLength小的时候全部显示i.color.a+=clamp(_AllShowLength-i.uv2.x,0,1); //大于0i.color.a *= color.a;return i.color;}ENDCG}}//Fallback "VertexLit"
}

Unity:SLG游戏画线模块相关推荐

  1. Unity应用Handles画线,方便查看点间的路径

    今天工作碰到一个实现NPC巡逻的功能需求,需要程序实现相关逻辑,并且能够让策划自由配置NPC巡逻路径和NPC交互功能. 这里我就想记录一下我利用Unity的Handles画线的功能实现路径可视化的一种 ...

  2. Unity的Gizmos画线

    Unity的Gizmos画线 1效果图 2.核心代码 3,亲测可行 加粗样式 4,注意事项这个Gizmos模式下画线,需要打开Unity的Scene和G ame视图中的Gizmos选项,因此在编辑器下 ...

  3. 【Unity】UI画线工具

    [Unity]UI画线工具 最近恰好遇到在图片上画线标记路径的需求,需要动态地画很多线,感觉做帧动画的话美术工作量有点大,所以做了一个功能比较简单的UI画线工具 UIPathwaySystem : h ...

  4. Unity 几种画线方式

    [前言] 图形化调试可以加速开发. 例如在战斗中,可能需要知道所有单位的仇恨值,如果这些信息全打log的话,很难有直观感受, 而如果在Scene窗口里,单位头顶有一个球,越红表示仇恨越高,越暗表示仇恨 ...

  5. Unity用Gizmos画线和图

    Camera上挂runner.cs脚本,创建几个GameObject进行点的定位,赋值给runner的ts数组 runner中实现OnDrawGizmos方法,在其中用Gizmos进行绘制 //run ...

  6. unity LineRender用法——画线

    1.创建一个空物体,加上LineRender组件 2.创建一个材质,用来渲染Line Shader "MyShader/RenderDepth" {Properties{_Colo ...

  7. 【游戏开发实战】TapTap物理画线游戏,教你使用Unity实现2D物理画线功能,看到我为你画的彩虹了吗

    文章目录 一.前言 二.思考 三.验证我们的思考 1.创建物体挂组件 2.设置组件参数 3.运行测试 4.结论 四.撸起袖子写代码 1.Line.cs 2.LinesDrawer.cs 五.场景 六. ...

  8. Unity 使用LineRenderer做画线游戏

    前段时间公司要求做一款画线游戏,经历了许多坑之后,最终确定使用LineRenderer来做,然后又是一系列的坑,好在最后还是做出来了,给大家分享下代码: using System.Collection ...

  9. TapTap物理画线游戏,使用Unity实现2D物理画线功能

    实现效果如下: 本工程已上传到GitHub,感兴趣的同学可自行下载学习. GitHub地址:https://github.com/linxinfa/UnityPhysicsDrawLine 物理画线的 ...

最新文章

  1. 【spring框架】spring整合hibernate初步
  2. c++网络通信(与服务器通信聊天)和c#网络通信
  3. 微服务网关 Kong 快速上手攻略
  4. JS:attachEvent和addEventListener方法
  5. Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析
  6. Electron学习-创建一个程序
  7. vue项目使用eslint
  8. Linux 命令(113)—— seq 命令
  9. 十七、K8s+gitlab+Jenkins建立CI/CD解决方案
  10. [科技部与你共成长] 几道语言题
  11. 物流管理系统【前台+后台】(Spring+SpringMVC+MyBatis+vue+shiro)(二)
  12. STM32cubeMX--增量式PID调节电机速度(霍尔编码器)
  13. 【Java实现】南京地铁导航系统的简单实现(三)—— 图形化界面的设计
  14. PHP代码执行漏洞总结
  15. android 工程模式设置中文翻译,MTK工程模式(中文对照版本)与测试模式指令.doc
  16. ICO图标在线生成,php生成ICO图标在线制作源码
  17. cpu显示无效查询 wmic_Windows WMIC命令使用详解(附实例)
  18. python求数独全解
  19. 企查查之企业信息查询自动化
  20. 慎独,是自律的最高层次

热门文章

  1. 测评您的大数据薪资水平
  2. Windows桌面任务栏上面无线网显示不见了如何解决
  3. 基于深度学习的点云分割网络及点云分割数据集
  4. 网络模拟器软件分享——Cisco Packet Tracer、华为eNSP、H3C Cloud Lab
  5. 传说很牛逼的BLT。
  6. Codeforces1527B1
  7. mysql 制定索引_使用use index优化sql查询
  8. 2022-2028全球与中国颈挂式蓝牙耳机市场现状及未来发展趋势
  9. 浅谈程序员的英语学习 - 风口上的猪 - 博客园
  10. Mapper method ‘com.xxx.dao.ActivityDao.update attempted to return null from a method with a primiti