निरीक्षक में कोड (निजी-जैसे) के माध्यम से निरीक्षक में एक क्षेत्र को कैसे दिखाई (अटैच) किया जा सकता है?


9

मान लीजिए कि मेरे पास एक चर नाम buttonहै Buttonजो निश्चित रूप से है System.Serializable

मैं चाहता हूं कि वह निरीक्षक के माध्यम से परिवर्तनशील हो, इसलिए मैं इसे बनाता हूं public:

public class SomeScript : MonoBehaviour{
    public Button button;
}

जो मुझे देता है:

यहाँ छवि विवरण दर्ज करें

अब, मैं कोड को साफ और सुरक्षित (व्यवस्थित) रखना चाहता हूं और एक वास्तविक कारण है कि मुझे इनकैप्सुलेशन को संरक्षित करने की आवश्यकता है।

मुझे पता है कि रनटाइम पर घटकों को पुनः प्राप्त करने के कई तरीके हैं जैसे कि transform.Find("Some/Genius/TypeUnsafe/Path")या GameObject.Find("3 seconds scene iteration").GetComponent(...).मैं उससे बचना चाहता हूं।

मैं निरीक्षक में private accessइसके साथ एक चर कैसे public accessमिलाऊं?


आप इस क्षेत्र को "सुरक्षित" क्यों बनाना चाहते हैं? ध्यान दें कि मैंने इसे उद्धरणों में रखा है, क्योंकि यदि कोड क्लाइंट मशीन पर चलता है, तो ग्राहक इसके साथ जो चाहे कर सकते हैं। privateकिसी तीसरे पक्ष को किसी क्षेत्र में पहुंचने से रोकने के लिए वास्तव में इरादा नहीं है, यह कहने का एक तरीका है कि "मैं वास्तव में क्या कर रहा हूं, पर्दे के पीछे मत देखो" - यह ज्यादातर एक तरीका है आप उस तक पहुँच प्राप्त करने से रहें ।
क्लॉकवर्क-

हाँ, मुझे पता है कि क्या encapsulation के लिए है! : डि कुछ की तरह निर्माण UI/ API MVC/ MVVMएक विशाल आवेदन के लिए पैटर्न (वास्तव में एक खेल ग्राहक) और मैं अलग करने के लिए किया था UIसे API। मुझे इंस्पेक्टर कारण के माध्यम से मान निर्दिष्ट करने की आवश्यकता थी - कोई अन्य तरीका नहीं है। Find()विधियां असुरक्षित हैं, और चीजों को एक साथ खींचकर और गिराकर आसान है। यह वास्तव में, क्लासिक, ओओपी ढांचे के निर्माण के लिए वास्तव में कठिन है Unityऔर आपको इस तरह की हैकिंग चीजों की तलाश करनी होगी।
याकूब

ध्यान रखें कि निजी अन्य लिपियों से चर को सुरक्षित नहीं रखता है। आप कैब akways प्रतिबिंब या कुछ सूचक चाल के साथ इसे तक पहुँचने
Bálint

जवाबों:


19

आप SerializeField विशेषता के लिए देख रहे हैं

डॉक्स से:

एक निजी क्षेत्र को क्रमबद्ध करने के लिए फोर्स यूनिटी।

आपको लगभग इसकी कभी आवश्यकता नहीं होगी। जब एकता आपकी लिपियों को क्रमबद्ध करती है, तो यह केवल सार्वजनिक क्षेत्रों को क्रमबद्ध करेगी। अगर इसके अलावा आप भी चाहते हैं कि एकता आपके निजी क्षेत्रों में से एक को क्रमबद्ध करें तो आप क्षेत्र में SerializeField विशेषता जोड़ सकते हैं।

आपका कोड इस तरह दिखेगा:

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
पठनीयता के लिए मैं आम तौर पर एक पंक्ति में यह सब लिखता [SerializeField] private Button button; हूं : मुझे लगता है कि जब एक पंक्ति में खेतों का एक गुच्छा होता है तो स्कैन करना आसान होता है। इसके अलावा, "आपको लगभग कभी भी इसकी आवश्यकता नहीं होगी" के लिए डॉक्स स्क्रू करें; मैं हर समय यह पूरी तरह से करता हूं।
झॉकिंग

1

आप चर से पहले SerializeField विशेषता जोड़कर अपने निजी चर दिखा सकते हैं । कुछ इस तरह

[SerializeField]
private Button button;

उपरोक्त चर आपके निरीक्षक को प्रदर्शित किया जाएगा लेकिन आपके अन्य वर्ग इसे प्राप्त करने में असमर्थ होंगे। इसके विपरीत आप HideInInspector विशेषता के माध्यम से इंस्पेक्टर में दायर अपनी जनता को भी छिपा सकते हैं । कुछ इस तरह

[HideInInspector]
public Button button;

आपका उपरोक्त चर आपकी अन्य लिपि द्वारा सुलभ होगा, लेकिन यह निरीक्षक को प्रदर्शित नहीं किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.