2017-10-05 12 views
7

मैं खेल वस्तु की तरह एक अर्धवृत्त जो मैं एक खाली खेल वस्तु (SCircle) में दो चाप डालने और 15 ° (बाएं के लिए घूर्णन द्वारा बनाई गई है का उपयोग कर एक खास कोण के लिए एक बच्चे वस्तु घूर्णन, जबकि एक पैरेंट ऑब्जेक्ट को घुमाने के लिए आर्क) और -15 डिग्री (दाएं चाप के लिए) जैसा कि नीचे देखा गया है।कैसे coroutines

enter image description here

SCircle दो मानों Left और Right (SCircle -45 ° करने के लिए घूमता है) नीचे चित्र में दिखाए के रूप में (45 ° SCircle घूमता है) के साथ एक Orientation enum है।

enter image description here

मैं निम्नलिखित coroutine का उपयोग झुकाव के बीच SCircle स्थानांतरित करने के लिए।

IEnumerator RotateArc(GameObject arcGO, Vector3 byAngles, float inTime) 
{ 
    Quaternion fromAngle = arcGO.transform.rotation ; 
    Quaternion toAngle = Quaternion.Euler (arcGO.transform.eulerAngles); 

    if (rightArc.arcOrientation == Arc.Orientation.Down) { 
     toAngle = Quaternion.Euler (arcGO.transform.eulerAngles + byAngles); 
     rightArc.arcOrientation = Arc.Orientation.Up; 

    } 
    else if (rightArc.arcOrientation == Arc.Orientation.Down) { 

     toAngle = Quaternion.Euler (arcGO.transform.eulerAngles - byAngles); 
     rightArc.arcOrientation = Arc.Orientation.Up; 
    } 


    for(float t = 0f ; t <= 1f ; t += Time.deltaTime/inTime) 
    { 
     arcGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t) ; 
     yield return null ; 

    } 
    arcGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, 1); 

} 

enter image description here:

IEnumerator RotateLeftOrRight(Vector3 byAngles, float inTime) 
{ 
    Quaternion fromAngle = gameObject.transform.rotation ; 
    Quaternion toAngle = Quaternion.Euler (transform.eulerAngles); 


    if (circOrientation == Orientation.Left) { 
     toAngle = Quaternion.Euler (gameObject.transform.eulerAngles - byAngles); 
     circOrientation = Orientation.Right; 

    } 
    else if (circOrientation == Orientation.Right) { 

     toAngle = Quaternion.Euler (gameObject.transform.eulerAngles + byAngles); 
     circOrientation = Orientation.Left; 
    } 


    for(float t = 0f ; t <= 1f ; t += Time.deltaTime/inTime) 
    { 
     gameObject.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t) ; 
     yield return null ; 

    } 
    gameObject.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, 1); 
} 

मैं भी एक बहुत समान coroutine व्यक्ति आर्क्स कहते से, अभिविन्यास Left (विपरीत दिशाओं में) 30 डिग्री से स्थानांतरित करने के लिए, के रूप में coroutine और छवि में नीचे देखा इस्तेमाल किया

के बाद से SCircle coroutine एक माउस क्लिक द्वारा सक्रिय होता है, मैं इस मामले में जहां व्यक्ति आर्क्स coroutine चलाया जाता है है और इससे पहले कि यह पूरा हो गया है माता पिता SCircle coroutine है भी दौड़ो इस मामले में arcs Left से ए तक बढ़ते हैं, जो मुझे आवश्यक व्यवहार नहीं है। मैं Left से आगे बढ़ते समय बी पर समाप्त होने का व्यवहार करना चाहता हूं। इसी तरह, बी से, जब SCircle coroutine चलाया जाता है, जबकि आर्क्स coroutine का कार्य प्रगति पर उन्मुखीकरण Left वापस आ जाएगी है।

कृपया ध्यान दें कि नीला तीर बाएं आर्क के आंदोलन का प्रतिनिधित्व करता है, लाल सही आर्क का प्रतिनिधित्व करता है और काला SCircle - मूल वस्तु का आंदोलन दर्शाता है।

enter image description here

+1

बस यह सुनिश्चित करने के लिए, आप एक ही समय में इन दो आर्कों को स्थानांतरित करना चाहते हैं लेकिन अलग-अलग दिशा में और आप भी एक ही समय में आंदोलन को समाप्त करना चाहते हैं? यदि हां, तो कौन सा ऑब्जेक्ट दूसरे का माता पिता है? – Programmer

+0

@ प्रोग्रामर 'स्कीर्कल' मूल वस्तु है, जो एक खाली ऑब्जेक्ट से बनाई गई है जिसमें बाएं और दाएं आर्क दोनों शामिल हैं। मैं नहीं चाहता कि आंदोलन एक ही समय में समाप्त हो क्योंकि बच्चे की चाप के घूर्णन कोरआउटिन माता-पिता 'स्कीर्कल' के घूर्णन कोरआउटिन से पहले शुरू होता है। इसलिए बच्चे arcs रोटेशन माता पिता के सामने खत्म होना चाहिए। बस उस समय एक बिंदु होगा जब दोनों कोरआउट एक साथ चल रहे हैं। आम तौर पर प्रत्येक कोरआउट को इसके समय के लिए होना चाहिए। – Bane

+0

कृपया हमें आर्क्स को 30 डिग्री से घूर्णन करने के लिए कोड दिखाएं। क्या आप किसी भी मौके से स्थानीय रोटेशन की जगह आर्क्स रोटेशन सेट कर रहे हैं? – lockstock

उत्तर

0

मेरा मानना ​​है कि आपको आ रही समस्या तथ्य यह है कि के रूप में आप अलग-अलग आर्क्स घुमाने के लिए, कि वे क्या कर रहे हैं के चारों और घूमती भी अपने आप में घूर्णन कर रहा है के कारण होता है।

दूसरे शब्दों में, अपने SCircle की कुल्हाड़ियों घूम रहे हैं, और अपने आर्क्स उन्हीं कुल्हाड़ियों का उपयोग कर रहे अपने स्वयं के रोटेशन निर्धारित करने के लिए। तो यदि आप अपना उदाहरण ए देखते हैं, तो आप इसे 0 9 0 तक विश्व अंतरिक्ष में घूमने के लिए कहते हैं, फिर तुरंत 30 सेकंड तक घूमने के लिए कहें। इसे हल करने के लिए, आप स्थानीय अंतरिक्ष में नहीं, स्थानीय स्तर पर घूमने के लिए आर्क को प्राप्त करना चाहते हैं ।

मुझे लगता है कि आप इस संरचना की स्थापना करके इस का समाधान कर सकते हैं:

खाली GameObject SCircle

------ खाली gameObject BlueArcCenter -> स्थिति 0,0,0

- --------- नीली चाप -> इसे शून्य से ऑफसेट करने के लिए यहां स्थिति बदलें: (त्रिज्या, 0, 0)

------ खाली गेम ऑब्जेक्ट RedArcCenter -> स्थिति (0, 0,0)

----------- लाल चाप -> यहाँ परिवर्तन की स्थिति बनाने के लिए यह शून्य पूर्व से ऑफ़सेट: (- त्रिज्या, 0, 0)

अब आप अपने कोड में कोई बदलाव ताकि:

नीले और लाल चापों को अलग-अलग घुमाने के लिए आप अपने arcCenters,

पूरे कॉन्फ़िगरेशन को घुमाने के लिए, SCIRcle घुमाएं। यह बदले में आर्ककेंटर दोनों को घुमाएगा, जो बदले में दोनों चापों को घुमाएगा चाहे वे एक-दूसरे के सापेक्ष उन्मुख हों या फिर वे खुद को घुमा रहे हों या नहीं।

नोट: इसके अलावा, मुझे लगता है कि लोगों को Quaternions उपयोग कर रहे हैं बहुत कम इन दिनों के बाद से वे वास्तव में जब आप कोड को पढ़ने के लिए मतलब नहीं है पढ़ा है। आप इसे अधिक पठनीय बनाने के लिए अपने कोड को सामान्य रोटेशन में बदलना चाहेंगे।

आप सेटअप ऊपर सूचीबद्ध किया है, की तरह कुछ का उपयोग करें:

thisSCircle.transform.Rotate(0, -90, 0, Space.Self); 

उनके आम केंद्र के चारों ओर आर्क्स को घुमाने के लिए:

blueArcCenter.transform.Rotate(0, -30, 0, Space.Self) 
redArcCemter.transform.Rotate(0, 30, 0, Space.Self) 

(आप चाहते

चक्र स्पिन लेपस और सामान जोड़ने की जरूरत है लेकिन यह आपको शुरू करना चाहिए)।

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