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

相关推荐
叶帆2 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君2 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子2 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai3152475433 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光3 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光3 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯3 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案3 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔3 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技3 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d