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保证不同帧率下的绘制速度一致
使用注意事项
- 确保你的
Points数组里的每个GameObject都有Transform组件(默认都有) - 可以调整
lineDrawSpeed来改变绘制的快慢 - 如果需要修改线段样式(颜色、材质等),可以在Start方法里额外设置
lineRenderer.startColor、lineRenderer.material等属性
内容的提问来源于stack exchange,提问作者weaverbeaver
相关产品推荐
相关产品推荐

