如何在Unity3D中绘制圆圈?

时间:2012-12-04 17:19:15

标签: unity3d

如何在Unity 3d中绘制圆圈? 我想围绕不同的对象画一个圆圈。 圆的半径是不同的,圆圈有纹理 - 正方形。

8 个答案:

答案 0 :(得分:13)

我发现这段代码出现了很大的错误。点数(大小)不应该是"(2 * pi / theta_scale)+ 1"因为这会使圆圈画出6.28倍。大小应为" 1 / theta_scale + 1"。所以对于theta_scale为0.01,它需要绘制100个点,而对于theta_scale为0.1,它需要绘制10个点。否则它将分别绘制62次和628次。 这是我使用的代码。

using UnityEngine;
using System.Collections;

public class DrawRadar : MonoBehaviour
{
    public float ThetaScale = 0.01f;
    public float radius = 3f;
    private int Size;
    private LineRenderer LineDrawer;
    private float Theta = 0f;

    void Start ()
    {       
        LineDrawer = GetComponent<LineRenderer>();
    }

    void Update ()
    {      
        Theta = 0f;
        Size = (int)((1f / ThetaScale) + 1f);
        LineDrawer.SetVertexCount(Size); 
        for(int i = 0; i < Size; i++){          
            Theta += (2.0f * Mathf.PI * ThetaScale);         
            float x = radius * Mathf.Cos(Theta);
            float y = radius * Mathf.Sin(Theta);          
            LineDrawer.SetPosition(i, new Vector3(x, y, 0));
        }
    }
}

如果修改&#34;尺寸&#34;除以ThetaScale之外,你可以制作一个扫描规格/饼图类型的图形。

答案 1 :(得分:9)

See Unity Answers提出类似的问题。

Alternatively

float theta_scale = 0.1;  // Circle resolution

LineRenderer lineRenderer = gameObject.AddComponent<LineRenderer>();
lineRenderer.material = new Material(Shader.Find("Particles/Additive"));
lineRenderer.SetColors(c1, c2);
lineRenderer.SetWidth(0.2F, 0.2F);
lineRenderer.SetVertexCount(size);

int i = 0;
for(float theta = 0; theta < 2 * PI; theta += theta_scale) {
    x = r*cos(theta);
    y = r*sin(theta);

    Vector3 pos = new Vector3(x, y, 0);
    lineRenderer.SetPosition(i, pos);
    i+=1;
}

LineRenderer需要连续点数。您可以稍微修改此代码以使用圆柱游戏对象而不是线渲染器。我发现LineRenderer有点可怕。

最后,与第一个链接类似,您可以将圆形纹理附加到单位平面。使不属于圆的纹理的任何部分透明。然后缩放并对齐平面以适合您的对象。不幸的是,如果有人看起来几乎与飞机平行,这种方法并不是很好。

答案 2 :(得分:3)

Jerdak的解决方案很好,但代码很乱,所以我不得不调整一下。这是一个类的代码,我在循环中使用i来避免错误。

它还使用gameObject位置更新圆圈的位置。

using UnityEngine;
using System.Collections;

public class CircleDraw : MonoBehaviour {   
  float theta_scale = 0.01f;        //Set lower to add more points
  int size; //Total number of points in circle
  float radius = 3f;
  LineRenderer lineRenderer;

  void Awake () {       
    float sizeValue = (2.0f * Mathf.PI) / theta_scale; 
    size = (int)sizeValue;
    size++;
    lineRenderer = gameObject.AddComponent<LineRenderer>();
    lineRenderer.material = new Material(Shader.Find("Particles/Additive"));
    lineRenderer.SetWidth(0.02f, 0.02f); //thickness of line
    lineRenderer.SetVertexCount(size);      
  }

  void Update () {      
    Vector3 pos;
    float theta = 0f;
    for(int i = 0; i < size; i++){          
      theta += (2.0f * Mathf.PI * theta_scale);         
      float x = radius * Mathf.Cos(theta);
      float y = radius * Mathf.Sin(theta);          
      x += gameObject.transform.position.x;
      y += gameObject.transform.position.y;
      pos = new Vector3(x, y, 0);
      lineRenderer.SetPosition(i, pos);
    }
  }
}

答案 3 :(得分:1)

使用着色器图,我们现在可以绘制像素完美圆。

Unlit Shader Graph

创建此图形后,请基于此着色器创建新材质。

result

然后使用精灵渲染器创建一个新的游戏对象,并设置刚创建的材质。

您可以使用材料的“比例”参数缩放圆。

答案 4 :(得分:0)

使用Sprite进行以下操作。陈飞在场景中,所以她略高于飞机。我有她的飞行,所以我可以得到一个很好的截图,不是因为它不能很好地适应飞机。

我使用了低分辨率的圆形精灵。 X旋转90 比例X 15,Y 15,Z 1

然后我设置了排序图层,因此它将在默认图层上方呈现。当我遇到这篇文章时,我正在测试它。它不能很好地处理阴影。我必须弄清楚绘制了多少层阴影,以确保它们被渲染到精灵上。

enter image description here

答案 5 :(得分:0)

我有一个shader,我通常会从中开始制作镜头光晕之类的效果,然后形成一个圆圈。使用着色器是最佳选择,因为您将获得完美的平滑圆形。

另外,由于着色器的更改不需要重新编译和重新进入播放模式,因此可以轻松地尝试和调整着色器。

答案 6 :(得分:0)

我建议tp为GameObject创建扩展方法。对我很好。

public static class GameObjectExtension
{
    const int numberOfSegments = 360;
    public static void DrawCircle(this GameObject go, float radius, 
float lineWidth, Color startColor, Color endColor, bool lineRendererExists=true)
    {
        LineRenderer circle = lineRendererExists ? go.GetComponent<LineRenderer>() : go.AddComponent<LineRenderer>();
        circle.useWorldSpace = false;
        circle.startWidth = lineWidth;
        circle.endWidth = lineWidth;
        circle.endColor = endColor;
        circle.startColor = startColor;
        circle.positionCount = numberOfSegments + 1;
        Vector3 [] points = new Vector3[numberOfSegments + 1];

        for (int i = 0; i < numberOfSegments + 1; i++)
        {
            float rad = Mathf.Deg2Rad * i;
            points[i] = new Vector3(Mathf.Sin(rad) * radius, 0, Mathf.Cos(rad) * radius);
        }
        circle.SetPositions(points);
    }
}

1注意事项:如果未应用LineRenderer组件,则最后一个参数必须为false

答案 7 :(得分:-1)

圆形可以使用着色器绘制 - 如果它在距离中心的半径上,则绘制像素。