Unity 3dで円を描く方法は?さまざまなオブジェクトの周りに円を描きたい。円の半径は異なり、円にはテクスチャ-正方形があります。
このコードで大きなエラーを見つけました。ポイントの数(サイズ)は「(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.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で割った「サイズ」の数値を変更すると、抜本的なゲージ/円グラフタイプのグラフィックを作成できます。
nity 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は少し恐ろしいと思います。
最後に、最初のリンクと同様に、ユニットプレーンに円形テクスチャをアタッチできます。円の一部ではないテクスチャの一部を透明にします。次に、オブジェクトに合わせて平面を拡大縮小して調整します。残念ながら、この方法は、誰かが飛行機とほぼ平行に見える場合、あまり良くありません。
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);
}
}
}
shader があり、そこから通常はレンズフレアのようなエフェクトを作成し始め、円を描きます。完全に滑らかで丸い円になるので、シェーダーを使用するのが最適です。
また、シェーダーを変更しても再生モードを再コンパイルおよび再入力する必要がないため、シェーダーを試して調整するのは簡単です。
円はシェーダーを使用して描画できます-中心から半径上にある場合はピクセルを描画します。
GameObjectにtp create拡張メソッドをお勧めします。私にとってはうまくいきました。
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でなければなりません