मुझे vars का नाम बदलने के लिए (स्पष्टता के लिए):
Vector3 pos3d = new Vector3 (1f, 2f, 3f);
Vector2 pos2d = new Vector2 (1f, 2f);
उत्तर
यह pos3d + pos2d
लाइन के सेक्शन के कारण है। यह हिस्सा वास्तव में अस्पष्ट है जबकि +=
ऐसा नहीं है। मुझे स्पष्ट करें कि एक क्यों और दूसरा क्यों।
विश्लेषण 1
इस लाइन में
transform.position = pos3d + pos2d;
संकलक pos3d + pos2d
आगे बढ़ने से पहले अभिव्यक्ति का मूल्यांकन करने की कोशिश करता है , भले ही परिणाम कहां रखा जाए।
ऐसा करने के लिए, सिस्टम पहले किसी भी सार्वजनिक स्थैतिक फ़ंक्शन को खोजने की कोशिश करता है जो एक वेक्टर 3 और एक वेक्टर 2 जोड़ता है, उदाहरण के लिए यह संभव हस्ताक्षर:
public static Vector3 operator +(Vector3 a, Vector2 b);
या उदाहरण के लिए यह संभव हस्ताक्षर:
public static Vector2 operator +(Vector3 a, Vector2 b);
फिर भी एपीआई में उन हस्ताक्षरों में से कोई भी नहीं है, इसलिए संकलक ज्ञात हस्ताक्षर करने के मापदंडों को "कास्ट" करने की कोशिश करता है।
फिर संकलक उन दो संभावित हस्ताक्षर पाता है:
public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);
ये यहाँ प्रलेखित हैं:
http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html
और यहाँ:
http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html
तो दो संभावनाएँ हैं:
तो जैसा कि दोनों कास्टिंग संभव है, पॉस 2d को वेक्टर 3 में डाला जा सकता है और पॉस 3 डी को एक वेक्टर 2 में डाला जाता है, कंपाइलर फिर उसी स्रोत कोड को संकलित करने के संभावित तरीकों का पता लगाता है (बशर्ते स्वचालित छिपी हुई कास्टिंग हो)।
पॉस 3 डी को वेक्टर 2 में डालना और दूसरे हस्ताक्षर के साथ आगे बढ़ना संभव है, या तो वेक्टर 3 में पॉज़ 2 डी डालें और पहले हस्ताक्षर के साथ आगे बढ़ें।
जैसा कि अभिव्यक्ति pos3d + pos2d
का मूल्यांकन पहले किया जाता है, ध्यान में रखने से पहले "जहां परिणाम लागू किया जाएगा" तब कंपाइलर को यह नहीं पता होगा कि आप किस कास्ट करेंगे-कोडर- जैसे कि यह प्रदर्शन करना है।
यदि आप 3D की ओर बढ़ना चाहते हैं, तो आप इसे लिख सकते हैं:
transform.position = pos3d + ( Vector3 )pos2d;
और समस्या दूर हो गई है, जैसा कि अब स्पष्ट है: पहले वेक्टर 2 को एक अन्य प्रकार की वेक्टर 3 में स्थानांतरित करें, फिर वेक्टर 3 + वेक्टर 3 का योग करें। बशर्ते कि यह स्थिर हस्ताक्षर हो
public static Vector3 operator +(Vector3 a, Vector3 b);
उपलब्ध है, कि कोई भी अस्पष्टता के साथ प्रयोग किया जाएगा।
विश्लेषण २
दूसरी ओर, जब आप करते हैं
transform.position = pos3d;
transform.position += pos2d;
कोई अस्पष्टता नहीं है: पहली पंक्ति एक वेक्टर 3 को एक वेक्टर 3 (कोई संदेह नहीं) बताती है।
दूसरी पंक्ति के बराबर है
transform.position = transform.position + pos2d;
विशेषता के साथ ट्रांसफॉर्मेशन। केवल एक बार मूल्यांकन किया जाता है, और इसलिए इस प्रकार को ध्यान में रखा जाता है, जैसा कि आप +=
ऑपरेटर के बारे में इस Microsoft पृष्ठ में देख सकते हैं :
https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
इसके अतिरिक्त यह कहता है कि "+ = ऑपरेटर को सीधे ओवरलोड नहीं किया जा सकता है, लेकिन उपयोगकर्ता-परिभाषित प्रकार + ऑपरेटर (देखें)) को ओवरलोड कर सकते हैं।" इसलिए हमें लगता है चाहिए Vector3
के +=
ऑपरेटर के रूप में माइक्रोसॉफ्ट द्वारा वर्णित जहां लिखा है कि कार्य करता है:
x += y
के बराबर है
x = x + y
सिवाय इसके कि एक्स का केवल एक बार मूल्यांकन किया जाए। + ऑपरेटर का अर्थ x और y के प्रकारों पर निर्भर करता है (संख्यात्मक ऑपरेंड के लिए इसके अलावा, स्ट्रिंग ऑपरेंड्स के लिए संक्षिप्तिकरण, और इसके बाद)।
इसलिए हम सुनिश्चित कर सकते हैं कि दूसरा दृष्टिकोण Vector3
वर्ग के + ऑपरेंड को आमंत्रित करता है , जिस पर हस्ताक्षर हैं:
public static Vector3 operator +(Vector3 a, Vector3 b);
इसलिए इसे प्राप्त करने के लिए कोई अन्य तरीका नहीं है, क्योंकि यह एक वेक्टर 3 में पॉस 2 डी को परिवर्तित करने के बजाय एक अंतर्निहित छिपी कास्ट के लिए है जो किसी अन्य रूप में नहीं हो सकता है।
मदद की उम्मीद है !!
संपादित करें
में Unity 5.0.1f1 Personal
साथ MonoDevelop-Unit 4.0.1
, एलेक्स एम कहते हैं, लाइनों:
transform.position = pos3d;
transform.position += pos2d;
अभी भी त्रुटि डाली "Assets/Scripts/CubeScript.cs(15,27): error CS0121: The call is ambiguous between the following methods or properties: 'UnityEngine.Vector2.operator +(UnityEngine.Vector2, UnityEngine.Vector2)' and 'UnityEngine.Vector3.operator +(UnityEngine.Vector3, UnityEngine.Vector3)'"
इसलिए वास्तव में + = दोनों हस्ताक्षरों का उपयोग कर रहा है
public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);
इस तथ्य की परवाह किए बिना कि "पहले से ही" जहां "परिणाम रखा जाएगा (मुझे लगता है क्योंकि एक वेक्टर 2 का उत्पादन गंतव्य (वेक्टर 3) के लिए अनुकूल है और अगर वह संभव नहीं था, तो शायद, कंपाइलर उचित के साथ एक का चयन करेगा। उत्पादन का प्रकार)।
इस बिंदु के लिए धन्यवाद एलेक्स एम।