2012-12-04 12 views

Odpowiedz

7

See Unity Answers za podobne pytanie.

Alternatively:

float theta_scale = 0.1;    //Set lower to add more points 
int size = (2.0 * PI)/theta_scale; //Total number of points in circle. 

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 += 0.1) { 
    x = r*cos(theta); 
    y = r*sin(theta); 

    Vector3 pos = new Vector3(x, y, 0); 
    lineRenderer.SetPosition(i, pos); 
    i+=1; 
} 

LineRenderer wymaga ciągłych punktów. Możesz nieznacznie zmodyfikować ten kod, aby użyć obiektów gier cylindrowych zamiast renderera liniowego. Uważam, że LineRenderer jest trochę odrażający.

Wreszcie, podobnie jak przy pierwszym łączu, można dołączyć teksturę koła do płaszczyzny jednostki. Niech jakakolwiek część tekstury, która nie jest częścią koła, będzie przezroczysta. Następnie przeskaluj i wyrównaj płaszczyznę, aby pasowała do twojego obiektu. Niestety ta metoda nie jest świetna, jeśli ktoś wygląda prawie równolegle do samolotu.

0

Okrąg można rysować za pomocą modułu cieniującego - narysuj piksel, jeśli jest on w promieniu od środka.

2

Rozwiązanie firmy Jerdak jest dobre, ale kod jest brudny, więc musiałem trochę poprawić. Oto kod dla klasy, w której używam i w pętli, aby uniknąć błędu.

Uaktualnia także pozycję koła z pozycją 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); 
    } 
    } 
} 
9

Znalazłem duży błąd z tym kodem. Liczba punktów (rozmiar) nie powinna wynosić "(2 * pi/theta_scale) + 1", ponieważ powoduje to, że okrąg rysuje się 6,28 razy. Rozmiar powinien wynosić "1/theta_scale + 1". Tak więc dla theta_scale wynoszącego 0,01 musi on narysować 100 punktów, a dla theta_scale 0.1 musi pobrać 10 punktów. W przeciwnym razie wynosiłoby to 62 razy i 628 razy, odpowiednio. Oto kod, którego użyłem.

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

Jeśli zmodyfikować numer w „Format”, która jest podzielona przez ThetaScale, można dokonać zamiatanie miernik/pie typu wykres graficzny.

+2

ta powinna być prawidłowa odpowiedź, ponieważ kod @ Jerdak czerpie tyle niepotrzebnych linii, ale ten kod tylko raz przechodzi przez każdy kąt i rysuje w jednym przejściu. Trzeba jednak pamiętać, że dla linii imperforate powinieneś zrobić to zamiast: 'Size = (int) ((1f/ThetaScale) + 2f)' –

0

Wykonano następujące czynności przy użyciu Sprite. Chan leci na scenie, więc znajduje się nieco ponad samolotem. Miałem ją latać, więc mogłem uzyskać dobry zrzut ekranu, nie dlatego, że nie grałoby dobrze z samolotem.

Użyłem sprite okręgu niskiej rozdzielczości. Obrót X 90 Skala X 15, Y 15, Z 1

Następnie ustawiam warstwę sortowania, aby była renderowana powyżej domyślnej warstwy. Testowałem to, kiedy natknąłem się na ten post. Nie radzi sobie dobrze z cieniami. Musiałbym dowiedzieć się, na czym polegają cienie warstw, aby upewnić się, że są one renderowane na ikonce.

enter image description here

Powiązane problemy