2015-05-18 7 views
5

मैं कई ट्यूटोरियल श्रृंखला के बाद किया गया है और इन दोनों बहुत समान तरीकों से किया देखा है, और उम्मीद कर रही थी किसी को, समझा सकता है कि वे किस तरह भिन्न हैं और यदि संभव हो तो, के उदाहरण जब आप दूसरे के बजाय एक का उपयोग करेंगे (मान लें कि वे वास्तव में समान हैं!)।GameObject.FindObjectOfType <>() बनाम GetComponent <>()

1.) GetComponent<T> एक घटक केवल अगर यह एक ही GameObject से जुड़ी है पाता है:

private LevelManager levelManager; 

void Start() { 
    levelManager = GameObject.FindObjectOfType<LevelManager>(); 
} 

और

private LevelManager levelManager; 

void Start() { 
    levelManager = GetComponent<LevelManager>(); 
} 

उत्तर

10

आप

void Start() { 
    levelManager = GameObject.FindObjectOfType<LevelManager>(); 
} 

है कि अक्सर उपयोग करने के लिए नहीं करना चाहती। हालांकि start

पर विशेष रूप से आपके प्रश्न का उत्तर करने के लिए निम्न दो कार्य वास्तव में बहुत समानता नहीं है। एक बाहरी कॉल है, दूसरा एक इंटीरियर है।
तो क्या फर्क है?

  1. GameObject.FindObjectOfType एक दृश्य विस्तृत खोज के अधिक है और एक जवाब प्राप्त करने की इष्टतम तरीका नहीं है। दरअसल, एकता ने सार्वजनिक रूप से कहा कि इसकी सुपर धीमी Unity3D API Reference - FindObjectOfType

  2. GetComponent<LevelManager>(); एक स्थानीय कॉल है। मतलब यह है कि जो भी फाइल इस कॉल को बना रही है वह केवल गेमऑब्जेक्ट को ही खोजेगी जो इसे संलग्न है। तो इंस्पेक्टर में, फ़ाइल केवल उसी इंस्पेक्टर विंडो में अन्य चीजें खोजेगी। जैसे कि मेश रेंडरर, मेष फ़िल्टर, आदि या वह बच्चों को ऑब्जेक्ट करता है। मेरा मानना ​​है कि इसके लिए एक अलग कॉल है, हालांकि।
    इसके अलावा, आप अन्य GameObject के घटकों का उपयोग करने के लिए इस का उपयोग करें यदि आप उन्हें पहली संदर्भ (नीचे दिखाई देते हैं) कर सकते हैं।

समाधान:

मैं awake समारोह में एक tag खोज करने की सिफारिश करेंगे।

private LevelManager levelManager; 

void Awake() { 
    levelManager = GameObject.FindGameObjectWithTag ("manager").GetComponent<LevelManager>(); 
} 

टैग जोड़कर उस पर स्क्रिप्ट LevelManager साथ GameObject टैग करने के लिए मत भूलना। (GameObject क्लिक करें, निरीक्षक के शीर्ष पर हैं, और Tag- क्लिक करें> जोड़ें टैग

आप ऐसा कर सकते हैं, या

public LevelManager levelManager; 

करना और निरीक्षक में बॉक्स में GameObject खींचें।

या तो विकल्प काफी एक GameObject.FindObjectOfType कर से बेहतर है।

आशा है कि यह

5

दो मतभेद रहे हैं। GameObject.FindObjectOfType<T> दूसरी ओर पूरे पदानुक्रम खोजता है और पहली वस्तु से मेल खाता है देता है!

2.) GetComponent<T> केवल 0 ऑब्जेक्ट लौटाता है जो Component से प्राप्त होता है, जबकि GameObject.FindObjectOfType<T> वास्तव में परवाह नहीं करता है।

+1

@ क्रिप्टोस, 'ऑब्जेक्ट' से आपका क्या मतलब है? 'GetComponent '? यह पहला घटक लौटाएगा, जो संभवतः एक मोनोबेवियर है और यह अभी भी 'घटक' से विरासत में है। – walther

+1

दिलचस्प बात यह है कि 'GetComponent ' 'GameObject' का पहला घटक लौटाएगा (जो हमेशा 'ट्रांसफॉर्म' होना चाहिए)। यह भी ध्यान रखें कि 'FindObjectOfType ' को 'GameObject' में परिभाषित नहीं किया गया है, लेकिन' ऑब्जेक्ट '(जो यूनिटी एपीआई में किसी भी अन्य वर्ग के लिए रूट क्लास है) में है, ताकि आप वास्तव में इसके साथ कुछ भी पा सकें। – Kryptos

+1

@ क्रिप्टोस, मुझे लगता है कि 'ट्रांसफॉर्म' एक विशेष प्रकार का घटक है, क्योंकि आप इसे हटा नहीं सकते हैं, इसलिए शायद यही 'GetComponent ' द्वारा छोड़ा जाता है। शायद कोई भी GetComponent वैसे भी किसी भी ट्रांसफॉर्म (या ईमानदार होने के लिए कोई अन्य घटक) संदर्भित करने का प्रयास नहीं करेगा। – walther

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