2014-10-03 4 views
9

(यूनिटी 4.6.0b20 का उपयोग करना)एकता 4.6: रनटाइम पर जोड़े गए बटन उदाहरण संदर्भ समाधान द्वारा स्केल नहीं किए गए हैं?

मैंने एक समस्या आई है जहां संपादक में जोड़े जाने पर प्रीफैब बटन आकार सही तरीके से काम करता है लेकिन स्क्रिप्ट द्वारा जोड़े जाने पर संदर्भ समाधान को अनदेखा करता है।

यह संदर्भ संकल्प 1280x720 और MatchWidthOrHeight के साथ कैनवास का उपयोग करता है। कैनवास के बटन के लिए पैनल वर्टिकल लेआउट समूह है। बटन में पसंदीदा चौड़ाई/ऊंचाई है, और इसे प्रीफैब के रूप में सहेजा गया है इसलिए रनटाइम पर संपत्तियों से नए उदाहरण बनाए जा सकते हैं।

enter image description here

संपादक में मैं दृश्य करने के लिए पूर्वनिर्मित खींच सकते हैं पैनल जो भी चौड़ाई 102 है करने के लिए उदाहरणों को जोड़ने के लिए और वे ढेर और अच्छी तरह से बड़े पैमाने:

enter image description here

लेकिन जब बजाय मैं स्क्रिप्ट के माध्यम से प्रीफ़ैब के नए उदाहरण जोड़ें जो वे गलत आकार के साथ दिखाई देते हैं। आयामों को देखते हुए मेरा अनुमान 102 पिक्सेल आकार संदर्भ संकल्प द्वारा स्केल नहीं किया जा रहा है:

enter image description here

स्क्रिप्ट कोड() GameObject.Instantiate के माध्यम से उदाहरण बनाता है और बदलने की स्थापना द्वारा पैनल में जोड़ता है। माता-पिता:

GameObject uiInstance = (GameObject)GameObject.Instantiate(Resources.Load<GameObject>(assetPath)); 
uiInstance.transform.parent = unitButtonsPanel.transform; 

मुझे लगता है या तो वहाँ अधिक जब बस की स्थापना जनक से कक्ष में बटन जोड़ने किया जाना चाहिए कि है, या यह बीटा के साथ एक बग है ...

सुझाव?

+1

सुनिश्चित नहीं हैं कि मैं समझता हूँ कि तुम क्या मतलब है "जब यह निर्यात किया जाता है – mwk

+0

** अच्छी तरह से देखा ** - आप ठीक है, ठीक है। डिफ़ॉल्ट रूप से, जब आप इंस्टेंटिएट करते हैं, तो ** स्केलिंग शून्य पर ** शून्य पर डिफ़ॉल्ट रूप से डिफ़ॉल्ट होता है। एकता की तरफ से बेवकूफ रूप से बेवकूफ कदम - लेकिन फिर, यह एकता है। – Fattie

उत्तर

24

दूसरा पैरामीटर में झूठी गुजर विधि transform.SetParent का उपयोग करें:

transform.SetParent(transform, false); 

इस तरह आप दुनिया स्थिति को रोका जा सकता और स्केलिंग। आप "UICreateFromScripting" के लिए खोज कर, एकता मैनुअल में अधिक जानकारी प्राप्त कर सकते हैं।

+0

बेहतर जवाब, धन्यवाद! काश वे बीटा में रहते हुए उस मैनुअल था :) – mwk

+0

बहुत अच्छा समाधान racr - महान सामान। – Fattie

2

मुझे कारण मिला - जब प्रीफैब स्क्रिप्ट द्वारा जोड़ा जाता है तो स्केल मान गलत तरीके से सेट होते हैं; इस परीक्षण में स्केल 1.186284 पर सेट किया जा रहा था।

लेकिन अगर स्क्रिप्ट सेट तुरंत बटन जोड़ने के बाद 1.0 पैमाने:

GameObject uiInstance = (GameObject)GameObject.Instantiate(Resources.Load<GameObject>(assetPath)); 
uiInstance.transform.parent = unitButtonsPanel.transform; 
// HACK force scale to 1.0 
uiInstance.transform.localScale = Vector3.one; 

नया बटन उदाहरणों सही ढंग से आकार के होते हैं।

imho यह एकता बग है क्योंकि संपादक में प्रीफैब उदाहरण जोड़ना स्केल 1.0 सेट करता है, प्रीफैब के पास स्केल 1.0 है, इसलिए मुझे एक कारण नहीं दिख रहा है कि इसे स्क्रिप्ट से जोड़ने का तरीका अलग-अलग कार्य करना चाहिए। लेकिन मैं एक तरह से अनुमान लगा रहा हूँ वहाँ नए UI के लिए बहुत प्रलेखन अभी तक नहीं है के रूप में :)

+0

यहां उल्लेख करने लायक है क्योंकि मैंने अभी कुछ समय बिताया है इसी तरह की बग ... सुनिश्चित करें कि आपके सभी यूआई प्रीफैब्स स्केल हमेशा 1.0 पर सेट हो जाते हैं। अन्यथा एंकरिंग सही तरीके से काम नहीं कर पाती है। –

+0

यह एकता के पक्ष में अविश्वसनीय मूर्खतापूर्ण व्यवहार के रूप में इतना बड़ा नहीं है। racr0x ने टी प्रदान किया है वह समाधान के लिए, अच्छा एक। – Fattie

3

यह एक बग नहीं है, यह निष्पादन समस्या का एक आदेश है। यूनिटी के नए लेआउट घटकों का उपयोग करते समय मान लेआउट घटकों द्वारा संचालित होते हैं, जिन्हें फ्रेम के अंत में एक बार गणना की जाती है जिसे लेआउट पुनर्निर्माण कॉल किया जाता है। यदि आप नए रेक्ट ट्रान्सफॉर्म के स्क्रिप्ट से कुछ भी कर रहे हैं।रेक्ट गणना जो लेआउट तत्वों द्वारा संचालित होती हैं, आपको यह गणना तब तक प्रतीक्षा करनी होगी जब तक कि यह गणना नहीं की जाती है या

लेआउट रीब्यूल्डर। मार्कालेआउटफोर रेबुल्ड (रेक्टट्रांसफॉर्म के रूप में परिवर्तित) का उपयोग करके इसे स्वयं कॉल करने की आवश्यकता होगी;

आपको अभी भी फ्रेम की समाप्ति तक फ्रेम की समाप्ति तक इंतजार करना होगा, जो कि स्केल, पॉज़ इत्यादि जैसे किसी भी प्रकार का उपयोग करने से पहले होने वाली गणनाओं के लिए होता है। यह मुझे थोड़ी देर के लिए रुक गया था जब मैं पहली बार गतिशील रूप से यूआई बनाने शुरू करता था तत्वों और पैमाने पर शून्य था जब मैंने उन्हें तुरंत चालू किया।

आप उस के बारे में पढ़ सकते हैं पुनर्निर्माण कॉल और लेआउट calc सामान यहाँ के निष्पादन के आदेश: http://docs.unity3d.com/Manual/UIAutoLayout.html

+1

हालांकि यह जानकारी सही है, उत्तर केवल यह है कि आपको SetParent पर ", झूठी" तर्क का उपयोग करना याद रखना होगा। – Fattie

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