17

如何在 Unity 3d 中画圆?我想在不同的物体周围画一个圆圈。圆的半径不同,圆有纹理——正方形。

4

9 回答 9

16

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

using UnityEngine;
using System.Collections;

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

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

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

如果修改“Size”中除以 ThetaScale 的数字,则可以制作一个扫描量规/饼图类型的图形。

于 2015-08-02T01:18:31.817 回答
10

有关类似问题,请参阅 Unity Answers 。

或者

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 有点可怕。

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

于 2012-12-04T20:18:32.817 回答
5

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

它还使用其游戏对象位置更新圆的位置。

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);
    }
  }
}
于 2015-05-25T15:13:15.443 回答
3

使用 Shader Graph 我们现在可以绘制像素完美的圆。

无光照着色器图

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

结果

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

您可以使用材质的“缩放”参数来缩放圆。

于 2018-10-05T01:40:02.543 回答
1

最佳答案中的 linerenderer 方法非常简单,正是我想要的。我针对较新版本的 Unity 进行了更新,并进行了一些小调整,以使其对初学者/用户更加友好。

具体来说:

  • LineRenderer.SetVertexCount()在较新版本的 Unity 中已弃用,替换为positionCount
  • 用实际段数替换 theta 比例以消除猜测
  • 添加循环设置 - 不确定这是否在旧版本的 Unity 中,它可以在LineRenderer's 检查器中设置
  • 删除了不必要Update的功能 - 渲染线是一个持久的游戏对象
using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class DrawRing : MonoBehaviour
{
    public LineRenderer lineRenderer;
    [Range(6,60)]   //creates a slider - more than 60 is hard to notice
    public int lineCount;       //more lines = smoother ring
    public float radius;
    public float width;

    void Start()
    {
        lineRenderer = GetComponent<LineRenderer>();
        lineRenderer.loop = true;
        Draw();
    }

    void Draw() //Only need to draw when something changes
    {
        lineRenderer.positionCount = lineCount;
        lineRenderer.startWidth = width;
        float theta = (2f * Mathf.PI) / lineCount;  //find radians per segment
        float angle = 0;
        for (int i = 0; i < lineCount; i++)
        {
            float x = radius * Mathf.Cos(angle);
            float y = radius * Mathf.Sin(angle);
            lineRenderer.SetPosition(i, new Vector3(x, 0, y));
            //switch 0 and y for 2D games
            angle += theta;
        }
    }
}

请注意,这假定附加到您想要环的游戏对象。因此,应取消选中该Use World Space选项。LineRenderer还要记住,游戏对象的比例会影响点的位置和线的宽度。

将其放在地面上(如在单位选择圈中):

  1. 将脚本放在单独的游戏对象上
  2. 将游戏对象 X 旋转到 90
  3. 检查use world space衬里渲染器
  4. 将 linerenderer 设置AlignmentTransform Z
  5. 将要圈出的事物的位置添加到xySetPosition。可能同时将 0 替换为0.1fyOffset变量以避免与地形发生 z-fighting。
于 2022-01-11T19:31:17.290 回答
0

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

于 2015-02-25T07:15:32.170 回答
0

我建议为 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);
    }
}

还有一点需要注意:如果LineRenderer未应用组件,则必须使用最后一个参数false

于 2019-09-22T15:25:18.047 回答
0

我有一个着色器,我通常从它开始制作镜头光晕之类的效果,它会制作一个圆圈。使用着色器是最好的选择,因为你会得到完美平滑的圆形。

此外,由于着色器更改不需要重新编译和重新进入播放模式,因此很容易试验和调整着色器。

于 2018-10-14T19:12:04.933 回答
0

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

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

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

在此处输入图像描述

于 2016-10-01T06:27:04.987 回答