Как нарисовать круг в Unity 3d? Я хочу нарисовать круг вокруг разных объектов. Радиусы кругов различны, а круги имеют текстуры - квадраты.
Как я могу нарисовать круг в Unity3D?
Ответ 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, мы можем нарисовать идеальный круг пикселей.
Создав этот график, создайте новый материал на основе этого шейдера.
Затем создайте новый игровой объект со средством визуализации спрайтов и установите материал, который вы только что создали.
Вы можете масштабировать круг, используя параметр "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
Круг может рисовать, используя пиксель рисования шейдера, если он находится по радиусу от центра.