You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中基于游戏对象数组绘制保留历史线段的折线图问题

解决Unity中LineRenderer连续绘制并保留线段的问题

我明白你现在的需求啦——要让LineRenderer逐步绘制并保留所有已画的线段,而不是在两点间来回移动。你的现有代码应该是只在两个点之间更新线段位置,没有保留之前的顶点,所以我们得调整成动态扩展顶点数组的方式,每完成一段就把新的点加入进去,这样就能实现连续延伸的效果了。

修改思路核心

  • 不再只维护两个点的位置,而是动态增加LineRenderer的顶点数量,每绘制完一段就把终点加入顶点列表
  • 使用协程来控制每一段的绘制速度,确保平滑的动画效果
  • 初始化时先设置起点,然后依次遍历你的Points数组,逐个绘制到下一个点

修改后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawLine : MonoBehaviour
{
    private LineRenderer lineRenderer;
    public GameObject[] Points;
    public float lineDrawSpeed = 2f;

    void Start()
    {
        // 获取或添加LineRenderer组件
        lineRenderer = GetComponent<LineRenderer>();
        if (lineRenderer == null)
        {
            lineRenderer = gameObject.AddComponent<LineRenderer>();
        }

        // 基础设置:使用世界坐标,设置线段宽度
        lineRenderer.useWorldSpace = true;
        lineRenderer.startWidth = 0.1f;
        lineRenderer.endWidth = 0.1f;

        // 检查点数组是否有效
        if (Points != null && Points.Length >= 2)
        {
            // 初始化:先设置第一个点为起点
            lineRenderer.positionCount = 1;
            lineRenderer.SetPosition(0, Points[0].transform.position);
            // 启动协程开始绘制
            StartCoroutine(DrawLinesSequentially());
        }
        else
        {
            Debug.LogError("Points数组为空或点数不足2个!");
        }
    }

    IEnumerator DrawLinesSequentially()
    {
        // 遍历从第一个点到倒数第二个点,逐个绘制到下一个点
        for (int i = 0; i < Points.Length - 1; i++)
        {
            Transform startPoint = Points[i].transform;
            Transform endPoint = Points[i + 1].transform;

            // 计算当前段的总距离
            float totalDistance = Vector3.Distance(startPoint.position, endPoint.position);
            float currentDistance = 0f;

            // 逐步绘制当前线段
            while (currentDistance < totalDistance)
            {
                // 计算当前绘制的进度
                currentDistance += lineDrawSpeed * Time.deltaTime;
                // 计算当前位置
                Vector3 currentPosition = Vector3.Lerp(startPoint.position, endPoint.position, currentDistance / totalDistance);

                // 更新LineRenderer的最后一个点为当前位置
                lineRenderer.SetPosition(lineRenderer.positionCount - 1, currentPosition);
                yield return null;
            }

            // 绘制完当前段后,添加新的顶点(下一个点),为下一段做准备
            lineRenderer.positionCount += 1;
            lineRenderer.SetPosition(lineRenderer.positionCount - 1, endPoint.position);
        }
    }
}

关键代码解释

  • 初始化设置:先确保LineRenderer存在,开启世界坐标模式,设置合适的线段宽度,避免绘制出不可见的线段
  • 协程控制绘制:DrawLinesSequentially协程负责逐个处理每一段线段,用while循环实现平滑的位置插值
  • 动态扩展顶点:每完成一段线段后,通过lineRenderer.positionCount += 1增加顶点数量,并把下一个点设置为新的顶点,这样之前绘制的线段就会被保留下来
  • 速度控制:lineDrawSpeed控制每帧移动的距离,结合Time.deltaTime保证不同帧率下的绘制速度一致

使用注意事项

  1. 确保你的Points数组里的每个GameObject都有Transform组件(默认都有)
  2. 可以调整lineDrawSpeed来改变绘制的快慢
  3. 如果需要修改线段样式(颜色、材质等),可以在Start方法里额外设置lineRenderer.startColor、lineRenderer.material等属性

内容的提问来源于stack exchange,提问作者weaverbeaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:10:12