Как я могу нарисовать круг в Unity3D?

Как нарисовать круг в Unity 3d? Я хочу нарисовать круг вокруг разных объектов. Радиусы кругов различны, а круги имеют текстуры - квадраты.

Ответ 1

Я нашел большую ошибку с этим кодом. Количество точек (размер) не должно быть "(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));
        }
    }
}

Если вы измените номер в "Размер", который разделен на ThetaScale, вы можете сделать графический тип с широким показателем/круговой диаграммой.

Ответ 2

См. ответы Unity на похожий вопрос.

В качестве альтернативы:

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 немного отвратительным.

Наконец, подобно первой ссылке, вы можете прикрепить текстуру круга к единичной плоскости. Сделайте любую часть текстуры, которая не является частью круга, прозрачной. Затем просто масштабируйте и выравнивайте плоскость в соответствии с вашим объектом. К сожалению, этот метод не очень хорош, если кто-то смотрит почти параллельно плоскости.

Ответ 3

Решение Jerdak хорошее, но код грязный, поэтому мне пришлось немного подправить. Вот код для класса, где я использую я в цикле, чтобы избежать ошибки.

Он также обновляет положение круга с помощью позиции 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);
    }
  }
}

Ответ 4

Используя Shader Graph, мы можем нарисовать идеальный круг пикселей.

Unlit Shader Graph

Создав этот график, создайте новый материал на основе этого шейдера.

result

Затем создайте новый игровой объект со средством визуализации спрайтов и установите материал, который вы только что создали.

Вы можете масштабировать круг, используя параметр "scale" материала.

Ответ 5

С помощью спрайта было выполнено следующее. Чан летит на сцену, поэтому она чуть выше самолета. У меня была ее полет, поэтому я мог бы получить хороший снимок экрана, а не потому, что он плохо играл бы с самолетом.

Я использовал круговой спрайт с низким разрешением. X поворот 90 Масштаб X 15, Y 15, Z 1

Затем я устанавливаю Сортировочный слой, поэтому он будет отображаться над уровнем по умолчанию. Я тестировал это, когда столкнулся с этим сообщением. Он отлично справляется с тенями. Я должен был бы выяснить, какие тени слоя нарисованы, чтобы убедиться, что они окажутся на спрайте.

введите описание изображения здесь

Ответ 6

У меня есть шейдер, из которого я обычно начинаю создавать такие эффекты, как блики на объективе, и он образует круг. Использование шейдеров - лучший выбор, потому что вы получите идеально ровный и круглый круг.

Также легко экспериментировать и настраивать шейдер, так как изменения шейдера не требуют перекомпиляции и повторного входа в режим воспроизведения.

Ответ 7

Я рекомендую создать метод расширения для 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

Ответ 8

Круг может рисовать, используя пиксель рисования шейдера, если он находится по радиусу от центра.