2012-12-04 8 views
8

यूनिटी 3 डी में सर्कल कैसे आकर्षित करें? मैं विभिन्न ऑब्जेक्ट के चारों ओर सर्कल खींचना चाहता हूं। मंडलियों के त्रिज्या अलग हैं और सर्कल में बनावट है - वर्ग।मैं यूनिटी 3 डी में एक सर्कल कैसे आकर्षित कर सकता हूं?

उत्तर

7

See Unity Answers इसी तरह के प्रश्न के लिए।

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 निरंतर अंक की आवश्यकता है। आप इस कोड को लाइन रेंडरर के बजाय सिलेंडर गेम ऑब्जेक्ट्स का उपयोग करने के लिए थोड़ा संशोधित कर सकते हैं। मुझे लाइन रेन्डरर थोड़ा घृणित लगता है।

आखिरकार, पहले लिंक के समान, आप एक इकाई विमान में एक सर्कल बनावट संलग्न कर सकते हैं। उस बनावट का कोई भी हिस्सा बनाएं जो सर्कल पारदर्शी का हिस्सा न हो। फिर बस अपनी वस्तु को फिट करने के लिए विमान को स्केल करें और संरेखित करें। दुर्भाग्य से यदि कोई विमान विमान के समानांतर दिख रहा है तो यह विधि बहुत अच्छी नहीं है।

0

मंडल शेड-ड्रॉ पिक्सेल का उपयोग कर आकर्षित कर सकता है यदि यह केंद्र से त्रिज्या पर है।

2

जेरडैक का समाधान अच्छा है, लेकिन कोड गन्दा है इसलिए मुझे थोड़ा बदलाव करना पड़ा। यहां एक वर्ग के लिए कोड है, जहां मैं एक बग से बचने के लिए लूप में उपयोग करता हूं।

यह सर्कल की स्थिति को इसके गेम ऑब्जेक्ट स्थिति के साथ भी अपडेट करता है।

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

मुझे इस कोड के साथ एक बड़ी त्रुटि मिली। अंक (आकार) की संख्या "(2 * पीआई/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 से विभाजित है संख्या को संशोधित हैं, तो आप एक व्यापक गेज/पाई चार्ट प्रकार ग्राफिक बना सकते हैं।

+2

यह सही जवाब होना चाहिए। हालांकि, कृपया ध्यान दें कि एक अपूर्ण रेखा के लिए, आपको इसके बजाय यह करना चाहिए: 'आकार = (int) ((1f/thetaScale) + 2f) ' –

0

एक स्प्राइट के साथ निम्नलिखित किया था। चैन दृश्य में उड़ रहा है, इसलिए वह विमान से थोड़ा ऊपर है। मैंने उसे उड़ान भर दी थी इसलिए मुझे एक अच्छा स्क्रीनशॉट मिल सकता था, क्योंकि यह विमान के साथ अच्छा नहीं खेलेंगे।

मैंने कम-रिज़ॉल्यूशन सर्कल स्प्राइट का उपयोग किया। एक्स रोटेशन 90 स्केल एक्स 15, वाई 15, जेड 1

फिर मैंने सॉर्टिंग लेयर सेट किया है, इसलिए यह डिफ़ॉल्ट परत से ऊपर प्रस्तुत करेगा। जब मैं इस पोस्ट में आया तो मैं इसका परीक्षण कर रहा था। यह छाया को अच्छी तरह से संभाल नहीं करता है। मुझे यह पता लगाना होगा कि स्प्रिट पर रेंडर करने के लिए यह सुनिश्चित करने के लिए कि कौन सी परत छाया तैयार की जाती है। क्योंकि @ Jerdak के कोड इतने सारे अनावश्यक लाइनें खींचता है, लेकिन इस कोड को सिर्फ एक बार के माध्यम से गुजरता है और एक भी पास में प्रत्येक कोने ड्रॉ

enter image description here

संबंधित मुद्दे