使用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
相关产品推荐
相关产品推荐

