最近玩网易的无尽的拉格朗日,发现他们的虚线做得挺有意思,闲来也无事,正好也复习下之前学过的东西。借鉴的是这位高手的一些代码:Unity3D Shader系列之画虚线方式分析与总结_WangShade的博客-CSDN博客_unity 虚线shader

一:需求

1,要求拉近拉远相机都可以清楚看到虚线

2,虚线线段运动方向可以调节

3,拉近拉远虚线 虚线线段也会随之变化,使之合理,均匀。

4,性能上肯定不能耗费(运用共享材质目前耗费1DC)。

5,可以自定义点位

瞎搞了几天,终于可以实现以上需求,先上图,再上代码,不啰嗦,代码里有注释,懂得都懂,不懂拿去用也可以。满足一般需求应该没问题,如果是要做那种曲线的,那还是得花心机再鼓捣鼓捣。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DottedLine : MonoBehaviour
{/// <summary>/// 创建虚线所需要的节点/// </summary>public List<Transform> PointList = new List<Transform>();private Material _material;List<GameObject> autoquads = new List<GameObject>();private MaterialPropertyBlock _propertyBlock;// Start is called before the first frame updatevoid Start(){if (_propertyBlock == null)_propertyBlock = new MaterialPropertyBlock();_material = new Material(Shader.Find("Custom/UI/DotLine"));}// Update is called once per framevoid Update(){}private void CreatDottedLine(){if (PointList.Count <= 0) return;foreach (GameObject o in autoquads){if (o != null) Destroy(o);}autoquads.Clear();for (int i = 0; i < PointList.Count - 1; i++){CreatQuadScale(PointList[i].position, PointList[i + 1].position);}}private int n = 0;private void CreatQuadScale(Vector3 leftPos, Vector3 rightPos){GameObject go = GameObject.CreatePrimitive(PrimitiveType.Quad);autoquads.Add(go);go.name = "autoQuad_"+n;n++;Vector3 dir = (rightPos - leftPos).normalized;float distance = Vector3.Distance(leftPos, rightPos);Vector3 centerPoint = Vector3.Lerp(leftPos, rightPos, 0.5f);go.transform.position = centerPoint;go.transform.localScale = new Vector3(distance, 1f, 1f);go.transform.right = dir;MeshRenderer mr = go.GetComponent<MeshRenderer>();mr.material = _material;//Debug.Log("距离为 " +distance);//一个单位长度10个虚线点//这个后期可以自己定float cnt = distance * 10;Debug.Log("间隔为 " + cnt);_propertyBlock.SetFloat("_Cnt", cnt);mr.SetPropertyBlock(_propertyBlock);//设置线段的方向,转向,让面片固定方向的同时,仅且旋转X轴,使其最大化面向摄像机,视觉效果保证每个小线段不至于太倾斜成平行四边形Vector3 camDir = (Camera.main.transform.position - go.transform.position).normalized;Vector3 cross = Vector3.Cross(go.transform.right, camDir).normalized;//得到垂直于相机方向的向量float angle = Vector3.Angle(cross, go.transform.up);//得到Y轴跟该向量的角度,为啥是Y轴,因为模型自身XY轴构建成一个平面,Y轴重合cross,自然面向摄像机Vector3 dirCross = Vector3.Cross(go.transform.up, cross);//用来判断方向float vDir = Vector3.Dot(dirCross.normalized, go.transform.right);if (vDir < 0){angle *= -1;}go.transform.rotation *= Quaternion.Euler(new Vector3(angle, 0f, 0f));}#if UNITY_EDITORprivate void OnGUI(){if (GUI.Button(new Rect(0f, 0f, 100f, 100f), "test")){CreatDottedLine();}}
#endif}

Shader部分

Shader "Custom/UI/DotLine"
{Properties{_Color ("Tint", Color) = (1,1,1,1)_Ratio ("Ratio", Range(0, 1.0)) = 0.5//线宽_Width("Width",float)=0.01//线段高度_Speed("Speed",float)=3//线段的移动速度[Toggle(DIR)] _Y ("Y?", float) = 0//线段的运动方向  }SubShader{Tags{"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent""PreviewType"="Plane""CanUseSpriteAtlas"="True"}Cull offLighting OffZWrite OffZTest [unity_GUIZTestMode]Blend One OneMinusSrcAlphaPass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#pragma multi_compile __ DIR#pragma multi_compile_instancing#include "UnityCG.cginc"#include "UnityUI.cginc"struct appdata_t{float4 vertex   : POSITION;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex   : SV_POSITION;float2 texcoord  : TEXCOORD0;float w:TEXCOORD1;UNITY_VERTEX_INPUT_INSTANCE_ID};fixed4 _Color;fixed _Ratio;float _Width;float _Speed;UNITY_INSTANCING_BUFFER_START(Props)UNITY_DEFINE_INSTANCED_PROP(float, _Cnt)UNITY_INSTANCING_BUFFER_END(Props)v2f vert(appdata_t v){v2f OUT;UNITY_SETUP_INSTANCE_ID(v);UNITY_TRANSFER_INSTANCE_ID(v, OUT);v.vertex.y*=_Width;//约束Y轴的尺寸float w= UnityObjectToClipPos(v.vertex).w;v.vertex.y*=w;//w值是影响近大远小的因素,我们这里反向乘回去,就可以忽略近大远小的问题OUT.vertex = UnityObjectToClipPos(v.vertex);OUT.texcoord = v.texcoord;OUT.w = w;//把这个因子放到片段着色器,让线段个数随相机的距离变化而变化return OUT;}fixed4 frag(v2f IN) : SV_Target{UNITY_SETUP_INSTANCE_ID(IN);float dir=1;#if DIRdir= 1;#elsedir=-1;#endiffixed4 color = _Color;float x = _Time.y*_Speed+ (dir *IN.texcoord.x * UNITY_ACCESS_INSTANCED_PROP(Props, _Cnt)/clamp(IN.w,2,100));//限制w值,否则一条线中虚线由两边往中间走的错误效果int intX = int(x);color.a *= step(x-intX, _Ratio);color.rgb *= color.a;return color;}ENDCG}}
}

场景结构

unity 虚线 无视透视 近大远小相关推荐

  1. unity让声音有近大远小的效果

    首先创建一个空物体,然后添加上AudioSource组件 这个数值为0代表音效为2D的(没有远近之分),1代表3D效果. 这样子就能实现近大远小的声音效果了

  2. ai人工智能_对人工智能的追求

    ai人工智能 "Artificial Intelligence began with an ancient wish to forge the Gods." -Pamela McC ...

  3. HTML——3D移动、3D透视、3D效果、3D呈现案例效果

    灵活运用3D效果制作两盒翻转与旋转木马案例 ※概念 3D转换: ①移动:transform:translate3d(x,y,z): 注意:xyz不能省略,不需要需要写0 ②透视--近大远小:persp ...

  4. 点,线,面,透视(手绘课)

    点 圆形:平稳,在感情上是饱满的,浑厚有力量的. 方形:除了平稳外有端庄,大方感,在感情上是踏实的,可依靠的(eg:列表式布局) 三角形/菱形:菱角分明,且具有指向性,在感情上是偏倚的,有目的性的(菱 ...

  5. 美术基础-明暗与透视

    明暗与透视 明暗原理 三面 亮面 灰面 暗面 (黑 白 灰) 五调 亮面 灰面 暗面 反光 明暗交接线(球体) 透视 近大远小 近实远虚 平行透视(一点透视):消失于一点 我们日常所接触到的物体以六面 ...

  6. 技术分享连载(七十九)

    制作 Q1:如果场景中有大量物体,请问如何利用相机拾取获取不同范围内的物体? 题主可以采用Physics.SphereCastAll函数来获取,类似下面这个场景: 在SphereCastAll这个AP ...

  7. unity-3d摄像头

    按下鼠标右键的同时,按下方向键来推进或拉远镜头 3d摄像头分为两种模式,iso模式(无视透视)和persp模式(正常透视) 按住ctrl移动物体会按照步长移动.可以在编辑的网格和捕捉设置中修改步长 游 ...

  8. 静态pc端页面,你一定用得上的技巧

    目录 一.CSS盒子布局 1. 内边距 padding 2.外边距 margin 3.案例 4.边框形状 5.阴影 二.浮动 1.浮动特性 2.清除浮动 3.css书写顺序 三.css定位 1.==定 ...

  9. U3D -- 一些知识点和优秀博客收藏

    1. 场景与工程 Project(工程)与Scene(场景)是不同的概念,一个项目工程可包含多个场景,而每个场景是唯一的.例如通关游戏,项目就是整个游戏,场景就是游戏中的各个关卡. 2. 图层的个数 ...

最新文章

  1. 实战!工作中常用到哪些设计模式
  2. SQL Server 2016新特性:列存储索引新特性
  3. tree view 後台編寫
  4. pkg-config的使用
  5. amd为什么还用针脚_为什么AMD不取消cpu上的针脚?
  6. maven jacoco_使用JaCoCo Maven插件为单元和集成测试创建代码覆盖率报告
  7. 全美杰出的技术MBA专业
  8. 数据库系列(二):数据库基础02
  9. python实现输入三角形边长自动作图求面积案例
  10. tensorflows十五 再探Momentum和Nesterov's accelerated gradient descent 利用自动控制PID概念引入误差微分控制超参数改进NAGD,速度快波动小
  11. Android Studio (6)---Gradle
  12. 【翻译】在backtrack5上用Evilgrade工具15步**windows
  13. 【Hive】日期函数
  14. SQL Server子查询实例
  15. 50. 熟悉与STL相关的Web站点
  16. C语言汇编-函数调用栈
  17. Java基础知识点梳理
  18. 用oracle语句计算百分比
  19. 用SET工具包制作钓鱼网站
  20. php 服务器返回404,php--------返回404状态

热门文章

  1. JavaScript 删除对象中的某一项
  2. 赌徒史玉柱变脸转战IT产业 筹资1亿备战网游
  3. 贷记业务及相应技术规范
  4. 中级软件设计师-软考心得
  5. html图片加载不出来
  6. 如何绘制公司组织结构图
  7. 鸿蒙系统沙箱,鸿蒙计划加速!亦来云成操作系统的救命稻草?
  8. 研发流程——准入体系设计
  9. 纽约时报:雅虎财经远远超越 Google 财经
  10. VMWare建立于W10的共享文件夹