web-dev-qa-db-fra.com

Comment dessiner un cercle dans Unity3D?

Comment dessiner un cercle dans Unity 3D?.

11
Oksana

J'ai trouvé une grosse erreur avec ce code. Le nombre de points (taille) ne devrait pas être "(2 * pi/theta_scale) + 1", car le cercle sera tracé 6,28 fois. La taille doit être "1/theta_scale + 1". Donc, pour une échelle thêta de 0,01, il doit dessiner 100 points et pour une échelle thêta de 0,1, il doit en tirer 10. Sinon, il tirerait 62 fois et 628 fois respectivement . Voici le code que j'ai utilisé.

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));
        }
    }
}

Si vous modifiez le nombre dans "Taille" divisé par ThetaScale, vous pouvez créer un graphique de type jauge/graphique à secteurs.

12
MrMike

Voir Unity Answers pour une question similaire.

Alternativement :

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 nécessite des points continus. Vous pouvez modifier légèrement ce code pour utiliser des objets de jeu cylindre au lieu d'un rendu de ligne. Je trouve le LineRenderer un peu hideux. 

Enfin, comme pour le premier lien, vous pouvez associer une texture de cercle à un plan unitaire. Rendez toute partie de la texture qui ne fait pas partie du cercle transparente. Il vous suffit ensuite de mettre à l'échelle et d'aligner le plan pour l'adapter à votre objet. Malheureusement, cette méthode n’est pas intéressante si quelqu'un regarde presque parallèlement à l’avion.

8
Jerdak

La solution de Jerdak est bonne, mais le code est en désordre alors j'ai dû modifier un peu. Voici le code d'une classe, où j'utilise i dans la boucle pour éviter un bogue.

Il met également à jour la position du cercle avec sa position 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

Est-ce que la suite avec un Sprite. Chan vole dans la scène, elle est donc légèrement au-dessus de l'avion. Je l'avais fait voler pour que je puisse faire une bonne capture d'écran, pas parce que ça ne jouerait pas bien avec l'avion.

J'ai utilisé un cercle à basse résolution Sprite . X rotation 90 Échelle X 15, Y 15, Z 1

Ensuite, je règle le calque de tri pour qu'il s'affiche au-dessus du calque par défaut. Je testais cela quand je suis tombé sur ce post. Il ne gère pas bien les ombres. Je devrais déterminer sur quelles calques les ombres sont dessinées pour être sûr qu'elles soient rendues sur le Sprite.

 enter image description here

0
Chuck Savage

J'ai un shader à partir duquel je commence habituellement à faire des effets tels que des éclairages d'objectif, et cela forme un cercle. Utiliser le shader est le meilleur choix car vous obtiendrez un cercle parfaitement lisse et rond. 

En outre, il est facile d'expérimenter et d'ajuster le shader, car les changements de shader ne nécessitent pas de recompiler ni de rentrer dans le mode de lecture.

0
Iurii Selinnyi

En utilisant Shader Graph, nous pouvons maintenant dessiner un cercle parfait en pixels.

 Unlit Shader Graph

Une fois que vous avez créé ce graphique, créez un nouveau matériau basé sur ce shader.

 result

Créez ensuite un nouvel objet de jeu avec un moteur de rendu Sprite et définissez le matériau que vous venez de créer.

Vous pouvez redimensionner le cercle en utilisant le paramètre "scale" du matériau.

0
Snowirbis

Circle peut dessiner à l’aide de shader - dessinez le pixel s’il se situe sur le rayon du centre.

0
Oksana