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

Unity中使用Line Renderer绘制的圆半径过大且无法闭合问题求助

问题修复方案

问题1:绘制的圆半径大于设定值

导致该问题的核心原因及对应修复方法如下:

  • 父物体缩放影响:由于你设置了line.useWorldSpace = false,绘制的是局部坐标,若父物体的Transform缩放比例不为(1,1,1),实际半径会被缩放放大。解决方式:
    1. 确保父物体的Transform缩放为(1,1,1);
    2. 或者在计算点坐标时,抵消父物体的缩放影响:
      Vector3 localScale = container.transform.localScale;
      points[i] = new Vector3(Mathf.Sin(rad) * radius / localScale.x, 0f, Mathf.Cos(rad) * radius / localScale.z);
      
  • 角度计算逻辑缺陷:当前代码直接用i作为角度值(仅当segments=360时逻辑成立),若后续修改segments值会导致角度分布不均。正确的角度计算应按segments均分360度:
    var rad = Mathf.Deg2Rad * (i * 360f / segments);
    
  • LineRenderer对齐方式的视觉偏差:默认alignment为View(线始终面向相机),在3D视角下会导致视觉上的半径偏大。可改为基于Transform的对齐:
    line.alignment = LineAlignment.TransformZ;
    

问题2:圆无法完全闭合(存在断点)

该问题的核心是未开启LineRenderer的loop循环属性,同时存在点数量冗余和材质适配问题:

  1. 开启Loop属性:添加line.loop = true;,LineRenderer会自动连接最后一个点与第一个点,实现闭合;
  2. 优化点数量:开启loop后,无需设置positionCount = segments + 1,仅需segments个点即可(避免重复点引发的渲染异常);
  3. 更换适配的材质:Sprites/Default是2D精灵专用Shader,在3D场景中易出现渲染断点,建议改用3D线渲染适配的Shader(如URP环境下的Universal Render Pipeline/Line,内置管线的Legacy Shaders/Particles/Alpha Blended)。

修复后的完整代码

using UnityEngine;

[RequireComponent(typeof(LineRenderer))]
public static class GameObjectEx
{
    public static void DrawCircle(this GameObject container, float radius, float lineWidth)
    {
        var segments = 120; // 平衡平滑度与性能,120段已足够视觉平滑

        LineRenderer line = container.GetComponent<LineRenderer>();

        // 使用3D线适配的Shader,避免渲染断点
        line.material = new Material(Shader.Find("Universal Render Pipeline/Line"));
        line.startColor = Color.black;
        line.endColor = Color.black;

        line.useWorldSpace = false;
        line.startWidth = lineWidth;
        line.endWidth = lineWidth;
        line.loop = true; // 开启循环闭合
        line.alignment = LineAlignment.TransformZ; // 避免视角导致的视觉偏差
        line.positionCount = segments; // 开启loop后无需额外点

        var points = new Vector3[segments];
        Vector3 localScale = container.transform.localScale;

        for (int i = 0; i < segments; i++)
        {
            // 按段数均分360度计算角度
            var rad = Mathf.Deg2Rad * (i * 360f / segments);
            // 抵消父物体缩放影响
            points[i] = new Vector3(
                Mathf.Sin(rad) * radius / localScale.x,
                0f,
                Mathf.Cos(rad) * radius / localScale.z
            );
        }

        line.SetPositions(points);
    }
}

额外注意事项

  • 若使用内置渲染管线,将Shader改为Legacy Shaders/Particles/Alpha Blended即可;
  • 保持LineRenderer所在物体的Transform缩放为(1,1,1)可简化计算,避免额外的缩放干扰;
  • segments值无需设置为360,60段即可达到基本平滑,120段是视觉与性能的最优平衡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:50:23