Varsları yeniden adlandırmama izin verin (açıklık için):
Vector3 pos3d = new Vector3 (1f, 2f, 3f);
Vector2 pos2d = new Vector2 (1f, 2f);
Cevap
Bunun nedeni pos3d + pos2d
hattın bölümüdür . Bu kısım gerçekten belirsiz olsa da +=
. Neden birini, neden diğerini açıklayayım.
Analiz 1
Bu hatta
transform.position = pos3d + pos2d;
derleyici pos3d + pos2d
, sonucun nereye yerleştirileceğine bakılmaksızın, devam etmeden önce ifadeyi değerlendirmeye çalışır .
Bunu yapmak için, sistem önce bir Vector3 artı Vector2 ekleyen genel statik fonksiyonları bulmaya çalışır, örneğin bu olası imza:
public static Vector3 operator +(Vector3 a, Vector2 b);
veya örneğin bu olası imza:
public static Vector2 operator +(Vector3 a, Vector2 b);
Bununla birlikte, API'da bu imzalardan herhangi biri yoktur, bu nedenle derleyici parametreleri bilinen imzalara "aktarmaya" çalışır.
Derleyici bu iki olası imzayı bulur:
public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);
Bunlar burada belgelenmiştir:
http://docs.unity3d.com/ScriptReference/Vector3-operator_add.html
ve burada:
http://docs.unity3d.com/ScriptReference/Vector2-operator_add.html
Yani iki olasılık var:
Her iki dökümün de mümkün olması nedeniyle, pos2d bir Vector3'e dökülebilir ve pos3d bir Vector2'ye castabale olur, daha sonra derleyici aynı kaynak kodunu derlemenin olası yollarını bulur (otomatik gizli dökümler mevcutsa).
Pos3d'yi Vector2'ye dökmek ve ikinci imzayla devam etmek ya da pos2d'yi Vector3'e dökmek ve ilk imzayla devam etmek mümkündür.
İfade pos3d + pos2d
ilk olarak değerlendirilirken, "sonucun nereye uygulanacağı" dikkate alınmadan önce, derleyici hangi kodlamayı gerçekleştireceğinizi bilmez.
3D'ye geçmek istiyorsanız, şunu yazabilirsiniz:
transform.position = pos3d + ( Vector3 )pos2d;
ve sorun giderildi, şimdi açık olduğu gibi: önce pos2d'yi Vector3 türünde başka bir nesneye taşıyın, sonra Vector3 + Vector3 toplamını yapın. Bu statik imza varsa,
public static Vector3 operator +(Vector3 a, Vector3 b);
hiç bir belirsizlik olmadan kullanılacak.
Analiz 2
Öte yandan,
transform.position = pos3d;
transform.position += pos2d;
belirsizlik yoktur: İlk satır Vector3'e bir Vector3 atar (şüphesiz).
İkinci satır
transform.position = transform.position + pos2d;
transform.position özelliğiyle yalnızca bir kez değerlendirilir ve bu nedenle bu Microsoft sayfasında +=
operatörle ilgili gördüğünüz gibi tür dikkate alınır :
https://msdn.microsoft.com/en-us/library/sa7629ew.aspx
Buna ek olarak "+ = operatörü doğrudan aşırı yüklenemez, ancak kullanıcı tanımlı tipler + operatörünü aşırı yükleyebilir (operatöre bakın). Düşündüğümüz bu yüzden Vector3
'ın +=
operatör yazan yere microsoft tarafından açıklandığı gibi davranır:
x += y
eşittir
x = x + y
ancak x sadece bir kez değerlendirilir. + İşlecinin anlamı, x ve y türlerine (sayısal işlenenler için toplama, dize işlenenleri için birleştirme vb.) Bağlıdır.
bu yüzden ikinci yaklaşımın Vector3
imzası olan sınıfın + işleneni çağırdığından emin olabiliriz :
public static Vector3 operator +(Vector3 a, Vector3 b);
bu nedenle bunu başarmanın başka bir yolu bulunmayan örtülü gizli döküm sayesinde pos2d'yi Vector3'e dönüştürmekten başka bir yol yoktur.
Yardım etmek için umut !!
Düzenle
In Unity 5.0.1f1 Personal
ile MonoDevelop-Unit 4.0.1
Alex M. dediği gibi, hatları:
transform.position = pos3d;
transform.position += pos2d;
hala hatayı veriyor "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)'"
yani + = her iki imzayı da kullanıyor
public static Vector3 operator +(Vector3 a, Vector3 b);
public static Vector2 operator +(Vector2 a, Vector2 b);
sonucun "nereye" konacağını bilmesine bakılmaksızın (sanırım bir Vector2 çıktısı hedefe dökülebilir (Vector3) ve eğer bu döküm mümkün değilse, belki, derleyici uygun olanı seçecektir çıktı türü).
Puanınız için teşekkürler Alex M.