web-dev-qa-db-ja.com

Unity3Dで円を描くにはどうすればよいですか?

Unity 3dで円を描く方法は?さまざまなオブジェクトの周りに円を描きたい。円の半径は異なり、円にはテクスチャ-正方形があります。

13
Oksana

このコードで大きなエラーを見つけました。ポイントの数(サイズ)は「(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で割った「サイズ」の数値を変更すると、抜本的なゲージ/円グラフタイプのグラフィックを作成できます。

13
MrMike

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は少し恐ろしいと思います。

最後に、最初のリンクと同様に、ユニットプレーンに円形テクスチャをアタッチできます。円の一部ではないテクスチャの一部を透明にします。次に、オブジェクトに合わせて平面を拡大縮小して調整します。残念ながら、この方法は、誰かが飛行機とほぼ平行に見える場合、あまり良くありません。

9
Jerdak

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
Jonathan Larkin

シェーダーグラフを使用して、ピクセルの完全な円を描画できるようになりました。

Unlit Shader Graph

このグラフを作成したら、このシェーダーに基づいて新しいマテリアルを作成します。

result

次に、Spriteレンダラーで新しいゲームオブジェクトを作成し、作成したばかりのマテリアルを設定します。

マテリアルの「スケール」パラメータを使用して、円をスケールできます。

1
Snowirbis

以下をスプライトで行いました。ちゃんはシーンを飛んでいるので、飛行機の少し上にいます。彼女が飛んでいたので、良いスクリーンショットを撮ることができました。飛行機とうまく合わないからではありません。

低解像度の円スプライトを使用しました。 X回転90スケールX 15、Y 15、Z 1

次に、並べ替えレイヤーを設定し、デフォルトレイヤーの上にレンダリングします。この投稿に出会ったとき、私はこれをテストしていました。影をうまく処理しません。 Spriteにレンダリングされるようにするには、どのレイヤーシャドウが描画されているかを把握する必要があります。

enter image description here

0
Chuck Savage

shader があり、そこから通常はレンズフレアのようなエフェクトを作成し始め、円を描きます。完全に滑らかで丸い円になるので、シェーダーを使用するのが最適です。

また、シェーダーを変更しても再生モードを再コンパイルおよび再入力する必要がないため、シェーダーを試して調整するのは簡単です。

0
Iurii Selinnyi

円はシェーダーを使用して描画できます-中心から半径上にある場合はピクセルを描画します。

0
Oksana

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でなければなりません