
一、创建LineRenderer
在场景中创建一个空的GameObject命名为LineRenderer。并给该对象添加LineRenderer组件。
二、创建Shader
在项目文件夹下创建Shader,命名为DashedLineFlow并添加一下内容
cs
Shader "Custom/DashedLineFlow"
{
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_DashLength ("Dash Length", Float) = 0.2
_GapLength ("Gap Length", Float) = 0.2
_Speed ("Flow Speed", Float) = 1.0
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
fixed4 _Color;
float _DashLength;
float _GapLength;
float _Speed;
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
// 直接加上时间偏移(正负均可)
o.uv = v.uv + float2(_Time.y * _Speed, 0);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float total = _DashLength + _GapLength;
// 关键修复:使用 frac 确保周期正确
float phase = frac(i.uv.x / total);
float dist = phase * total;
if (dist < _DashLength)
return _Color;
else
return fixed4(0, 0, 0, 0);
}
ENDCG
}
}
}
三、材质球
在项目文件夹下创建一个材质球,将材质球的Shader选择为刚刚创建的Shader,材质球设置如下图所示

四、实现贝塞尔曲线效果
在项目文件夹下创建一个脚本命名为AutoBezierCurve.cs,并填充如下代码
cs
using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class AutoBezierCurve : MonoBehaviour
{
public Transform startPoint;
public Transform endPoint;
public int segments = 50; // 曲线精度(点越多越平滑)
private LineRenderer lineRenderer;
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.positionCount = segments + 1;
lineRenderer.useWorldSpace = true;
}
void Update()
{
if (startPoint == null || endPoint == null) return;
Vector3 controlPoint = CalculateControlPoint(startPoint.position, endPoint.position);
for (int i = 0; i <= segments; i++)
{
float t = (float)i / segments;
Vector3 point = CalculateQuadraticBezier(startPoint.position, controlPoint, endPoint.position, t);
lineRenderer.SetPosition(i, point);
}
}
Vector3 CalculateControlPoint(Vector3 start, Vector3 end)
{
// 这里简单地将控制点设置为两点中心位置的上方(可以根据需求调整)
Vector3 midPoint = (start + end) / 2;
Vector3 direction = (end - start).normalized;
Vector3 perpendicularDirection = Quaternion.Euler(0, 90, 0) * direction; // 旋转90度得到垂直方向
return midPoint + perpendicularDirection * Vector3.Distance(start, end) * 0.5f; // 控制点距离根据实际需要调整
}
Vector3 CalculateQuadraticBezier(Vector3 p0, Vector3 p1, Vector3 p2, float t)
{
float u = 1 - t;
return Mathf.Pow(u, 2) * p0 + 2 * u * t * p1 + Mathf.Pow(t, 2) * p2;
}
}
将该脚本挂载在场景中的LineRenderer上,并且指定划线的起点和终点
五、其他设置
将LineRenderer的LineRenderer组件里的TextureMode设置为Tile模式。将划线的宽度设置为自己喜欢的宽度,我这里设置的是0.1。并且将材质球赋予给LineRenderer组件上。
点击运行Unity。效果如图