2016-03-02 5 views
30

मैं गेम में एक विधि कॉल करने के लिए InvokeRepeating() का उपयोग कर रहा हूं। कक्षाओं में से एक की Start() विधि में मैं InvokeRepeating() पर कॉल करता हूं। InvokeRepeating() के लिए repeatRate पैरामीटर सेट करने के लिए, मैं यह एक सार्वजनिक क्षेत्र secondsBetweenBombDrops बुलाया गुजर रहा हूँ।एकता गैर-स्थैतिक सार्वजनिक क्षेत्र के प्रारंभिक मूल्य को अनदेखा क्यों कर रही है?

एकता मूल्य मैं कोड में secondsBetweenBombDrops के लिए निर्दिष्ट पर ध्यान नहीं देता है और बदले में कुछ डिफ़ॉल्ट मान का उपयोग करता है (यानी 1) जब secondsBetweenBombDrops एक स्थिर आपरिवर्तक के बिना घोषित किया जाता है:

public float secondsBetweenBombDrops = 10f; 
void Start() { 
    InvokeRepeating("DropBomb", 1f, secondsBetweenBombDrops); 
} 

हालांकि, एक बार मैं करने के लिए static संशोधक जोड़ने

public static float secondsBetweenBombDrops = 10f; 
void Start() { 
    InvokeRepeating("DropBomb", 1f, secondsBetweenBombDrops); 
} 

क्यों इस क्षेत्र को उचित मान का उपयोग करने के static संशोधक की आवश्यकता होती है: secondsBetweenBombDrops, कोड की उम्मीद है और 10 का सही मूल्य प्रयोग किया जाता है के रूप में व्यवहार?

यूनिटी इंस्पेक्टर में, स्क्रिप्ट घटक दिखाता है कि secondsBetweenBombDrops 1 है। यह डिफ़ॉल्ट मान 1 मौजूद है, भले ही मैं खेल शुरू होने पर प्रीफैब को चालू करता हूं या गेम चल रहा है, तो प्रीफैब उदाहरण बना देता हूं।

उत्तर

29

क्रमबद्धता की दो धार की तलवार

एकता हर किसी के लिए चीजों को आसान बनाने के लिए, सीमित कोडिंग ज्ञान (शुरुआती, डिजाइनरों) के साथ लोगों सहित चाहता है।

तो उनकी सहायता करने के लिए, एकता निरीक्षक में डेटा प्रदर्शित करता है। यह कोडर को कोड और डिज़ाइनर को मोनो डेवेल/आईडीई खोलने के बिना मूल्यों को ट्वीक करके डिज़ाइन करने की अनुमति देता है।

public int myVar = 10; 
[SerializeField] private int myOtherVar = 0; // Can also be protected 

दूसरा एक बेहतर है, क्योंकि यह कैप्सूलीकरण सिद्धांत का अनुपालन है (चर निजी/संरक्षित और तरीकों या गुण के माध्यम से संशोधित कर रहे हैं):

वहाँ निरीक्षक में मूल्यों प्रदर्शन के लिए दो तरीके हैं।

जब आप संपादक में एक चर प्रदर्शित करते हैं, स्क्रिप्ट में दिए गए मूल्य केवल जब स्क्रिप्ट खींच प्रयोग किया जाता है। एकता फिर उन मूल्यों को क्रमबद्ध करती है और अब किसी भी स्क्रिप्ट संशोधन की परवाह नहीं करती है। इससे भ्रम पैदा हो सकता है, उदाहरण के लिए, myVar इस तथ्य के बाद स्क्रिप्ट के अंदर 20 पर सेट है, इसका उपयोग नहीं किया जाएगा। Serialization दृश्य फ़ाइल में लिखा है। उदाहरण में

दो पंक्तियों उसी तरह से वास्तव में काम करते हैं।

संभावित समाधान

यह संभव है स्क्रिप्ट घटक की सेटिंग पहिया पर रीसेट दबाने से एक स्क्रिप्ट में नया मान विचार करने के लिए एकता प्राप्त करने के लिए। इससे घटक के सभी अन्य चर भी रीसेट हो जाएंगे, इसलिए इसका उद्देश्य केवल तभी करें।

परिवर्तनीय निजी बनाना और विशेषता को छोड़ना [SerializeField] क्रमबद्ध प्रक्रिया को अक्षम कर देगा, इसलिए यूनिटी अब प्रदर्शित करने के लिए दृश्य फ़ाइल में दिखाई नहीं देगी - इसके बजाय, मान को स्क्रिप्ट द्वारा रनटाइम पर बनाया जाएगा।

जब एकता के लिए एक घटक जोड़ने, घटक के प्रकार की एक नई वस्तु बन जाता है। प्रदर्शित किए गए मान उस ऑब्जेक्ट से क्रमबद्ध मान हैं।इस कारण से, केवल सदस्य मान प्रदर्शित किए जा सकते हैं और स्थैतिक चर नहीं हैं, क्योंकि वे क्रमिक नहीं हैं। (यह एक नेट विनिर्देश, सख्ती से एकता के लिए विशिष्ट नहीं है।) क्योंकि Unity does not serialize static fields, इस कारण static संशोधक जोड़ने समस्या को हल करने लग रहा था।

ओपी की व्याख्या

ओपी मामले में, टिप्पणी के आधार पर, आपकी सार्वजनिक क्षेत्र संपादक में 1 का मान रहा था। आपने सोचा था कि यह मान एक डिफ़ॉल्ट था, जब वास्तव में वह मूल्य था जो मूल रूप से इसे घोषित करते समय फ़ील्ड को दिया जाता था। के बाद आप एक घटक के रूप स्क्रिप्ट जोड़ा, तो आप मान को 10 कर दिया और सोचा कि यह गाड़ी था के रूप में यह अभी भी 1. का मूल्य उपयोग कर रहा था अब आप तैयार किया गया है के रूप में, यह समझना चाहिए कि यह सिर्फ ठीक काम कर रहा था।

एकता क्या क्रमानुसार करता है?

डिफ़ॉल्ट रूप से, एकता को क्रमानुसार और प्रदर्शन मूल्य प्रकार (int, नाव, enum और इसी तरह) के साथ-साथ स्ट्रिंग, सरणी, सूची और MonoBehaviour होगा। (यह संपादक स्क्रिप्ट के साथ उनकी उपस्थिति को संशोधित करने के लिए संभव है, लेकिन इस विषय से हटकर है।)

निम्नलिखित:

public class NonMonoBehaviourClass{ 
    public int myVar; 
} 

डिफ़ॉल्ट रूप से धारावाहिक नहीं है। यहां फिर से, यह .NET विनिर्देश है। यूनिटी इंजन आवश्यकता के हिस्से के रूप में डिफ़ॉल्ट रूप से मोनोबेवियर को क्रमबद्ध करता है (यह सामग्री को दृश्य फ़ाइल में सहेज लेगा)। आप, संपादक में एक "क्लासिक" वर्ग प्रदर्शित करना चाहते हैं तो बस इतना कहते हैं:

public class MyScript:MonoBehaviour{ 
    public NonMonoBehaviourClass obj = new NonMonoBehaviourClass(); 
} 
:

[System.Serializable] 
public class NonMonoBehaviourClass{ 
    public int myVar = 10; 
} 

जाहिर है, आप एक MonoBehaviour भीतर उपयोग करने के लिए जरूरत है एक खेल वस्तु के लिए यह नहीं जोड़ सकते हैं

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

में चीजों को प्रदर्शित करने पर

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

तो तुम एक अंतरफलक की जरूरत है प्रदर्शित करने के लिए, आप के रूप में यह (बहु विरासत को छोड़कर) इसी तरह की सुविधा प्रदान करता है, लेकिन एक MonoBehaviour हो सकता है एक अमूर्त वर्ग पर विचार करना होगा।

संदर्भ:

http://docs.unity3d.com/ScriptReference/SerializeField.html

http://docs.unity3d.com/Manual/script-Serialization.html

https://www.youtube.com/watch?v=9gscwiS3xsU

https://www.youtube.com/watch?v=MmUT0ljrHNc

+0

इस सवाल का जवाब पूरी तरह से जोड़ने के लिए धन्यवाद!आशा है कि अगर आपको एक नोट जोड़ा गया है तो मुझे कोई फर्क नहीं पड़ता कि क्यों MsYvette 'स्थिर' के अतिरिक्त समस्या को ठीक करना प्रतीत होता है। – Serlite

+0

इस तरह के एक अच्छे जवाब लिखने के लिए समय लेने के लिए धन्यवाद! एक साइट जो हमें साइट पर चाहिए, भले ही हमें अंततः एक डुप्लिकेट लक्ष्य मिल जाए। –

+2

कोई भी अतिरिक्त/संशोधन स्वागत है। – Everts

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