在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 小时前
Unity3D 心理沙盘互动演示
unity·ai·pdf·人机交互·工具·互动·心理沙盘
CuPhoenix10 小时前
【沧海拾昧】Unity 导入中文字体文字缺失的解决方法
unity
南無忘码至尊11 小时前
Unity学习90天-第1天-认识Transform + 坐标系
学习·unity·游戏引擎
南無忘码至尊11 小时前
Unity学习90天-第1天-认识Unity并书写我们的第一个脚本
学习·unity·游戏引擎
风酥糖12 小时前
Godot游戏练习01-第26节-轮次结束后弹出升级选项
游戏·游戏引擎·godot
雪域迷影12 小时前
Hazel游戏引擎结构分析
c++·游戏引擎·hazel
Nuopiane15 小时前
C#基础(1)堆栈、GC与Marshal
unity·c#
weixin_4093831221 小时前
godot创建两种敌人僵尸 一种吐舌头 一种在角色脚下生成圆形伤害圈 两种僵尸均继承enemy脚本 理解继承
游戏引擎·godot
mxwin1 天前
Unity Shader 跨平台兼容性:处理纹理坐标翻转与精度差异
unity·游戏引擎
王家视频教程图书馆1 天前
godot 下载地址
游戏引擎·godot