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

使用LineRenderer绘制多半径圆遇问题:for循环仅生成单个圆

解决LineRenderer绘制多个圆只显示一个的问题

你遇到的问题很典型——每次外层循环都在覆盖同一个LineRenderer的顶点数据,所以最后只有最后一次循环生成的圆被保留了下来。下面给你两种可行的解决方案:

方案一:用单个LineRenderer绘制多个圆

我们需要把每个圆的顶点依次添加到LineRenderer中,而不是每次都从第0个顶点开始覆盖。具体修改如下:

public float ThetaScale = 0.01f; 
public float radius = 3f; 
private int circleVertexCount; 
private LineRenderer lineDrawer; 
private float theta = 0f; 

void Start () { 
    lineDrawer = GetComponent<LineRenderer>();
    // 计算单个圆需要的顶点数,只计算一次避免重复计算
    circleVertexCount = (int)((1f / ThetaScale) + 1f);
    // 设置总顶点数:5个圆 × 单个圆的顶点数
    lineDrawer.positionCount = circleVertexCount * 5;
    DrawAllCircles();
}

// 把绘制逻辑抽成单独方法,避免在Update里重复执行(除非你需要实时更新圆的参数)
void DrawAllCircles() {
    for (int l = 1; l <= 5; l++) { // 从1开始,避免l=0时生成半径为0的点
        theta = 0f; // 每个圆开始时重置角度
        int startIndex = (l - 1) * circleVertexCount; // 当前圆的起始顶点索引
        for(int i = 0; i < circleVertexCount; i++) { 
            theta += (2.0f * Mathf.PI * ThetaScale); 
            float x = l * radius * Mathf.Cos(theta); 
            float y = 0f;
            float z = l * radius * Mathf.Sin(theta); 
            lineDrawer.SetPosition(startIndex + i, new Vector3(x, y, z)); 
        }
    }
}

// 如果需要实时更新(比如拖拽调整radius),再调用DrawAllCircles
void Update() {
    // DrawAllCircles();
}

关键修改点:

  • 提前计算单个圆的顶点数,避免在循环里重复计算
  • 设置LineRenderer的总顶点数为所有圆的顶点数之和
  • 每个圆使用独立的顶点索引区间,不会覆盖之前的圆的顶点
  • 把l的起始值改为1,避免生成半径为0的无效圆

方案二:用多个LineRenderer(每个圆一个)

如果后续需要单独控制某个圆的显示、颜色或参数,这种方式更灵活:

public float ThetaScale = 0.01f; 
public float radius = 3f; 
private int circleVertexCount; 

void Start () { 
    circleVertexCount = (int)((1f / ThetaScale) + 1f);
    // 循环创建5个LineRenderer,每个对应一个圆
    for (int l = 1; l <= 5; l++) {
        // 创建空物体挂载LineRenderer
        GameObject circleObj = new GameObject($"Circle_{l}");
        circleObj.transform.parent = transform; // 设置父物体,方便管理
        LineRenderer lineDrawer = circleObj.AddComponent<LineRenderer>();
        
        // 配置LineRenderer参数
        lineDrawer.positionCount = circleVertexCount;
        lineDrawer.widthMultiplier = 0.1f; // 可以调整线宽
        
        // 绘制当前圆
        float theta = 0f;
        for(int i = 0; i < circleVertexCount; i++) { 
            theta += (2.0f * Mathf.PI * ThetaScale); 
            float x = l * radius * Mathf.Cos(theta); 
            float y = 0f;
            float z = l * radius * Mathf.Sin(theta); 
            lineDrawer.SetPosition(i, new Vector3(x, y, z)); 
        }
    }
}

额外建议:

  • 尽量不要把绘制逻辑放在Update()里,除非你需要实时修改圆的参数(比如动态调整半径),否则放在Start()或Awake()里执行一次即可,节省性能
  • 如果需要让圆闭合,可以在每个圆的最后再添加一次第一个顶点的位置,或者启用LineRenderer的Loop属性(在Inspector里勾选,或者代码里设置lineDrawer.loop = true;)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:52:29