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

相关推荐
在路上看风景8 小时前
4.5 顶点和片元
unity
在路上看风景20 小时前
31. Unity 异步加载的底层细节
unity
天人合一peng21 小时前
Unity中做表头时像work中整个调整宽窄
unity
小李也疯狂1 天前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
牛掰是怎么形成的1 天前
Unity材质贴图引用陷阱:包体暴涨真相
unity·材质·贴图
呆呆敲代码的小Y1 天前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
EQ-雪梨蛋花汤1 天前
【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
unity·游戏引擎
我的offer在哪里1 天前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
泡泡茶壶ᐇ1 天前
Unity游戏开发入门指南:从零开始理解游戏引擎核心概念
unity·游戏引擎
YigAin2 天前
Unity中的Lock,到底在锁什么,什么时候该用?
unity