在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。效果如图

相关推荐
FairGuard手游加固15 小时前
手游加固怎么做?SO、IL2CPP、AssetBundle 与运行时保护详解
安全·游戏·unity
阿松爱学习2 天前
【Unity开发】监听Scene场景事件
unity·c#
xiaogai_gai2 天前
BOM 物料清单同步实战:金蝶云星空 → 四化智造 MES 修改场景深度拆解
unity·游戏引擎
淡海水2 天前
03-03-架构篇-SGen GC架构解析
unity·架构·c#·gc·sgen
/**书香门第*/2 天前
Cocos Creator 打螺丝游戏的实现
游戏引擎·cocos2d·螺丝·打螺丝
萌萌的提莫队长3 天前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
mxwin4 天前
Unity Shader 光线追踪原理与实战案例
unity·游戏引擎
地狱为王4 天前
Unity使用DPDFNet实现实时语音增强(降噪)
unity·语音增强·降噪·dpdfnet
平行云PVT4 天前
国产信创实时云渲染解决方案:如何实现数字孪生与三维应用云化部署?
unity·webrtc·unreal engine·实时云渲染·国产信创·摩尔线程·砺算科技
夏炎黄4 天前
Terrain地形剪裁
unity