在Unity中使用LineRenderer实现A点到B点的贝塞尔曲线。并且曲线为虚线。方向为A点流向B点。效果图如下

一、创建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。效果如图

相关推荐
速冻鱼Kiel2 小时前
GASP笔记03
笔记·ue5·游戏引擎·虚幻
nnsix2 小时前
Unity URP用于 光照贴图(Lightmap)的材质Shader
unity·材质·贴图
yi碗汤园2 小时前
【一文了解】网络请求
网络·unity
EucliwoodXT2 小时前
【Unity】项目部署Linux服务器
linux·unity·游戏引擎
微光守望者2 小时前
Unity小知识【2】:Transform与RectTransform,UI和3D对象的空间转换秘诀
ui·3d·unity
心之所向,自强不息2 小时前
URP的渲染流程
unity
变身缎带18 小时前
Unity里基于Luban的buff系统
数据库·unity·游戏引擎
变身缎带1 天前
Unity中较为完善的NetworkManager
unity·游戏引擎
作孽就得先起床1 天前
unity webGL导出.glb模型
unity·c#·游戏引擎·webgl